2、从库单 Sql 线程和 Worker 线程
其实不管单 Sql 线程还是 Worker 线程都是执行 Event 的,这里的 start_time 将会被设置为 Event header 中 timestamp 的时间(query event/dml event),这个时间实际就是主库命令发起的时间。如下:堆栈:
query event:
#0 THD::set_time (this=0x7ffe78000950, t=0x7ffe701ec430) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_class.h:3526
#1 0x00000000018459ab in Query_log_event::do_apply_event (this=0x7ffe701ec310, rli=0x7ffe7003c050, query_arg=0x7ffe701d88a9 "BEGIN", q_len_arg=5)
at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/log_event.cc:4714
堆栈:
dml event:
#0 THD::set_time (this=0x7ffe78000950, t=0x7ffe701ed5b8) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_class.h:3526
#1 0x000000000185aa6e in Rows_log_event::do_apply_event (this=0x7ffe701ed330, rli=0x7ffe7003c050)
at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/log_event.cc:11417
thd->set_time(&(common_header->when))
实际上就是这一行,这是我们前面说的重载 3,这样设置后 start_utime 和 start_time 都将会设置,即便调用重载 1 也不会更改, 那 Time 的计算方式 now-thd_info->start_time
就等于(从库服务器当前时间 – Event header 中的时间),但是要知道 Event header 中的时间实际也是来自于主库命令发起的时间。既然如此如果从库服务器的时间小于主库服务器的时间,那么 Time 的结果可能是负数是可能出现的,当然 Percona 版本做了优化负数将会显示为 0,如果从库服务器的时间大于主库的时间那么可能看到 Time 比较大。因为我的测试环境都是 Percona,为了效果明显,我们来测试一下 Worker 线程 Time 很大的情况,如下设置:主库:
[root@mysqltest2 test]# date
FriNov101:40:54 CST 2019
从库:
[root@gp1 log]# date
TueNov1915:58:37 CST 2019