【问题标题】:When was my table last ALTERed?我的桌子上次更改是什么时候?
【发布时间】:2012-03-02 16:56:20
【问题描述】:

我正在使用 mysql 5.1.41-3ubuntu12.10 并且想知道我的表上次更改(或创建,如果它从未更改过)的时间。

SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA = SCHEMA();
给出 CREATE 和最后一次 UPDATE 时间,而不是 AFAICT 最后一次 ALTER 时间。

【问题讨论】:

    标签: mysql timestamp metadata alter-table alter


    【解决方案1】:

    答案在某种程度上取决于存储引擎。表上次更改时间的最可靠指标是查看数据目录中 .frm 文件的修改时间。每次更改表时都应更新该文件,即使是更新列默认值等不需要重建表的更改。

    information_schema.tables.create_time 有点用词不当,因为当您更改表时,该值实际上会在大多数情况下发生变化。但是,这是存储引擎相关的一个领域。如果您在 InnoDB 中进行更改而不进行重建(例如更改列默认值),则更新 information_schema.tables.create_time,但如果您在 MyISAM 中执行相同操作,则不会更新 information_schema.tables.create_time。在这两种情况下,都应该更新 .frm 文件,因此如果您可以访问它,我建议您检查文件时间戳以获得最准确的数据。

    【讨论】:

    • +1 提出了这个重要的区别。我使用 InnoDB,所以我猜information_schema.tables.create_time 会在表更改时更新。除了在文件系统中查找 .ibd.opt 文件的创建时间之外,我无法找到表的真实 Create_Time。这似乎应该被视为一个错误,不是吗?
    • 在我的数据库表中挖掘,我发现mysql.innodb_table_stats.last_update 似乎显示了创建时间,而不是最后一次更新完成。很傻,特别是因为information_schema.tables.create_time 似乎显示了最后一次 UPDATE 而不是 CREATE 时间。嗯。
    • 抱歉给这个 4 岁的帖子添乱了……看起来 ALTER-ing 表元数据将更新 information_schema.tables.create_time 而不是 mysql.innodb_table_stats.last_update,而 ALTER-ing 表列约束将更新 mysql.innodb_table_stats.last_update 而不是 information_schema.tables.create_time。旁注:执行 INSERT 不会像预期的那样更新 mysql.innodb_table_stats.n_rows,但会在 last_update 更新时更新。好的,我已经完成了这篇文章的混乱。
    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2010-11-01
    • 1970-01-01
    • 2022-12-18
    • 2014-02-10
    相关资源
    最近更新 更多