MySQL手册中有介绍。

通常我只是转储数据库并用一个新名称重新导入它。这不是非常大的数据库的一个选项。重命名数据库| SCHEMA} db_name TO new_db_name做坏事,只存在于少数版本中,总的来说是个坏主意。

这需要与InnoDB一起工作,InnoDB存储的东西与MyISAM非常不同。


当前回答

在从包含多个数据库的转储文件开始的情况下,您可以对转储执行sed:

sed -i -- "s|old_name_database1|new_name_database1|g" my_dump.sql
sed -i -- "s|old_name_database2|new_name_database2|g" my_dump.sql
...

然后导入您的转储。只要确保没有名称冲突即可。

其他回答

当您在PHPMyAdmin中重命名数据库时,它会创建一个转储,然后删除并使用新名称重新创建数据库。

我提出了一个关于服务器故障的问题,试图在使用MySQL代理恢复非常大的数据库时解决停机时间。我没有取得任何成功,但我最终意识到我想要的是RENAME DATABASE功能,因为由于数据库的大小,转储/导入不是一个选项。

MySQL有一个内置的RENAME TABLE功能,所以我最终写了一个简单的Python脚本来为我做这项工作。我把它发布在GitHub上,以防它对其他人有用。

我最近才发现了一个很好的方法,使用MyISAM和InnoDB,而且非常快:

RENAME TABLE old_db.table TO new_db.table;

我不记得我在哪里读到的,但功劳归于别人,而不是我。

下面是一行Bash代码片段,用于将所有表从一个模式移动到另一个模式:

history -d $((HISTCMD-1)) && mysql -udb_user -p'db_password' -Dold_schema -ABNnqre'SHOW TABLES;' | sed -e's/.*/RENAME TABLE old_schema.`&` TO new_schema.`&`;/' | mysql -udb_user -p'db_password' -Dnew_schema

开始时的history命令只是确保包含密码的MySQL命令不会保存到shell历史记录中。

确保db_user对旧模式具有读/写/删除权限,对新模式具有读/写/创建权限。

使用以下几个简单的命令:

mysqldump -u username -p -v olddatabase > olddbdump.sql
mysqladmin -u username -p create newdatabase
mysql -u username -p newdatabase < olddbdump.sql

或者使用@Pablo Marin-Garcia建议的以下方法来减少I/O:

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase