1、需求背景

获取MySQL中某张表的最后更新时间。

2、相关答案及存在的问题

在网上查找了很多资料,中英文的都有,一种比较常见的解决思路是,执行以下语句:

select update_time from information_schema.tables where table_name='mytab' and table_schema='mydb'

如果MySQL的版本相对较低(比如说,5.7.30),上述语句是没有问题的,可以轻易进行验证。

但是,这种写法在我本机(macOS)的MySQL(版本8.0.21)实例上是有问题的,返回的值是NULL。注意官方文档中更新的内容:

  • Update_time
    When the data file was last updated. For some storage engines, this value is NULL. For example, InnoDB stores multiple tables in its system tablespace and the data file timestamp does not apply. Even with file-per-table mode with each InnoDB table in a separate .ibd file, change buffering can delay the write to the data file, so the file modification time is different from the time of the last insert, update, or delete. For MyISAM, the data file timestamp is used; however, on Windows the timestamp is not updated by updates, so the value is inaccurate.
    Update_time displays a timestamp value for the last UPDATE, INSERT, or DELETE performed on InnoDB tables that are not partitioned. For MVCC, the timestamp value reflects the COMMIT time, which is considered the last update time. Timestamps are not persisted when the server is restarted or when the table is evicted from the InnoDB data dictionary cache.

大概意思是,对于使用了某些存储引擎的表,其update_time的值为NULL。例如,InnoDB在系统表空间中会存储多张表,因此,数据文件的时间戳不会同步到information_schema.tables中去。即使使用了InnoDBfile-per-table模式——每张表单独存储成一个.ibd文件——change buffering仍会延迟将更新时间写入数据文件中,所以,information_schema.tables中记录的更新时间会和实际的更新时间不同。对于MyISAM存储引擎,数据文件的时间戳被用来作为update_time的值。

按照上述说法,之所以在我的机器上更新了目标表而查询到的值为NULL,可能得原因有两个:1,使用了InnoDB存储引擎,并且没有使用file-per-table模式;2,使用了file-per-table模式,而更新时间会有延迟,所以无法马上查询到。

我查找相关资料后发现,从5.6开始,MySQL的InnoDB引擎默认是使用file-per-table模式的,通过查找磁盘上的数据表文件也发现,确实每张表会存储成一个单独的.idb文件。

那么,问题就应该出在更新时间延迟这里。根据官方文档中对全局变量change buffering的解释,可以将该变量的值设置为‘null’,表示不缓存任何插入、删除、更新操作。按照我的理解,这样设置之后,虽然I/O开销会增加,但是应该就可以立即将更新时间同步写到information_schema.tables中了。于是,我执行了以下操作:

set global innodb_change_buffering = 'none'  -- 更改全局变量innodb_change_buffering的值show global variables like 'innodb_change_buffering' -- 查询一下,确定更改生效

然后我再次对目标表执行了插入、更新、删除操作后,利用一开始的sql查询update_time,发现依然是空。

至此,我没有任何办法了。我在Stack Overflow上提了相关问题,有一些人提供了一些想法,可以点击这里进行交流。

3、其他方案

其实在默认的InnoDB存储引擎下,每一张表都是一个单独的文件,那么对表进行任何更改操作的话,对应文件的修改时间肯定发生了变化,因此,如果可以定位到表对应磁盘上的文件,直接获取文件的最新更新时间即可。

而且这似乎也是update_time中值的填充方式。

手动狗头。

