答案:线上主从数据不一致时,应先止损、再定位原因,根据不一致范围选择修复策略。常见原因包括复制延迟、复制错误(如从库误操作、表结构不一致)、配置不当等。定位可通过SHOW SLAVE STATUS、错误日志、pt-table-checksum等工具进行。小范围不一致可手动修复或跳过错误;中等范围推荐使用pt-table-sync自动修复;大范围或严重不一致则需全量同步重建从库。修复后需验证复制状态并持续监控。

线上主从数据不一致,这事儿挺让人头疼的,但排查和修复其实有一套相对固定的思路。核心在于:先止损,然后定位问题根源,接着根据问题的范围和性质选择合适的修复策略,最后验证并恢复。通常,不一致的原因无非是复制延迟、复制错误或者配置不当,而修复则从小范围手动修正到大范围全量同步都有可能。
当线上出现主从数据不一致时,我的处理流程通常是这样的:
立即止损,避免问题扩大:
STOP SLAVE SQL_THREAD;
初步诊断,了解不一致的现状:
SHOW SLAVE STATUS\G
Seconds_Behind_Master
Last_SQL_Error
Last_IO_Error
Relay_Log_File
Relay_Log_Pos
Master_Log_File
Read_Master_Log_Pos
Exec_Master_Log_Pos
Last_SQL_Error
定位不一致的具体范围和原因:
Last_SQL_Error
pt-table-checksum
选择修复策略并执行:
pt-table-checksum
UPDATE
DELETE
INSERT
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE;
pt-table-sync
pt-table-checksum
pt-table-sync
xtrabackup
恢复与持续监控:
START SLAVE;
SHOW SLAVE STATUS\G
Seconds_Behind_Master
Last_SQL_Error
线上主从数据突然不一致,通常不是平白无故发生的,背后总有那么几个“罪魁祸首”。在我多年的经验里,最常见的几类问题是:
1. 复制延迟导致的数据“暂时”不一致: 这可能是最常见的一种情况,但它严格来说是一种“滞后”,而不是永久性不一致。
ALTER TABLE
2. 复制错误导致的数据“永久”不一致: 这类问题才是真正让人头疼的,因为它们会导致数据逻辑上的错误。
INSERT
UPDATE
DELETE
UUID()
NOW()
3. 配置不当或环境差异:
auto_increment
auto_increment_increment
auto_increment_offset
my.cnf
sql_mode
定位主从不一致的表和行,是解决问题的第一步,也是最关键的一步。我通常会结合几种方法来“侦查”:
SHOW SLAVE STATUS\G
Last_SQL_Error
数据库错误日志(Error Log):更详细的线索 当
SHOW SLAVE STATUS
pt-table-checksum
pt-table-checksum --recursion-method=dsn=h=<master_host>,P=<master_port>,u=<user>,p=<password> --databases=<db_name> --check-replication-filters h=<slave_host>,P=<slave_port>,u=<user>,p=<password>
DIFF
OK
mysqlbinlog
SHOW SLAVE STATUS
Exec_Master_Log_Pos
Last_SQL_Error
mysqlbinlog
mysqlbinlog --start-position=<Exec_Master_Log_Pos> --stop-position=<Exec_Master_Log_Pos + 某个范围> <master_binlog_file>
手动比对(针对小范围):直观但效率低 对于那些你已经怀疑可能出问题的表,如果数据量不大,可以尝试手动比对。
COUNT(*)
MAX(id)
MIN(id)
DIFF
修复主从不一致,没有一劳永逸的“银弹”,需要根据不一致的范围、严重程度以及对业务的影响来选择最合适的策略。
跳过错误(SET GLOBAL SQL_SLAVE_SKIP_COUNTER
SHOW SLAVE STATUS
Last_SQL_Error
STOP SLAVE SQL_THREAD;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
DELETE
DELETE
手动修复:精准但耗时
pt-table-checksum
UPDATE
INSERT
DELETE
使用pt-table-sync
pt-table-sync
pt-table-checksum
--execute
--sync-to-master
全量同步(重建从库):彻底的“重置”
xtrabackup
pt-table-checksum
pt-table-sync
Seconds_Behind_Master
Last_SQL_Error
以上就是线上出现主从数据不一致,如何排查并修复?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号