如何修改MySQL数据库名称

发布时间 2023-09-17 15:13:08作者: strongmore

需求

比如数据库名称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的使用