如何判断MySQL表的上次更新时间?

时间:2008-11-21 00:48:59

标签: mysql sql

在我页面的页脚中,我想添加类似“上次更新xx / xx / 200x”的内容,此日期是某个mySQL表最后一次更新的日期。

最好的方法是什么?是否有检索上次更新日期的功能?我每次需要这个值时都应该访问数据库吗?

16 个答案:

答案 0 :(得分:252)

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

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

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


另一种选择是在MySQL表更新时“触摸”特定文件:

关于数据库更新:

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

或者

  • 使用touch()(等效于utimes()函数的PHP)来更改文件时间戳。

在页面显示:

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

答案 1 :(得分:53)

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

SHOW TABLE STATUS FROM your_database LIKE 'your_table';

它将返回以下列:

| Name      | Engine | Version | Row_format | Rows | Avg_row_length 
| Data_length | Max_data_length | Index_length | Data_free | Auto_increment
| Create_time | Update_time | Check_time | Collation
| Checksum | Create_options | Comment |

正如您所看到的,有一个名为“ Update_time ”的列,显示 your_table 的上次更新时间。

答案 2 :(得分:47)

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

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个字节) 但是这适用于在5.7.15版MySQL之前的InnoDB表INFORMATION_SCHEMA.TABLES.UPDATE_TIME没有。

答案 3 :(得分:7)

有关最近表更改的列表,请使用以下命令:

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

答案 4 :(得分:5)

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

仅仅因为我不喜欢直接读取db server的内部系统表的想法

答案 5 :(得分:5)

最简单的方法是检查磁盘上表文件的时间戳。例如,您可以在数据目录下查看

cd /var/lib/mysql/<mydatabase>
ls -lhtr *.ibd

这应该为您提供所有表格的列表,其中包含上次修改最早时间的表格。

答案 6 :(得分:1)

虽然有一个公认的答案,但我并不认为这是正确的答案。这是实现所需内容的最简单方法,但即使已经在InnoDB中启用(实际文档告诉您仍然应该得到NULL ...),如果您阅读MySQL docs,即使在当前版本中也是如此(8.0 )使用UPDATE_TIME不是正确的选项,因为:

  

重新启动服务器或重新启动服务器时,时间戳不会保留   表从InnoDB数据字典缓存中逐出。

如果我理解正确(现在无法在服务器上验证它),服务器重启后会重置时间戳。

对于真实(而且成本高昂)的解决方案,你有Bill Karwin的solution和CURRENT_TIMESTAMP,我想提出一个不同的解决方案,这是基于触发器(I& #39; m使用那个)。

首先创建一个单独的表(或者你可能有一些其他表可以用于此目的),它将像全局变量(这里是时间戳)的存储一样工作。您需要存储两个字段 - 表名(或您希望保留在此作为表ID的任何值)和时间戳。拥有它之后,你应该用这个表初始化它id +开始日期(NOW()是一个不错的选择:))。

现在,您转移到要观察的表,并使用此过程或类似过程在INSERT / UPDATE / DELETE之后添加触发器:

CREATE PROCEDURE `timestamp_update` ()
BEGIN
    UPDATE `SCHEMA_NAME`.`TIMESTAMPS_TABLE_NAME`
    SET `timestamp_column`=DATE_FORMAT(NOW(), '%Y-%m-%d %T')
    WHERE `table_name_column`='TABLE_NAME';
END

答案 7 :(得分:0)

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

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

输出:

1/25/2013 06:04:10 AM

答案 8 :(得分:0)

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

答案 9 :(得分:0)

不确定这是否有任何意义。在mysql和客户端之间使用mysqlproxy,并根据有趣的表更改使用lua脚本更新memcached中的键值UPDATE,DELETE,INSERT是我最近做的解决方案。如果包装器在php中支持钩子或触发器,那么这可能是eaiser。截至目前,没有一个包装器可以做到这一点。

答案 10 :(得分:0)

操作系统级别分析:

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

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

检查最近的修改

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

应该适用于所有数据库类型。

答案 11 :(得分:0)

我按名称列出了一列:phpMyAdmin中的update-at,并从我的代码(nodejs)中的Date()方法获取了当前时间。表格中的每次更改都会保留更改时间。

答案 12 :(得分:0)

a)它会显示所有表格以及最近的更新日期

SHOW TABLE STATUS FROM db_name;

然后,您可以进一步要求提供特定表格:

SHOW TABLE STATUS FROM db_name like 'table_name';

b)如上例所示,您不能在“ Update_time”上使用排序,但是使用SELECT可以:

SELECT * FROM information_schema.tables WHERE TABLE_SCHEMA='db_name' ORDER BY UPDATE_TIME DESC;

进一步询问特定表格:

SELECT * FROM information_schema.tables WHERE TABLE_SCHEMA='db_name' AND table_name='table_name' ORDER BY UPDATE_TIME DESC';

答案 13 :(得分:0)

我让它在本地工作,但不在我的公共网站的共享主机上(我认为是权利问题)。

SELECT last_update FROM mysql.innodb_table_stats WHERE table_name = 'yourTblName';

'2020-10-09 08:25:10'

Win 8.1上的MySQL 5.7.20登录

答案 14 :(得分:-1)

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

<?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'];
    }
?>

答案 15 :(得分:-8)

在全局变量不可用时将查询缓存。

创建网页以强制在更新缓存时重新加载缓存。

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