如何知道MySQL表最后更新的时间?

在我页面的页脚中,我想添加诸如“上次更新xx / xx / 200x”这样的date,这个date是某个mySQL表最后一次更新的时间。

什么是最好的方法来做到这一点? 有没有一个函数来检索最后更新的date? 每次我需要这个值时,我应该访问数据库吗?

在更高版本的MySQL中,您可以使用information_schema数据库来告诉您何时更新了另一个表:

 SELECT UPDATE_TIME FROM information_schema.tables WHERE TABLE_SCHEMA = 'dbname' AND TABLE_NAME = 'tabname' 

这当然意味着打开到数据库的连接。


另一种select是在MySQL表更新时,“触摸”一个特定的文件:

在数据库更新上:

  • O_RDRW模式打开您的时间戳文件
  • close

或者可选地

  • 使用touch() (与utimes()函数相当的PHP utimes()来更改文件时间戳。

在页面上显示:

  • 使用stat()读回文件修改时间。

我没有information_schema数据库,使用mysql版本4.1.16,所以在这种情况下你可以查询这个:

 SHOW TABLE STATUS FROM your_database LIKE 'your_table'; 

它会返回这些列:

 | 名称| 引擎| 版本|  Row_format | 行|  AVG_ROW_LENGTH 
| Data_length | Max_data_length | Index_length | Data_free | 自动递增
| Create_time | Update_time | Check_time | 整理
| Checksum | Create_options | 评论|

正如你所看到的,有一个名为“ Update_time ”的列向你显示了your_table的最后更新时间。

我很惊讶没有人build议跟踪每行的最后更新时间:

 mysql> CREATE TABLE foo ( id INT PRIMARY KEY x INT, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, KEY (updated_at) ); mysql> INSERT INTO foo VALUES (1, NOW() - INTERVAL 3 DAY), (2, NOW()); mysql> SELECT * FROM foo; +----+------+---------------------+ | id | x | updated_at | +----+------+---------------------+ | 1 | NULL | 2013-08-18 03:26:28 | | 2 | NULL | 2013-08-21 03:26:28 | +----+------+---------------------+ mysql> UPDATE foo SET x = 1234 WHERE id = 1; 

即使我们没有在UPDATE中提到它,也会更新时间戳。

 mysql> SELECT * FROM foo; +----+------+---------------------+ | id | x | updated_at | +----+------+---------------------+ | 1 | 1235 | 2013-08-21 03:30:20 | <-- this row has been updated | 2 | NULL | 2013-08-21 03:26:28 | +----+------+---------------------+ 

现在你可以查询MAX():

 mysql> SELECT MAX(updated_at) FROM foo; +---------------------+ | MAX(updated_at) | +---------------------+ | 2013-08-21 03:30:20 | +---------------------+ 

无可否认,这需要更多的存储空间(TIMESTAMP每行4个字节)。
但是在MySQL的5.7.15版本之前适用于InnoDB表 ,而INFORMATION_SCHEMA.TABLES.UPDATE_TIME没有。

我将创build一个触发器,捕获所有更新/插入/删除,并在自定义表中写入时间戳,如tablename | 时间戳

只是因为我不喜欢直接读取db服务器的内部系统表

对于最近的表更改列表使用这个:

 SELECT UPDATE_TIME, TABLE_SCHEMA, TABLE_NAME FROM information_schema.tables ORDER BY UPDATE_TIME DESC, TABLE_SCHEMA, TABLE_NAME 

最简单的事情是检查磁盘上表格文件的时间戳。 例如你可以在你的数据目录下查看

cd / var / lib / mysql /

ls -lhtr * .ibd

这应该给你的所有表的列表,当它是最后一次修改时间最早的时候,首先。

只需抓取从文件系统修改的文件date。 用我的语言是:

  tbl_updated = file.update_time( "C:\ProgramData\MySQL\MySQL Server 5.5\data\mydb\person.frm") 

输出:

 1/25/2013 06:04:10 AM 

不知道这是否有任何利益。 在mysql和客户端之间使用mysqlproxy,并根据有趣的表更改使用lua脚本更新memcached中的键值更新,删除,插入是我最近做的解决scheme。 如果包装支持钩子或触发器在PHP中,这可能是eaiser。 到目前为止,还没有任何一个包装纸能做到这一点

OS级别分析:

find数据库存储在磁盘上的位置:

 grep datadir /etc/my.cnf datadir=/var/lib/mysql 

检查最近的修改

 cd /var/lib/mysql/{db_name} ls -lrt 

应该适用于所有数据库types。

如果您正在运行Linux,则可以使用inotify查看表或数据库目录。 inotify可以从PHP,node.js,perl和我怀疑大多数其他语言。 当然,你必须安装inotify或让你的ISP安装它。 很多ISP不会。

这是我所做的,我希望它有帮助。

 <?php mysql_connect("localhost", "USER", "PASSWORD") or die(mysql_error()); mysql_select_db("information_schema") or die(mysql_error()); $query1 = "SELECT `UPDATE_TIME` FROM `TABLES` WHERE `TABLE_SCHEMA` LIKE 'DataBaseName' AND `TABLE_NAME` LIKE 'TableName'"; $result1 = mysql_query($query1) or die(mysql_error()); while($row = mysql_fetch_array($result1)) { echo "<strong>1r tr.: </strong>".$row['UPDATE_TIME']; } ?> 

在全局variables不可用时caching查询。

创build一个网页来强制caching在您更新时重新加载。

将重新加载页面的调用添加到您的部署脚本中。