如何理解在MTS中Worker线程看到Time为负数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。这是一个朋友问我的一个问题,问题如下,在MTS中Worker线程看到Time为负数是怎么回事,如下:实际上show processlist中的信息基本都来自函数 mysqld_list_processes,也就是说每次执行show processlist 都需要执行这个函数来进行填充。对于Time值来讲它来自如下信息:我们可以注意到在Percona的版本中对这个输出值做了优化,也就是如果出现负数的时候直接显示为0,但是官方版中没有这样做,可能出现负数。现在我们来看看这个简单的计算公式,实际上now很好理解就是服务器的当前时间,重点就在于thd_info->start_time的取值来自何处。
实际这个时间来自于函数THD::set_time,但是需要注意的是这个函数会进行重载,有下面三种方式:重载1重载2重载3其实简单的说就是其中有一个start_utime,如果设置了start_utime那么start_time将会指定为start_utime,并且在重载1中将会不会修改start_time,这一点比较重要。好了说了3种方式,我们来看看Time的计算有如下可能。如果主库执行常见的命令都会在命令发起的时候调用重载1,设置start_time为命令开始执行的时间如下:可以看到这个函数没有实参,因此start_time会设置为当前时间,那Time的计算公式 now – thd_info->start_time就等于 (服务器当前时间 – 命令开始执行的时间)。其实不管单Sql线程还是Worker线程都是执行Event的,这里的start_time将会被设置为Event header中timestamp的时间(query event/dml event),这个时间实际就是主库命令发起的时间。如下:我们看到这里有一个实参的传入我们看一下代码如下:实际上就是这一行,这是我们前面说的重载3,这样设置后start_utime和start_time都将会设置,即便调用重载1也不会更改, 那Time的计算方式 now – thd_info->start_time就等于 (从库服务器当前时间 – Event header中的时间),但是要知道 Event header中的时间实际也是来自于主库命令发起的时间。 既然如此如果从库服务器的时间小于主库服务器的时间,那么Time的结果可能是负数是可能出现的,当然Percona版本做了优化负数将会显示为0,如果从库服务器的时间大于主库的时间那么可能看到Time比较大。因为我的测试环境都是Percona,为了效果明显,我们来测试一下Worker线程Time很大的情况,如下设置:主库随便做一个命令,然后观察如下:如果手动指定timestamp也会影响到Time的计算结果,因为start_utime和start_time都将会设置,如下:我们看到带入了实参,我们看看代码这一行如下:这就是重载2了,这样设置后star免费主机域名t_utime和start_time都将会设置,即便调用重载1也不会更改,言外之意就是设置了timestamp后即便执行了其他的命令Time也不会更新。Time的计算方式 now – thd_info->start_time就等于 (服务器当前时间 – 设置的timestamp时间),这样的话就可能出现Time出现异常,比如很大或者为负数(Percona为0)如下:如果我们的会话空闲状态下那么now – thd_info->start_time 公式中,now会不断变大,但是thd_info->start_time却不会改变,因此Time 会不断增大,等待到下一次命令到来后才会更改。这里我想在说明一下如果从库开启了log_slave_updates 的情况下,从库记录会记录来自主库的E免费主机域名vent,但是这些Event的timestamp和Query Event的exetime如何取值呢?Event的timestamp的取值其实上面我已经说了,因为 start_time将会被设置为Event header中timestamp的时间(query event/dml event),当记录Evnet的时候这个时间和主库基本一致,如下:很明显我们会发现这些Event的timestamp不是本地的时间,而是主库的时间。Query Event的exetime我们先来看看这个时间的计算方式:相信对于 thd_arg->start_time而言已经不再陌生,它就是主库命令发起的时间。我在我的《深入理解主从原理》系列中说过了,对于Query Event的exetime在 row格式binlog下,DML语句将会是第一行语句修改时间的时间,那么我们做如下定义(row格式 DML语句):主:主库第一行数据修改完成的服务器时间 – 主库本命令发起的时间从:从库第一行数据修改完成的服务器时间 – 主库本命令发起的时间他们的差值就是:
(从库第一行数据修改完成的服务器时间 – 主库第一行数据修改完成的服务器时间 )同样如果我们从库的时间远远大于主库的时间,那么exetime也会出现异常如下:Time是我们平时关注的一个指标,我们经常用它来表示我的语句执行了多久,但是如果出现异常的情况我们也应该能够明白为什么,这里我将它的计算方式做了一个不完全的解释。关于如何理解在MTS中Worker线程看到Time为负数问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注云技术行业资讯频道了解更多相关知识。
这篇文章主要介绍“ORACLE事务和实例的恢复过程讲解”,在日常操作中,相信很多人在ORACLE事务和实例的恢复过程讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ORACLE事务和实例的恢复过程讲解”的疑惑有所帮助!接下来,…