MySQL找到未使用的表

时间:2010-10-25 13:06:02

标签: mysql mysql-management

我正在使用一个数据库,遗憾的是有很多未使用的表,我正在尝试清理它。我正试图找到一种方法,让我可以100%确信某个特定的桌子不再被使用。

经过一些谷歌搜索,我仍然找不到一个好方法。我只能使用:

告诉最后一次写入表(INSERT,UPDATE等)

SHOW TABLE STATUS或在mysql datadir上运行ls -lt(可以通过运行SHOW VARIABLES LIKE'datadir'找到;)

你还有其他建议吗?

感谢。

5 个答案:

答案 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实例使用的所有文件上各种类型的使用情况计数。但是,要确定是否正在使用某个文件,您可能要重置这些计数。幸运的是,

TRUNCATE TABLE is permitted for file I/O summary tables. It resets the summary columns to zero rather than removing rows.

那么你可以

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;