事务完整性需验证每笔事务在从库原子性执行、不丢不重、顺序一致,通过GTID/binary log位点比对、pt-table-checksum校验及人工注入测试事务追踪三重手段保障。

主从复制的事务完整性不能靠“看起来同步了”来判断,必须验证每笔事务是否在从库原子性执行、不丢不重、顺序一致。
检查 SHOW SLAVE STATUS 中 GTID 或 binlog 位点连续性
GTID 模式下,Executed_Gtid_Set 和 Retrieved_Gtid_Set 必须严格包含关系(前者 ⊆ 后者),且从库 Executed_Gtid_Set 应与主库 gtid_executed 最终一致;非 GTID 模式则需比对 Master_Log_File + Read_Master_Log_Pos 是否持续推进,且 Relay_Master_Log_File + Exec_Master_Log_Pos 与其保持逻辑连续。若 Read_Master_Log_Pos 长期停滞而 Exec_Master_Log_Pos 仍在动,说明中继日志已积压但 SQL 线程还在消费旧事件——事务可能被跳过或卡住。
- 主库执行:
SELECT @@global.gtid_executed;,记下完整 GTID 集合 - 从库执行:
SHOW SLAVE STATUS\G,提取Executed_Gtid_Set并逐段比对是否缺失某段 UUID:1-N - 若使用 binlog 位点,主库
SHOW MASTER STATUS;的Position应 ≥ 从库Read_Master_Log_Pos,差值过大(如 > 10MB)需警惕 IO 线程拉取缓慢或网络丢包
用 pt-table-checksum 校验事务级数据一致性
pt-table-checksum 不是简单比行数,而是按 chunk 分片计算 CRC32 或 MD5 校验和,每个 chunk 对应一个事务边界内的多行(默认按主键范围切分)。它会自动在主库生成校验语句、注入到 binlog、由从库回放并写入 percona.checksums 表,从而保证校验过程本身也被复制——这是验证事务完整性的关键设计。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 必须在主库执行,且主库 binlog_format 必须为
ROW(MIXED在某些场景下会降级为 STATEMENT,导致校验语句不被复制) - 运行时加
--no-check-binlog-format仅跳过格式检查,不解决根本问题;真正安全的做法是提前确认binlog_format=ROW - 校验后在从库查:
SELECT * FROM percona.checksums WHERE this_crc != master_crc OR is_drift = 1;,有结果即表示该 chunk 内存在事务未完整同步(如部分行被跳过、类型转换出错、大字段截断)
人工注入带 GTID 标识的测试事务并追踪执行路径
绕过应用层,直接在主库构造可追踪的事务,观察其是否原样出现在从库的 relay log 和执行历史中。这对排查“看似同步但数值异常”的问题极有效。
- 主库执行:
BEGIN; INSERT INTO test_seq (ts, val) VALUES (NOW(6), UUID()); COMMIT;(NOW(6)提供微秒级唯一标识) - 立刻在主库查:
SELECT @@global.gtid_executed;,定位刚插入事务所属的 GTID - 从库执行:
SHOW RELAYLOG EVENTS IN 'relay-bin.000001' FROM,搜索该 GTID 字符串,确认是否进入 relay logLIMIT 10; - 再查从库
test_seq表,确认val值与主库完全一致(注意:UUID() 是主库生成的,从库不会重新执行函数,必须原值复制) - 若值不一致,说明该事务在 SQL 线程回放时被改写(如触发器、SET SESSION sql_log_bin=0、列类型隐式转换)
事务完整性最易被忽略的一点:它不只关乎“数据有没有”,更关乎“事务怎么执行”。比如主库一条 UPDATE t SET x=x+1 WHERE id=1; 在从库因字符集差异变成 x=x+0,或者因 sql_mode 不同被静默截断,Seconds_Behind_Master 仍显示为 0。这种“伪同步”只能靠带上下文的校验(如 pt-table-checksum)或人工事务追踪暴露。










