Skip to content

背景

这次问题的核心是把旧库 liuwapocketmap 迁移成新库 liuwadi

同时需要把旧表前缀 lwpm_ 改成新表前缀 lwd_

迁移目标不是重新造一套空表再导数据。

迁移目标是保留原有数据、主键、索引、自增值和表关系。

最重要的认知

MySQL 不推荐直接重命名数据库。

正确方式是创建一个新的空数据库。

然后把旧库里的表整体移动到新库。

移动表时顺便修改表名。

这个动作应该使用 RENAME TABLE 完成。

CREATE DATABASE 只会创建一个空库。

创建新库不会删除旧库数据。

只要不执行 DROP DATABASE liuwapocketmap,旧库数据就还在。

为什么不能直接重新建表再导数据

重新建表再导数据容易出现字段不一致。

重新建表再导数据容易遇到外键顺序问题。

重新建表再导数据可能导致自增值、索引、约束和触发器不一致。

重新建表再导数据也容易在 DBeaver Data Transfer 中触发 TRUNCATE 和外键冲突。

所以这次更适合走整体迁表方案。

为什么之前会遇到外键问题

TRUNCATE 不只是看表里有没有数据。

只要一张表被其他表的外键引用,MySQL 就可能禁止 TRUNCATE

即使目标表是空表,外键结构存在也会拦截。

所以数据库工具里的 Truncate before load 很容易导致失败。

这种情况下不要用右键清表或 Data Transfer 自动清表。

为什么需要 root 账号

应用账号通常只拥有旧库内部权限。

应用账号一般不能创建新库。

应用账号一般不能跨库移动表。

应用账号也不能给新数据库授权新用户。

所以数据库重命名和跨库迁移应该使用 root 或高权限账号执行。

正确迁移思路

第一步是停止应用服务,避免迁移时还有新数据写入旧库。

第二步是确认旧库数据还在。

第三步是创建新数据库 liuwadi

第四步是确认新数据库是空库。

第五步是删除旧库中依赖旧表名的视图和触发器。

第六步是生成 RENAME TABLE 迁移语句。

第七步是把 liuwapocketmap.lwpm_* 整体移动成 liuwadi.lwd_*

第八步是检查新库中的数据量是否和旧库一致。

第九步是在新库中重建触发器。

第十步是在新库中重建视图。

第十一步是创建并授权新的应用账号 liuwadi

第十二步是修改应用环境变量连接新库。

第十三步是重启应用并验证接口。

第十四步是确认线上运行正常后再考虑删除旧库。

表名迁移关系

liuwapocketmap.lwpm_client 会变成 liuwadi.lwd_client

liuwapocketmap.lwpm_place 会变成 liuwadi.lwd_place

liuwapocketmap.lwpm_post 会变成 liuwadi.lwd_post

liuwapocketmap.lwpm_tag 会变成 liuwadi.lwd_tag

所有 lwpm_ 开头的业务表都应该统一改成 lwd_ 开头。

migrations 表一般可以保留原名。

触发器处理思路

旧触发器依赖旧表名。

迁表前应该先删除旧触发器。

迁表后应该在新库里重建新触发器。

trg_lwpm_place_bi_geo 应该改成 trg_lwd_place_bi_geo

trg_lwpm_place_bu_geo 应该改成 trg_lwd_place_bu_geo

触发器逻辑本身可以保持不变。

视图处理思路

旧视图依赖旧表名。

迁表前应该先删除旧视图。

迁表后应该在新库里重建新视图。

lwpm_v_public_places 应该改成 lwd_v_public_places

lwpm_v_public_posts 应该改成 lwd_v_public_posts

视图内部引用的表名也要全部从 lwpm_ 改成 lwd_

权限处理思路

旧账号 liuwapocketmap 只适合访问旧库。

新库最好创建新账号 liuwadi

新账号只授权访问 liuwadi.*

应用配置也应该同步改成新库名、新用户名和新密码。

这样后续维护更清晰。

风险控制

迁移前不要删除旧库。

迁移中不要使用 Data Transfer 反复导入。

迁移中不要手动新建一套 lwd_* 空表。

迁移中不要随便 TRUNCATE 有外键关系的表。

迁移后先验证数据量。

迁移后再验证视图。

迁移后再验证触发器。

迁移后最后验证应用功能。

旧库应该等应用稳定运行后再删除。

最终结论

这次数据库迁移的核心不是复制数据。

这次数据库迁移的核心是创建新库并整体移动旧表。

CREATE DATABASE 负责准备新库。

RENAME TABLE 负责保留数据并完成表名迁移。

重建触发器和视图负责修复旧表名依赖。

重新授权账号负责让应用连接新库。

确认应用正常后才能清理旧库。

本站总访问