本文共 1273 字,大约阅读时间需要 4 分钟。
在数据库迁移或复制过程中,GTID(全局事务标识符)相关问题常常会导致复制失败。本文将详细分析此问题及其解决方法。
当我们在主机重启后,尝试启动复制时,常会遇到以下错误:
START SLAVE
命令执行失败。此问题与MySQL的GTID复制机制有关。具体来说,是GTID执行记录表 (mysql.gtid_executed
) 的状态没有正确迁移,导致新主机无法正常读取并应用binlog文件。
在MySQL 5.7及以后版本中,GTID复制已进行了优化:
log-slave-updates
选项。gtid_executed
表来记录已执行的事务。binlog_switch
或mysql shutdown
事件触发时更新。由于在源库执行mysqldump
时,gtid_executed
表的数据被完整导出至目标库。在主机重启后,新库尝试根据gtid_executed
表状态读取binlog文件,但由于表未及时更新,导致binlog应用错误,进而引发复制失败。
为了避免上述问题,可以在mysqldump
时对gtid_executed
表进行忽略:
mysqldump --ignore-table=mysql.gtid_executed ... > XXX.sql
或者,使用-F
选项触发gtid_executed
表的更新:
mysqldump --single-transaction --master-data=2 -A --flush-privileges ... > XXX.sql
在源库执行 mysqldump:
mysqldump --single-transaction --master-data=2 -A --flush-privileges > source.sql
在目标库执行操作:
STOP SLAVE;RESET MASTER;RESET SLAVE ALL;source source.sql;FLUSH PRIVILEGES;CHANGE MASTER TO ... MASTER_AUTO_POSITION=1;START SLAVE;
验证复制状态:确保所有SLAVE节点均正常运行,并且SHOW SLAVE STATUS
显示Relay_log Masters
为空。
mysqldump
时,务必确保gtid_executed
表未被修改。GTID复制问题往往与GTID执行记录表的状态有关。在mysqldump
时,通过忽略或更新gtid_executed
表,可以有效避免复制错误。MySQL 5.7及以后版本的优化使得这一问题得到了有效解决,确保GTID复制过程的稳定性。
转载地址:http://olffk.baihongyu.com/