美文网首页
第48问:为什么 MySQL 运行时, 不鼓励调整系统时间

第48问:为什么 MySQL 运行时, 不鼓励调整系统时间

作者: 爱可生开源社区 | 来源:发表于2021-11-03 15:21 被阅读0次
    image

    在 MySQL 运行时,我们调整系统时间,会造成什么影响么?

    实验

    按惯例,我们造个数据库:

    image

    在一个会话里,进行vsleep:

    image

    在 sleep 的同时,我们将服务器的时间向未来调整 10 秒:

    image

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

    image

    我们在业务中很少会用到 sleep,那么调整系统时间会有更大的影响么?我们再来看看:

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

    image

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

    1. 先打印一个时间戳
    2. 调整 lock_wait_timeout
    3. 访问 test.a 表
    image

    此时, 我们调整系统时间, 向过去调整 10 秒:

    image

    过一会,等访问 test.a 的请求超时了,我们来查看输出:

    image

    我们将两个时间戳相减,算出这个锁持续了多久:

    5375908 - 5375891 = 17 秒

    由此我们知道:调整系统时间,会影响 MDL 的等待时间的计算

    小贴士

    此处我们获取系统时间的方法有点奇怪,是从 /proc/timer_list 中获取, 而并非使用date之类的函数

    主要原因是: 当系统时间被调整, date等命令的输出也会受到影响.

    我们想客观的评估 MySQL实际等待了多久, 除了手动掐秒表, 还可以利用 单调时钟 (monotonic clock) 来进行计算.

    单调时钟 不会受到系统时间变化的影响, /proc/timer_list中的输出就是单调时钟的一种

    除了以上的实验, 调整系统时间, 对正在运行的MySQL还会有其他影响, 比如说 半同步的等待时间计算、 延时复制的延时时间计算 等等

    我们不建议在 MySQL 运行时调整系统时间, 如需调整, 应及时重启 MySQL

    思考题

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

    大家可以查阅资料, 来解释其中的不同.

    image

    关于 MySQL 的技术内容,你们还有什么想知道的吗?赶紧留言告诉小编吧!

    相关文章

      网友评论

          本文标题:第48问:为什么 MySQL 运行时, 不鼓励调整系统时间

          本文链接:https://www.haomeiwen.com/subject/eexfzltx.html