这个坑值得记一笔。把备份恢复到新实例时中途报错,提示事务标识已存在,导入停在半途,数据不完整。

把日志和配置对完,能解释这个现象的基本就这几处。目标实例已经执行过相同标识的事务;备份包含建库语句但目标库已存在;恢复时没有关闭标识检查。

先确认目标实例的标识状态

mysql -e 'show variables like \"gtid_mode\"'

再往下导入前关闭标识检查

mysql -e 'set global gtid_purged=\"\"'

接着用跳过检查的方式导入

mysql --force -u root -p 库名 < /data/bak.sql

剩下的就是导入后逐表核对行数

mysql -e 'select table_name,table_rows from information_schema.tables where table_schema=\"库名\"'

当时还开着另一个排查窗口,两边日志对照着看才定位到。

同一份数据我导出了两份,一份留底,一份拿来试。

怎么算真的好了,看的是同一批现象。导入完整结束,各表行数与源库一致,业务查询正常。

带强制参数导入会忽略错误继续跑,可能留下不完整的表;恢复完成后必须逐表核对,不能只看命令是否结束。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189