怎么保证 MySQL 主从一致性?怎么判断不一致?
当时的解析是:
保证 MySQL 主从一致性的方法:
保证主从的配置一致
Binlog使用Row格式
使用GTID复制
从库设置Read Only
可以通过pt-table-checksum来校验主从的数据是否有不一致的情况
最近,跟几位星友把这个面试题的解析进行了优化,如下:
保证 MySQL 主从一致性的方法:
1) Binlog使用Row格式
避免语句里有随机函数而导致主从数据不一致的情况
binlog_row_image = FULL,确保记录完整数据镜像(@蓝梦 补充)
2) 使用GTID复制
便于准确追踪、切换。
3) 从库设置Read Only
避免在从库误写导致的不一致。
@sky 补充,需要设置super_read_only会更好。确实,这样从库写入数据的可能性更低。
4) 开启半同步复制
降低主宕机时丢事务的风险
5) 开启双一
增加事务安全性
6) 日志校验
主:binlog_checksum=CRC32、master_verify_checksum=ON;
从:slave_sql_verify_checksum=ON
binlog_checksum,这个参数用于设置Binlog的校验算法,设置为CRC32,MySQL 会对每个写入的 binlog 事件生成一个 CRC32 校验和,并将该校验和附加到事件的末尾。这样可以确保 binlog 内容在传输过程中没有被损坏。
master_verify_checksum,主库会在写入每个 binlog 事件之前计算该事件的校验和,并在事件的末尾附加该校验值;
slave_sql_verify_checksum,启用从库 SQL 线程的 binlog 校验。当设置为 ON 时,从库在接收到主库的 binlog 事件并应用它时,会对 binlog 事件进行 校验和验证。如果从库收到的 binlog 事件校验和与事件的实际内容不匹配,从库会报错,防止将损坏或不一致的数据应用到从库数据库。
7) 避免使用MyISAM
前段时间小编就遇到一个狗血的问题,表是MyISAM表,主从数据不一致,但复制也没报错,最终排查就是从库的表损坏了。
8) expire_logs_days 或者binlog_expire_logs_seconds设置足够旧,防止延迟或者中断场景,Binlog不够用导致主从不一致。(@蓝梦 补充)
怎么判断不一致?
1) 查看复制状态
执行show slave status\G如果发现复制中断或者存在延迟,则主从基本是不一致的
2) 通过一致性校验工具校验来确定
比如pt-table-checksum
其原理是在主库把数据分为多个数据块,然后执行数据块的checksum,再比较从库上相同数据块的checksum的值,来判断主从数据是否一致。
如果发现不一致,可以使用pt-table-sync进行修复。
欢迎大家继续补充。
更多经典DBA面试题,欢迎加入【DBA驿站】星球。

近期文章




