需求
比如数据库名称old_db
想改名为new_db
MySQL修改数据库名称比较麻烦,不支持直接修改,需要通过其它方式间接达到修改数据库名称的目的。
在 MySQL 5.1.23 之前的旧版本中,我们可以使用 RENAME DATABASE
来重命名数据库,但此后版本,因为安全考虑,删掉了这一命令。
先导出数据,再导入数据
当数据库体积比较小时,最快的方法是使用 mysqldump
命令来创建整个数据库的转存副本,然后新建数据库,再把副本导入到新数据库中。
先创建新库
create database new_db;
使用mysqldump导出数据
mysqldump -uroot -p123456 --set-gtid-purged=OFF old_db > /tmp/old_db.sql
仅是做普通的本机备份恢复时,可以添加
--set-gtid-purged=OFF
作用是在备份时候不出现GTID信息
导入数据到新库
mysql -uroot -p123456 new_db < /tmp/old_db.sql
通过修改表名称,间接实现修改数据库名称
使用此方法实际上将所有表从一个数据库移动到另一个数据库,这实际上重命名了该数据库(MySQL没有单个语句的操作),移动后原始数据库继续存在,但是里面没有表。
先创建新库
create database new_db;
使用RENAME TABLE 命令修改表名,将表移动到新的库里
rename table old_db.tb to new_db.tb;
完成后删除旧库
drop database old_db;
使用shell脚本来批量修改表名
#!/bin/bash
# 例如将 payment-mobile 数据库名改为 payment_mobile
mysql_path="/usr/local/mysql/bin/mysql"
username="root"
password="123456"
source_db="\`test-db\`"
source_db_where="test-db"
target_db="\`test_db\`"
${mysql_path} -u${username} -p${password} -e "create database if not exists ${target_db}"
list_table=$(${mysql_path} -u${username} -p${password} -Nse "select table_name from information_schema.TABLES where TABLE_SCHEMA='${source_db_where}'")
for table in ${list_table}
do
rename_command="rename table ${source_db}.\`${table}\` to ${target_db}.\`${table}\`"
${mysql_path} -u${username} -p${password} -e "${rename_command}"
done
注意,数据库名和表名最好使用``包裹,避免包含特殊字符如-
,where语句中的值不能包裹。
- -e, --execute=name # 执行mysql的sql语句
- -N, --skip-column-names # 不显示列信息
- -s, --silent # 一行一行输出,中间有tab分隔
总结
导出数据再导入的方式在数据量很大的情况下会很慢,但很安全。
修改表名的方式很安全和快速,但修改之后原有的数据库立刻就不能使用了,不能平滑的过渡。
参考
如何修改MySQL数据库名称
三种方式修改 MySQL 数据库名
mysqldump关于--set-gtid-purged=OFF的使用