我正在为 MySQL 8.0.x 使用 Percona 服务器。我已经在 GTID 模式关闭的两个实例之间设置了复制。几乎所有 UPDATE 和 INSERTS 都从应用程序端包装在事务中。
在从服务器上查看来自主服务器的 binlog 时,我注意到有很多空事务。当在该事务中没有要执行的内容时,它们是什么以及为什么它们会出现在 binlog 中。
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1587391567871055 (2020-04-20 14:06:07.871055 UTC)
# immediate_commit_timestamp=1587391567871055 (2020-04-20 14:06:07.871055 UTC)
/*!80001 SET @@session.original_commit_timestamp=1587391567871055*//*!*/;
/*!80014 SET @@session.original_server_version=80019*//*!*/;
/*!80014 SET @@session.immediate_server_version=80019*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
SET TIMESTAMP=1587391567/*!*/;
BEGIN
/*!*/;
COMMIT/*!*/;
经过一些研究并进一步研究 MySQL 文档,结果证明这是我的错误。
我正在使用
mysqlbinlog -s
选项来查看二进制日志。因为复制语句是作为基于行的复制来的,所以看不到实际的语句。基于语句和基于行的复制的优缺点
因此,当尝试使用
mysqlbinlog -s
util 查看 binlog 时,它不会解码此信息块,因此显示为空白/空提交。希望这可以帮助其他人遇到类似情况。