在 MySQL 运行时,咱们调整零碎工夫,会造成什么影响么?

试验

按常规,咱们造个数据库:

在一个会话里,进行vsleep:

在 sleep 的同时,咱们将服务器的工夫向将来调整 10 秒:

咱们会发现,sleep 立即退出,只执行了0.82 秒:

咱们在业务中很少会用到 sleep,那么调整零碎工夫会有更大的影响么?咱们再来看看:

咱们在一个会话中,锁住一张表:

在另一个会话中, 咱们做如下几件事:

  1. 先打印一个工夫戳
  2. 调整 lock_wait_timeout
  3. 拜访 test.a 表

此时, 咱们调整零碎工夫, 向过来调整 10 秒:

过一会,等拜访 test.a 的申请超时了,咱们来查看输入:

咱们将两个工夫戳相减,算出这个锁继续了多久:

5375908 - 5375891 = 17 秒

由此咱们晓得:调整零碎工夫,会影响 MDL 的等待时间的计算

小贴士

此处咱们获取零碎工夫的办法有点奇怪,是从 /proc/timer_list 中获取, 而并非应用date之类的函数

次要起因是: 当零碎工夫被调整, date等命令的输入也会受到影响.

咱们想主观的评估 MySQL理论期待了多久, 除了手动掐秒表, 还能够利用 枯燥时钟 (monotonic clock) 来进行计算.

枯燥时钟 不会受到零碎工夫变动的影响, /proc/timer_list中的输入就是枯燥时钟的一种

除了以上的试验, 调整零碎工夫, 对正在运行的MySQL还会有其余影响, 比如说 半同步的等待时间计算、 延时复制的延时工夫计算 等等

咱们不倡议在 MySQL 运行时调整零碎工夫, 如需调整, 应及时重启 MySQL

思考题

本文中咱们测试了 MDL 的等待时间, 大家能够设计一个试验, 测试一下 InnoDB lock 的等待时间, 会发现很大的不同.

大家能够查阅材料, 来解释其中的不同.


对于 MySQL 的技术内容,你们还有什么想晓得的吗?连忙留言通知小编吧!