MySQL主主复制新增需同步表后,历史数据未同步的解决方法
问题
现有3台服务器组成的MySQL主主复制集群,所有服务器互相连通。当前仅复制数据库db中80张表里的10张,通过MySQL配置文件的replicate-do-table指定需复制的表。
新增一张此前未复制的表后,添加replicate-do-table配置已实现新数据同步,但历史数据未同步,如何让该表的历史数据同步至所有服务器?
附当前MySQL配置文件内容:
default_table_encryption=ON table_encryption_privilege_check=ON replica_parallel_workers=4 enforce_gtid_consistency=ON gtid_mode=ON keyring_file_data=..... early-plugin-load=keyring_file.so skip_replica_start=OFF auto_increment_increment=50 auto_increment_offset=1 server_id=3 replicate_same_server_id=0 replicate-do-db=db replicate-do-table=db.table1 replicate-do-table=db.table2 replicate-do-table=db.table3 replicate-do-table=db.table4 replicate-do-table=db.table5 replicate-do-table=db.table6 replicate-do-table=db.table7 replicate-do-table=db.table8 replicate-do-table=db.table9 replicate-do-table=db.table10 replicate-do-table=db.table11 replicate-do-table=db.table12 slave-skip-errors=1032
解决步骤
你的集群已开启gtid_mode=ON,可以利用GTID安全同步历史数据,具体操作如下:
1. 确认所有节点复制状态正常
在每台服务器上执行以下命令,确保复制线程运行无异常、无延迟:
SHOW REPLICA STATUS\G
重点检查Slave_IO_Running和Slave_SQL_Running均为Yes,Seconds_Behind_Master为0。
2. 在数据最完整的节点导出目标表历史数据
选择存放新增表原始数据的节点(数据最完整的节点),执行导出命令:
mysqldump -u root -p --single-transaction --no-create-info --skip-add-locks db 新增表名 > target_table_data.sql
--single-transaction:InnoDB引擎下无需锁表,保证导出数据一致性--no-create-info:仅导出数据,不导出表结构(其他节点已通过复制同步表结构)--skip-add-locks:避免导入时锁表影响业务
3. 在其他节点暂停复制进程
在需要同步历史数据的另外两台服务器上,暂停复制线程:
STOP REPLICA;
4. 导入历史数据到其他节点
将导出的target_table_data.sql复制到另外两台服务器,执行导入:
mysql -u root -p db < target_table_data.sql
5. 重启复制并验证状态
在另外两台服务器上重启复制:
START REPLICA;
再次执行SHOW REPLICA STATUS\G,确认复制线程恢复正常,Seconds_Behind_Master回到0。
6. 验证数据一致性
在所有节点上查询目标表的行数和关键数据,确保数据完全一致:
SELECT COUNT(*) FROM db.新增表名;
注意事项
- 操作前建议备份所有节点的目标表,避免数据丢失
- 若表数据量较大,建议在业务低峰期执行,减少对业务的影响
- 主主集群中,禁止同时在多个节点修改目标表的历史数据,避免数据冲突
内容的提问来源于stack exchange,提问作者Amir Almian
相关产品推荐
相关产品推荐

