MySQL 并不支持 RENAME DATABASE 命令,因此要想“修改数据库名”,我们通常需要通过导出旧库 → 创建新库 → 导入数据 → 删除旧库这一流程实现。

本文将带你一步步完成将数据库从 yys_diary4 改名为 diary 的全过程,并特别讲解如何处理 GTID 相关错误(如 ERROR 3546),避免导入失败。


📋 操作目标

  • 原数据库名:yys_diary4
  • 新数据库名:diary
  • MySQL 启用了 GTID 模式(典型云数据库配置)

✅ 步骤一:导出旧数据库

使用 mysqldump 工具导出数据:

mysqldump -u root -p --set-gtid-purged=OFF yys_diary4 > yys_diary4.sql

参数解释:

  • --set-gtid-purged=OFF关键参数,防止导出的 SQL 文件包含 SET @@GLOBAL.GTID_PURGED=... 语句,避免后续导入时报错。
  • 其他可选参数:
  • --single-transaction:适用于 InnoDB,避免锁表。
  • --routines --triggers:如需备份存储过程或触发器。

✅ 步骤二:创建新数据库

登录 MySQL 创建新数据库:

CREATE DATABASE diary CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

⚠️ 错误预警:GTID 报错处理

若你导出的 SQL 文件中包含以下内容:

SET @@GLOBAL.GTID_PURGED='xxx';

在导入新库时极可能报错:

ERROR 3546 (HY000): @@GLOBAL.GTID_PURGED cannot be changed: the added gtid set must not overlap with @@GLOBAL.GTID_EXECUTED

💡 解决方法:

方法一:导出时关闭 GTID(推荐)

导出时加上:

--set-gtid-purged=OFF

方法二:手动删除 SQL 文件中的 GTID 设置

打开 .sql 文件,搜索:

SET @@GLOBAL.GTID_PURGED=...

将整行删除或注释掉:

-- SET @@GLOBAL.GTID_PURGED='xxx';

然后保存,再重新导入即可。


✅ 步骤三:导入数据到新数据库

方法一:使用 MySQL 命令行客户端

USE diary;
SOURCE /路径/yys_diary4.sql;

方法二:使用命令行

mysql -u root -p diary < yys_diary4.sql

确保 .sql 文件中的 USE old_db; 被删除或改为 USE diary;,否则数据将被导入到错误的库中。


✅ 步骤四:验证导入结果

登录 MySQL 后执行:

USE diary;
SELECT COUNT(*) FROM yys_diary;

确认数据是否导入成功(如返回 2493 条记录)。


✅ 步骤五(可选):删除旧数据库

在确保数据完整且无误的前提下,删除旧库:

DROP DATABASE yys_diary4;

请务必备份确认之后再删除!


🧠 总结

MySQL 不支持直接重命名数据库,但我们可以通过以下安全步骤实现目标:

导出旧库 → 创建新库 → 导入数据(避开 GTID 陷阱) → 验证数据 → 删除旧库

并特别注意:

  • 使用 --set-gtid-purged=OFF 导出;
  • 或在 .sql 文件中删除 SET @@GLOBAL.GTID_PURGED 语句;
  • 检查是否存在 USE old_db; 并改为目标数据库。

这样可在不重启、不停机的前提下,实现数据库安全改名。


需要我将这篇文章导出为 Markdown、HTML 或 PDF 吗?也可以为你自动生成博客封面图。