如何解决MariaDB中replicaDB与masterDB的id=159记录同步缺失问题
MySQL主从同步异常:id=159记录未同步问题
问题背景
操作流程:
- 在主库(192.168.30.123)执行
FLUSH TABLES WITH READ LOCK; - 使用
mysqldump命令制作todo库备份 - 将备份导入从库(192.168.30.131)
- 从库执行
RESET SLAVE;、CHANGE MASTER TO命令,启动同步:START SLAVE; - 主库执行
UNLOCK TABLES;
异常现象:初始备份完成后主从数据一致,但解锁后主库定时任务插入的id=159记录未同步到从库,id=160及之后的记录同步正常。
主从库配置
主库(192.168.30.123)配置
[mysqld] bind-address = 0.0.0.0 binlog_format = ROW max_binlog_size = 128M expire_logs_days = 7 log-error=/var/log/mysql/error.log log-bin-trust-function-creators = true log-bin binlog-format = mixed log-basename =master server_id = 1 log_bin = /var/log/mysql/mysql-bin.log
从库(192.168.30.131)配置
[mysqld] bind-address = 0.0.0.0 binlog_format = ROW max_binlog_size = 128M expire_logs_days = 7 log-error=/var/log/mysql/error.log log-bin-trust-function-creators = true server_id = 5 slave-skip-errors = all replicate-do-db = todo read_only = ON log_bin = mysql-bin rpl_semi_sync_slave_enabled=ON
附从库数据记录截图及SHOW SLAVE STATUS\G截图。
排查与解决建议
排查步骤
验证主库binlog记录
在主库执行SHOW BINLOG EVENTS IN 'mysql-bin.xxxx'(替换为备份时对应的binlog文件名),确认id=159的插入事件是否被正常记录。核对从库同步起始位点
查看从库SHOW SLAVE STATUS\G输出中的Master_Log_File和Read_Master_Log_Pos,确认同步起始位点是否跳过了id=159所在的binlog片段。检查复制规则过滤
从库配置了replicate-do-db = todo,需确认定时任务插入记录时的当前数据库是否为todo。若插入语句使用USE 其他数据库; INSERT INTO todo.表名 ...的形式,该语句会被复制规则过滤,导致无法同步。排查半同步复制影响
从库开启了半同步复制,但主库未配置rpl_semi_sync_master_enabled=ON,可能导致主库事务提交未等待从库确认,出现事件丢失或延迟。
临时修复方案
若确认id=159记录仅存在于主库,可手动同步:
- 主库导出记录:
mysqldump -u 用户名 -p todo 表名 --where="id=159" > fix_159.sql - 从库导入记录:
mysql -u 用户名 -p todo < fix_159.sql
预防措施
- 备份时记录同步位点:执行
FLUSH TABLES WITH READ LOCK;后,立即执行SHOW MASTER STATUS;记录File和Position,在从库CHANGE MASTER TO时指定该位点,避免备份期间的事件遗漏。 - 统一binlog格式:主库同时配置了
ROW和mixed两种binlog格式,建议统一为ROW格式,避免格式切换引发的复制异常。 - 完善半同步配置:主库开启
rpl_semi_sync_master_enabled=ON,并设置合理的超时时间(如rpl_semi_sync_master_timeout=10000),确保事务提交能得到从库的确认。
内容的提问来源于stack exchange,提问作者hekke
相关产品推荐
相关产品推荐

