跑一条真实的UPDATE语句,用mysqlbinlog解码对应的binlog事件,看row-based复制里真实存的到底是SQL还是数据。
代码UPDATE shop.orders SET qty = 99 WHERE item='apple'; $ mysqlbinlog --base64-output=decode-rows -v source-bin.000003
### UPDATE `shop`.`orders` ### WHERE ### @1=1 ### @2='apple' ### @3=10 ### SET ### @1=1 ### @2='apple' ### @3=99
这段真实解码出来的内容里,完全找不到UPDATE shop.orders SET qty = 99 WHERE item='apple'这句SQL文本——binlog里真实记录的是WHERE部分(改之前这一行的完整数据:id=1, item='apple', qty=10)和SET部分(改之后的数据:id=1, item='apple', qty=99),两组真实的列值快照,而不是导致这次修改的SQL语句本身。
每一步都是本文上面用真实mysqlbinlog解码跑出来的原始结果。
mysqlbinlog --base64-output=decode-rows -v真实解码binlog事件binlog_format=ROW(MySQL 8.0起的默认值)