MySQL binlogs中设置的时间戳是什么时候

When is the timestamp set in MySQL binlogs

我搜索过之前的问题,但找不到与我的问题完全匹配的内容:

在查询事务期间的什么时候设置二进制日志时间戳,然后写入二进制日志?

上下文:我一直在使用一个使用 master/slave 复制的数据库。从属服务器经常会落后于主服务器,我敢肯定这仅仅是因为二进制日志中有很多事务共享相同的时间戳。当我说很多的时候,我说的是超过 150 个时间戳,属于 1 小时日志中的 9000 多个条目(加上返回的其余条目少于 9000 个)。这是使用以下方法找到的:

mysqlbinlog bin-log.0001 | grep 'TIMESTAMP' | uniq -c | awk '{if (>9000){print [=11=]}} ' | sed -e 's/\/\*\!\*\/;//g' | gawk -F '=' '{cmd="date -d @"; cmd | getline d; print "=""\t("d")"; close(d)}'

所以我基本上是在尝试确定共享时间戳的事务数是否反映了主服务器上的工作负载,以及这些数字是否异常。

绘制 Second_behind_master 图表时,它显示线性增长,然后突然下降,这似乎表明了同样的事情。

MySQL 版本为 5.6.33.

'slave lag' 的可能原因有很多,这里很难详细回答。二进制日志时间戳写在事务开始时。

这里有一个很有用的 post 介绍了如何确定症状的原因:https://www.percona.com/blog/2014/05/02/how-to-identify-and-cure-mysql-replication-slave-lag/ 例如,它解释了 Seconds_Behind_Master 参数如何产生误导,因为它仅测量最近执行的中继日志的时间戳与 IO_THREAD 最近下载的中继日志条目之间的差异。

您会在网站上找到许多可能对您有帮助的其他资源。这包括博客 post 中提到的 Percona 工具包,它与所有 Percona 软件一样完全免费且开源。

披露:我为 Percona 工作。