重新同步 MySQL 从库以修复数据一致性,核心是停止复制、重置从库状态、重建主从关系。关键不在于“快”,而在于“准”——确保主库当前状态被完整、无误地复制到从库。
确认主从不一致的具体位置
先别急着重做,定位问题是前提:
用SHOW SLAVE STATUS\G查看
Seconds_Behind_Master、
SQL_Delay、
Slave_SQL_Running_State,判断是延迟、中断还是已错位 对比主从的
SHOW MASTER STATUS(主)和
SHOW SLAVE STATUS中的
Master_Log_File与
Read_Master_Log_Pos,看是否指向同一 binlog 位置 若怀疑数据行不一致,可用
pt-table-checksum(Percona Toolkit)在主库运行校验,再用
pt-table-sync生成修复语句(慎用于生产)
停用并清理旧复制通道
安全起见,先彻底停止并清除当前可能出错的复制链路:
在从库执行:STOP SLAVE;清空中继日志:
RESET SLAVE ALL;(MySQL 5.7+ 推荐,会清除 master.info、relay-log.info 等所有复制元数据) 删除残留 relay log 文件(可选,
RESET SLAVE ALL已自动处理,但可手动检查
ls -l /var/lib/mysql/relay*确认)
基于一致快照重建从库
最可靠的方式是从主库导出一个带 binlog 位置的逻辑快照,再导入从库:
在主库加全局读锁(短时间):FLUSH TABLES WITH READ LOCK;立即记录当前 binlog 位置:
SHOW MASTER STATUS;记下
File和
Position用
mysqldump导出(含
--master-data=2自动写入 CHANGE MASTER 语句):
mysqldump --all-databases --single-transaction --master-data=2 -u root -p > full_dump.sql解锁:
UNLOCK TABLES;将
full_dump.sql传至从库,清空原数据(如非全新实例,先
DROP DATABASE或重装 datadir),再导入:
mysql -u root -p
配置并启动新复制
导入完成后,用之前记下的 binlog 位置启动复制:
在从库执行:CHANGE MASTER TO<br> MASTER_HOST='主库IP',<br> MASTER_USER='repl',<br> MASTER_PASSWORD='xxx',<br> MASTER_PORT=3306,<br> MASTER_LOG_FILE='mysql-bin.000001',<br> MASTER_LOG_POS=12345;启动复制:
START SLAVE;验证:
SHOW SLAVE STATUS\G中
Slave_IO_Running和
Slave_SQL_Running均为
Yes,且
Seconds_Behind_Master逐步归零
不复杂但容易忽略:整个过程需确保主库 binlog 格式为
ROW(
binlog_format=ROW),否则某些 DML 操作无法被准确重放;另外,从库
server_id必须与主库及其他从库不同,且不能为 0。
