由于个人能力有限,文中可能存在错误,欢迎批评指正。
1.说明
实际上,MySQL 并不直接支持重命名数据库的操作,因为数据库本身在 MySQL 中只是一个命名空间,它包含了多个表和其他数据库对象。要 “重命名” 数据库,实际上需要将数据库中的所有表逐一移动到新的数据库中。
1)需评估业务,正常情况下,业务也要停机配合;
2)需考虑相关信息的同步,如 CMDB 资产信息、平台元数据等。
2.命令示例
以下是如何使用 RENAME TABLE 语句将表从一个数据库移动到另一个数据库的示例:
RENAME TABLE old_database_name.table1 TO new_database_name.table1,
old_database_name.table2 TO new_database_name.table2,
...
old_database_name.tableN TO new_database_name.tableN;
注:ALTER TABLE … RENAME 语句可以在同一数据库内部重命名表,但它不能将表移动到另一个数据库。要做到这一点,通常需要使用 RENAME TABLE 语句,该语句允许您将表从一个数据库移动到另一个数据库。
3.测试
示例:将库名 test01 更改为 test02
# 查看原库 test01 中表信息
mysql> use test01;
Database changed
mysql> show tables;
+------------------+
| Tables_in_test01 |
+------------------+
| t1 |
+------------------+
1 row in set (0.00 sec)
# 创建新库 test02
mysql> create database test02;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test01 |
| test02 |
+--------------------+
6 rows in set (0.00 sec)
# 拼接 rename sql
mysql> select concat("rename table",' ',table_schema,'.',table_name,' ',"to",' ',"test02",'.',table_name,';') from information_schema.tables where table_schema='test01';
+-------------------------------------------------------------------------------------------------+
| concat("rename table",' ',table_schema,'.',table_name,' ',"to",' ',"test02",'.',table_name,';') |
+-------------------------------------------------------------------------------------------------+
| rename table test01.t1 to test02.t1; |
+-------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
# 执行 rename
mysql> rename table test01.t1 to test02.t1;
Query OK, 0 rows affected (0.01 sec)
# 查看结果
mysql> use test02;
Database changed
mysql> show tables;
+------------------+
| Tables_in_test02 |
+------------------+
| t1 |
+------------------+
1 row in set (0.00 sec)
4.注意事项
1)如果目标数据库不存在,RENAME TABLE 语句将失败;
2)如果目标数据库中已经存在同名的表,该语句也会失败,除非使用 FORCE 选项(但这通常不推荐,因为它会覆盖现有的表);
3)如果表有外键约束,则需要先删除这些约束,然后再重命名表;
4)重命名操作可能会因为各种原因(如权限问题、存储引擎限制、文件系统问题等)而失败;
5)如果目标数据库位于不同的文件系统中,重命名操作的成功与否取决于底层操作系统的文件移动操作。
5.更多方式
1)mysqldump
导出,再导入;
2)使用 replicate-rewrite-db
实现复制映射 + Replicate_Wild_Do_Table
实现复制过滤。