pt-online-schema-change 工具依赖于触发器的机制去实现表的无锁 DDL 那我们试想在一主一从的情况下, 有个大表需要执行 DDL 操作, 为了验证该操作的执行时长, 先用 pt-online-schema-change 工具在从库上执行变更确认没有问题后再在主库上执行变更当然, 在执行之前是需要开启会话级的 sql_log_bin=0 以避免记录到 binlog
但是我们从官方文档中获知如下:
很明显, 如果主从架构下, binlog 的日志格式是 row 的话, 依赖触发器机制的 pt-online-schema-change 是会造成数据丢失的因为增量的数据无法通过触发器去收集也就是说, 在基于主库的 binlog 为 row 格式的情况下, 从库的触发器是不会起作用的因为主库本身通过触发器产生的变更已经写入 binlog 同步到从库如果从库的触发器也生效的话, 就会出现重复
总结: 在基于主从复制架构下, 如果主库 binlog 的日志格式为 row 情况下, pt-online-schema-change 工具必须在主库执行才能避免主从数据不一致如果日志格式是 statement 的话, 则可以先在从库执行 pt-online-schema-change 再在主库执行但是目前官方也建议参数 binlog_format 设置为 row, 而非 statement, 以避免某些情况下的主从数据不一致发生
来源: http://www.bubuko.com/infodetail-2532531.html