开发和排查问题过程中,经常用到线上数据库,那么就会经常复制数据库。
在复制后执行sql导入数据库的时候,报错:@@GLOBAL.GTID_PURGED cannot be changed: the added gtid set must not overlap with @@GLOBAL.GTID_EXECUTED。
这是mysql5.6及以后的新特性GTID。
GTID即全局事务ID(global transaction identifier),GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增,所以GTID能够保证每个MySQL实例事务的执行(不会重复执行同一个事务,并且会补全没有执行的事务)。
处理办法
- 重新 dump 数据库, 使用
--set-gtid-purged=OFF
的参数禁止🚫导出 GTID 信息,再 load 进目标数据库 - 在目标数据库中执行
mysql> reset slave all;
mysql> reset master;
清空所有 GTID 信息之后就可以导入了