我正在使用一个数据库,遗憾的是有很多未使用的表,我正在尝试清理它。我正试图找到一种方法,让我可以100%确信某个特定的桌子不再被使用。
经过一些谷歌搜索,我仍然找不到一个好方法。我只能使用:
告诉最后一次写入表(INSERT,UPDATE等) SHOW TABLE STATUS或在mysql datadir上运行ls -lt
(可以通过运行SHOW VARIABLES LIKE'datadir'找到;)
你还有其他建议吗?
感谢。
答案 0 :(得分:2)
尝试使用INFORMATION_SCHEMA.TABLES
有一个名为UPDATE_TIME的列
检查该字段中的日期
如果为NULL,则表自创建表
后从未更新过示例:过去10天内未更新的表列表
select table_schema,table_name,create_time,update_time from information_schema.tables where table_schema not in ('information_schema','mysql') and engine is not null and ((update_time < (now() - interval 10 day)) or update_time is null);
试一试!!!
答案 1 :(得分:0)
试试http://forums.mysql.com/read.php?20,298759,299185#msg-299185
打开“常规日志”并进行扫描(以编程方式!)会告诉您在日志开启期间谁正在点击哪些表。警告:该文件增长很快。
答案 2 :(得分:0)
我知道这是一个老问题,但似乎没有一个正确的答案,我在这里被我自己寻找答案。根据{{3}},应该能够做到这样的事情:
SELECT
t.*
FROM performance_schema.table_io_waits_summary_by_table t
WHERE
t.COUNT_STAR = 0
AND t.OBJECT_SCHEMA = '<your-schema-name-goes-here>'
AND t.OBJECT_TYPE = 'TABLE';
来自MySQL的Mark Leith's blog post about unused tables and indexes提供了更多细节。
当然要求您启用了性能架构,并且统计数据尚未被清除/截断一段时间。
答案 3 :(得分:0)
我很惊讶MySQL对识别未使用表的支持很少。如对此问题的评论所述,事实证明,至少有一种有前途的方法适用于MyISAM,但不适用于InnoDB表。
但是,我可能已经找到了一种可靠的方法来识别未使用的InnoDB表,至少从MySQL 5.7.26开始。该方法利用了MySQL的 file_summary_by_instance 表,该表按文件名汇总有关I / O操作的信息。
登录mysql,然后:
mysql> SELECT * FROM performance_schema.file_summary_by_instance\G
这将为所有数据库中的所有文件打印诸如COUNT_READ
之类的值。您可以通过多种方式缩小搜索范围。例如,要显示数据库文件/var/lib/mysql/production/user.ibd
的所有值,
mysql> SELECT * FROM performance_schema.file_summary_by_instance where FILE_NAME = '/var/lib/mysql/production/user.ibd'\G
您还可以仅选择您感兴趣的值,例如
mysql> SELECT FILE_NAME,COUNT_STAR,COUNT_READ,COUNT_WRITE,COUNT_MISC FROM performance_schema.file_summary_by_instance where FILE_NAME = '/var/lib/mysql/production/user.ibd'\G
以上查询使您可以监视MySQL实例使用的所有文件上各种类型的使用情况计数。但是,要确定是否正在使用某个文件,您可能要重置这些计数。幸运的是,
那么你可以
mysql> truncate table file_summary_by_instance;
然后查看哪些文件的计数增加。
一个警告:由于某些表只能在应用程序启动时读取,因此您可能需要重新启动应用程序(甚至服务器),并查看这是否增加了访问次数。
有关 file_summary_by_instance 表的更多详细信息,请参见 https://dev.mysql.com/doc/refman/5.7/en/file-summary-tables.html
答案 4 :(得分:0)
嗯,这个问题早在很久以前就有人问过了,但我希望这个答案能在未来对某人有所帮助。
SHOW TABLE STATUS where `Rows` = 0;