【问题标题】:When was the last time a mysql table was accessed?上次访问 mysql 表是什么时候?
【发布时间】:2011-08-11 09:02:37
【问题描述】:

有没有办法告诉mysql表的最后访问时间?访问是指该表中的任何类型的操作,包括更新、更改甚至选择或任何其他操作。

谢谢。

【问题讨论】:

标签: mysql


【解决方案1】:

可以获取表格的最后更新时间。

SELECT update_time FROM information_schema.tables WHERE table_name='tablename'

【讨论】:

  • 会不会也受到select操作的影响?
  • 不,它不存储上次从表中读取数据的时间。
  • 您可以启用常规查询日志并将其解析为与相关表相关的选择语句。 dev.mysql.com/doc/refman/5.1/en/query-log.html 但是,如果您在服务器上执行大量查询,这不是最好的解决方案。
  • 如果修改提交到数据库引擎的查询不是不可行的,您可以从 SELECT 更改为存储程序并添加一个查询,将该元数据插入其他表中。
  • 需要注意的是,这只适用于 MyISAM 表,不适用于 InnoDB
【解决方案2】:

如需更详细的(数据库名和表名)加上句点(范围),请尝试以下查询:

select table_schema as DatabaseName,
  table_name as TableName,
  update_time as LastAccessTime
from information_schema.tables
where update_time < 'yyyy-mm-dd'
group by table_schema
order by update_time asc 

【讨论】:

    【解决方案3】:

    使用information_schema 数据库查找相应数据库的哪个表被更新:

    SELECT UPDATE_TIME
    FROM   information_schema.tables
    WHERE  TABLE_SCHEMA = 'dbname'
    AND TABLE_NAME = 'tablename'
    order by UPDATE_TIME DESC
    

    【讨论】:

    • 这只会告诉他上次修改表结构的时间,而不是上次访问或使用表的时间。我会假设 OP 正在尝试清理数据库并找出是否不再使用表。
    【解决方案4】:

    我不知道如何获得事后的确切时间,但您可以开始转储日志,做某事,然后停止转储日志。日志中显示的表都是在此期间访问过的表。

    如果您想深入了解日志,查询会显示时间戳。


    告诉mysql把日志文件放在哪里

    将此行添加到my.cnf(在某些系统上将是mysql.conf.d/mysqld.cnf)。

    general_log_file = /path/to/query.log

    启用通用日志

    mysql&gt; SET global general_log = 1;

    (别忘了把这个关掉,它会长得很快)

    做事

    所有的mysql查询都会添加到/path/to/query.log

    禁用一般日志

    mysql&gt; SET global general_log = 0;

    查看出现了哪些表格

    如果它很短,您可以滚动浏览query.log。如果没有,那么您可以过滤已知表名的日志,如下所示:

    query_words=$(cat mysql_general.log | tr -s [:space:] \\n | tr -c -d '[a-zA-Z0-9][:space:][_\-]' | egrep -v '[0-9]' | sort | uniq)
    
    table_names=$(mysql -uroot -ptest -Dmeta -e"show tables;" | sort | uniq)
    
    comm -12 <(echo $table_names) <(echo $query_words)
    

    从那里,您可以 grep 日志文件中出现在 table_names 中的任何内容。在那里您会找到带时间戳的查询。

    另请参阅,this utility,这是我制作的。

    【讨论】:

      【解决方案5】:

      您可以使用操作系统级别的 stat 命令。 找到该特定表的 ibd 文件并运行以下命令


      统计文件位置


      如果表正在被SELECT查询,您可以在Access字段下找到它被访问的时间戳。

      【讨论】:

      • 不,这是错误的。如果每次选择都导致从文件系统读取(这是一个缓慢的操作),那么就不可能达到数据库所需的性能。据我观察,.ibd 文件仅对那些修改时间比访问时间新的选择读取,换句话说,自上次访问以来,表已更改。
      猜你喜欢
      • 2015-01-31
      • 2014-12-18
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 2018-10-30
      • 2012-12-09
      • 1970-01-01
      • 2010-11-01
      相关资源
      最近更新 更多