如何快速重命名MySQL数据库(更改其架构名称)?
通常我会将数据库导出并以新名称重新导入。但对于非常大的数据库,这不是一个选择。显然,RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
会产生问题,在少数版本中存在,并且总体上是个坏主意。
如何快速重命名MySQL数据库(更改其架构名称)?
通常我会将数据库导出并以新名称重新导入。但对于非常大的数据库,这不是一个选择。显然,RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
会产生问题,在少数版本中存在,并且总体上是个坏主意。
对于InnoDB,以下方法似乎有效:先创建新的空数据库,然后逐个将表重命名到新的数据库中:
RENAME TABLE old_db.table TO new_db.table;
之后您需要调整权限。
若要在shell中编写脚本,可以使用以下任意一种:
mysql -u username -ppassword old_db -sNe 'show tables' | while read table; \
do mysql -u username -ppassword -sNe "rename table old_db.$table to new_db.$table"; done
或者
for table in `mysql -u root -ppassword -s -N -e "use old_db;show tables from old_db;"`; do mysql -u root -ppassword -s -N -e "use old_db;rename table old_db.$table to new_db.$table;"; done;
注意事项:
-p
选项和密码之间没有空格。如果你的数据库没有密码,删除-u username -ppassword
这一部分。如果某个表有触发器,使用上述方法无法将其移动到另一个数据库(会导致“Trigger in wrong schema”错误)。如果是这种情况,请使用传统的方法克隆一个数据库,然后删除旧数据库:
mysqldump old_db | mysql new_db
如果你有存储过程,可以在之后复制它们:
mysqldump -R old_db | mysql new_db
使用这些简单的命令:
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
输入密码:输入密码:
它似乎只接受一个密码,而不是两个。我是否遗漏了什么细节? - Ryan--routines
标志添加到 mysqldump 命令中,以确保存储过程也被复制。 - Carlos P我认为解决方案更简单,一些开发人员已经提出了建议。phpMyAdmin有一个可用于此操作的功能。
从phpMyAdmin中选择要选择的数据库。在选项卡中,有一个名为“操作”的选项,转到重命名部分。就这样。
正如许多人建议的那样,它会创建一个新的数据库,并将旧数据库的所有表转储到新数据库中,然后删除旧数据库。
你可以使用SQL生成一个SQL脚本,将源数据库中的每个表传输到目标数据库。
在运行从该命令生成的脚本之前,您必须先创建目标数据库。
您可以使用以下两个脚本之一(我最初建议使用前者,但有人“改进”我的答案以使用GROUP_CONCAT
。选择其中一个即可,但我更喜欢原来的):
SELECT CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name, '; ')
FROM information_schema.TABLES
WHERE table_schema='$1';
或者SELECT GROUP_CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name SEPARATOR '; ')
FROM information_schema.TABLES
WHERE table_schema='$1';
(假设$1和$2分别是源和目标)
这将生成一条SQL命令,您需要运行该命令。
请注意,GROUP_CONCAT
具有默认长度限制,对于具有大量表的数据库可能会超过该限制。 您可以通过运行SET SESSION group_concat_max_len = 100000000;
(或其他大数值)来更改该限制。
模拟在MySQL中缺失的RENAME DATABASE
命令:
创建一个新数据库
使用以下查询创建重命名语句:
SELECT CONCAT('RENAME TABLE ',table_schema,'.`',table_name,
'` TO ','new_schema.`',table_name,'`;')
FROM information_schema.TABLES
WHERE table_schema LIKE 'old_schema';
运行输出
删除旧数据库
这段内容摘自 模拟MySQL中缺失的RENAME DATABASE命令.
#!/bin/bash
set -e # terminate execution on command failure
mysqlconn="mysql -u root -proot"
olddb=$1
newdb=$2
$mysqlconn -e "CREATE DATABASE $newdb"
params=$($mysqlconn -N -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES \
WHERE table_schema='$olddb'")
for name in $params; do
$mysqlconn -e "RENAME TABLE $olddb.$name to $newdb.$name";
done;
$mysqlconn -e "DROP DATABASE $olddb"
它正在工作:
$ sh rename_database.sh oldname newname
set -e
,这将导致执行失败时终止程序并应该缓解那个问题。 - Mikkel三个选项:
创建新的数据库,停止服务器,将文件从一个数据库文件夹移动到另一个文件夹中,并重新启动服务器。请注意,这仅适用于所有表都是MyISAM格式。
创建新数据库,使用CREATE TABLE ... LIKE语句,然后使用INSERT ... SELECT * FROM语句。
使用mysqldump命令导出数据并使用该文件进行恢复。
切换至数据库目录:
cd /var/lib/mysql/
关闭 MySQL... 这非常重要!
/etc/init.d/mysql stop
好的,这种方法不适用于InnoDB或BDB数据库。
重命名数据库:
mv old-name new-name
...对于表格...
cd database/
mv old-name.frm new-name.frm
mv old-name.MYD new-name.MYD
mv old-name.MYI new-name.MYI
重启MySQL
/etc/init.d/mysql start
完成...
好的,这种方法不适用于InnoDB或BDB数据库。在这种情况下,您必须导出数据库并重新导入它。
launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
cd /usr/local/var/mysql
mv old-name new-name
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
- coberlin最简单、可靠的重命名方式,包括在最后删除旧数据库,使其成为一个重命名而不是复制操作:
mysqladmin -uroot -pmypassword create newdbname
mysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbname
mysqladmin -uroot -pmypassword drop olddbname
步骤:
我最近才发现了一种非常好的方法,适用于MyISAM和InnoDB,并且非常快:
RENAME TABLE old_db.table TO new_db.table;
我不记得在哪里看到的,但功劳归于其他人而不是我。