【发布时间】:2011-08-11 09:02:37
【问题描述】:
有没有办法告诉mysql表的最后访问时间?访问是指该表中的任何类型的操作,包括更新、更改甚至选择或任何其他操作。
谢谢。
【问题讨论】:
-
这不可能是重复的。更新与访问不同。
标签: mysql
有没有办法告诉mysql表的最后访问时间?访问是指该表中的任何类型的操作,包括更新、更改甚至选择或任何其他操作。
谢谢。
【问题讨论】:
标签: mysql
可以获取表格的最后更新时间。
SELECT update_time FROM information_schema.tables WHERE table_name='tablename'
【讨论】:
如需更详细的(数据库名和表名)加上句点(范围),请尝试以下查询:
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
【讨论】:
使用information_schema 数据库查找相应数据库的哪个表被更新:
SELECT UPDATE_TIME
FROM information_schema.tables
WHERE TABLE_SCHEMA = 'dbname'
AND TABLE_NAME = 'tablename'
order by UPDATE_TIME DESC
【讨论】:
我不知道如何获得事后的确切时间,但您可以开始转储日志,做某事,然后停止转储日志。日志中显示的表都是在此期间访问过的表。
如果您想深入了解日志,查询会显示时间戳。
将此行添加到my.cnf(在某些系统上将是mysql.conf.d/mysqld.cnf)。
general_log_file = /path/to/query.log
mysql> SET global general_log = 1;
(别忘了把这个关掉,它会长得很快)
所有的mysql查询都会添加到/path/to/query.log
mysql> 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,这是我制作的。
【讨论】:
您可以使用操作系统级别的 stat 命令。 找到该特定表的 ibd 文件并运行以下命令
统计文件位置
如果表正在被SELECT查询,您可以在Access字段下找到它被访问的时间戳。
【讨论】: