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

CodeTrailblazerX
• 阅读 1364

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

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

实验

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

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

在一个会话里,进行vsleep:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5375908 - 5375891 = 17 秒

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

小贴士

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

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

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

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

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

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

思考题

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

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

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


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

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

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
mysql用户
1\.学会能按着需求创建一个帐号2\.知道连接字符串是什么样3\.密码密码怎么恢复mysql用户权限介绍mysql用户管理 !(https://oscimg.oschina.net/oscnet/368d3c1e00a0a9515545c2962660a27a080.png)!(https://oscimg.oschin
Wesley13 Wesley13
3年前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数NOW()相同的格式返回日期和时间?我知道如何使用date()做到这一点,但是我问是否有一个仅用于此的函数。例如,返回:2009120100:00:001楼使用此功能:functiongetDatetimeNow(){
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究