如何获取MySQL中表的最后更新时间相关推荐

  1. Android 获取应用的安装时间及更新时间

    Android 获取应用的安装时间及更新时间 在工作时遇到一个需求,就是获取应用的安装时间,本来我觉的这个应该是不能获取到的.觉得应用在安装时,并不是由应用自身控制的.所以就直接回复对方说取不到.但是 ...

  2. MySQL按时间段随机更新时间

    话不多说,直接上实例,下面有注释说明. #查询操作时间 select create_date from sys_log -- 10点至18点. -- 区间=8小时=28800秒 -- 下面更新时间 = ...

  3. Mysql设置创建时间字段和更新时间字段自动获取时间,填充时间

    1.引言 在实际开发中,每条数据的创建时间和修改时间,尽量不需要应用程序去记录,而由数据库获取当前时间自动记录创建时间,获取当前时间自动记录修改时间. 2.创建语句 (1)–添加CreateTime ...

  4. 向mysql中添加更新时间_mysql 实现添加时间自动添加更新时间自动更新操作

    在数据库使用中经常使用到时间字段.常用的有创建时间和更新时间. 然而在使用中想要创建时间在创建的时候自动设置为当前时间,更新时间在更新时自动更新为当前时间. 创建表 stu CREATE TABLE ...

  5. java实现mysql自动更新创建时间与更新时间的两种方式

    一:通过数据库自身实现 1 .创建表的时候加上  create_time  与   update_time 两个字段 `create_time` timestamp NOT NULL DEFAULT ...

  6. mysql 数据表 时间自动_MySQL数据库时间设置自动添加时间和自动更新时间

    MySQL字段中设置时间字段自动添加创建时间和自动更新时间设置, 设置字段类型为:timestamp 默认值设置为current_timestamp(), 更新时间字段字段类型为:timestamp ...

  7. mysql中创建时间和更新时间的区别

    `create_time` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` timestamp(0) ...

  8. mysql创建与更新时间字段

    http://blog.sina.com.cn/s/blog_672b419f0101k63f.html DATETIME类型用在你需要同时包含日期和时间信息的值时.MySQL检索并且以'YYYY-M ...

  9. PHP获取MySQL执行sql语句的查询时间

    PHP获取MySQL执行sql语句的查询时间 1. $t1=microtime(true); mysql_query($sql); echo microtime(true)-$t1; 2. //计时开 ...

  10. mysql使用navicat(建表前与建表后)添加时间戳(创建时间、自动更新时间)

    为了知道我们插入更新数据的时间,mysql建表增加以下代码 目录 一.建表时添加 1.1代码 1.2举例 二.建表后添加 2.1举例 2.2代码 2.3运行结果 一.建表时添加 1.1代码 creat ...

最新文章

  1. [Android]手动触发OnClick事件
  2. mysql -ss -e_课内资源 - 基于ssm框架和mysql的网上选课系统
  3. JDK1.8新特性之时间和日期的使用
  4. Predator:比微软Kinect更强的视频追踪算法-来自捷克博士论文
  5. 深入理解HTTP协议
  6. 前端学习(2440):axios处理文章数据
  7. Windows Server 2008 将与 Visual Studio 2008 和 SQL Server 2008 于2008年2月27 日在洛杉矶共同发布...
  8. Openstack(十四)创建虚拟机
  9. 聊聊我的 2018 年
  10. wordpress上传图片按时间重命名
  11. pythoncookbook和流畅的python对比_流畅的python和cookbook学习笔记(五)
  12. 【设计】松本行弘的程序世界
  13. 没有银弹-软件工程中的根本和次要问题
  14. PIC16F15323单片机 (中断与定时器Timer0)
  15. 干货-Google支付后台验证操作流程【业务后台-GP后台流程】
  16. 迷宫问题(解救小哈)
  17. 网络安全课程笔记(1)
  18. 蔡康永的情商课-笔记
  19. mac 隐藏文件(隐藏文件夹)怎么取消隐藏,显示文件(夹)
  20. USB总线驱动及鼠标驱动实例

热门文章

  1. 海底电缆变为“地震仪”
  2. 狂神说Linux03:Vim使用及账号用户管理
  3. 易福门电感式接近开关IGS200
  4. 【C++ 第五章 个人银行账户管理程序案例】
  5. 3.16√ 火车调度站的入口处有n节硬席或软席车厢(分别以H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作
  6. 世界杯最野蛮大战,巴西付出慘重代价步入四强
  7. 免费学python的网课-像玩游戏一样学Python,和各种网课说再见
  8. BH1750光照传感器超详细攻略(从原理到代码讲解,看完你就懂了)
  9. JavaScript - 动画介绍与学习
  10. psf2otf函数的解释