MySQL查找未使用的表

MySQL查找未使用的表,mysql,mysql-management,Mysql,Mysql Management,我正在使用一个数据库,不幸的是它有很多未使用的表,我正在尝试清理它。我试图找到一种方法,使我能够100%确信某个特定的表不再被使用 在谷歌搜索了一段时间后,我仍然找不到一个好的方法。我只能通过以下方式来判断对表的最后写入(插入、更新等): 在mysql datadir上显示表状态或运行ls-lt(可以通过运行诸如“datadir”之类的显示变量找到) 你还有其他建议吗 谢谢。试试看 打开“常规日志”并扫描它(按程序!)会告诉您在日志打开期间谁正在点击哪些表。注意:该文件增长速度很快。尝试使用信息

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

在谷歌搜索了一段时间后,我仍然找不到一个好的方法。我只能通过以下方式来判断对表的最后写入(插入、更新等):

在mysql datadir上显示表状态或运行
ls-lt
(可以通过运行诸如“datadir”之类的显示变量找到)

你还有其他建议吗

谢谢。

试试看


打开“常规日志”并扫描它(按程序!)会告诉您在日志打开期间谁正在点击哪些表。注意:该文件增长速度很快。

尝试使用
信息\u模式。表
。有一列名为
UPDATE\u 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);
选择表模式、表名称、创建时间、更新时间
来自信息\u schema.tables
其中表_schema不在('information_schema','mysql')中
并且引擎不是空的
和((更新时间<(现在()-间隔10天))或更新时间为空);

试试看

我知道这是一个老问题,但似乎没有一个正确的答案,我在这里是受我自己寻找答案的指导。根据我们的经验,每个人都应该能够做这样的事情:

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';
选择
t*
从performance_schema.table_io_waitis_summary_by_table t
哪里
t、 计数=0
和t.OBJECT_SCHEMA=''
和t.OBJECT_TYPE='TABLE';
MySQL提供了更多细节


当然,这需要您启用了性能模式,并且统计数据已经有一段时间没有被清除/截断。

我很惊讶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\u 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;
然后观察哪些文件的计数增加

一个警告:由于某些表只能在应用程序启动时读取,因此您可能需要重新启动应用程序(甚至服务器),并查看这是否会增加访问计数

有关文件\u摘要\u按\u实例表的详细信息,请参阅

好吧,这个问题很久以前就有人问过了,但我希望这个答案能对将来的人有所帮助

SHOW TABLE STATUS where `Rows` = 0;

我认为100%确定的唯一方法是解决应用程序的所有表依赖关系。即使一个表在过去3周内没有被查询过,应用程序也可能偶尔需要它,不是吗?
SHOW table STATUS
没有告诉您想知道什么?当然,如果您看到一个表在过去一个小时内被修改,您不知道从哪里开始,但您知道该表正在使用中。如果它在一年内没有被修改,这很好地表明它没有被使用。@Pekka-我在代码库上运行了一个grep,但可能有一些脚本在野外运行,仍然可能使用这些表。@VoteyDiscip-不幸的是,它不能在所有引擎上工作,例如InnoDB。不适用于InnoDB请参阅(
show table status
使用
information\u schema.tables
)@KCD您适合InnoDB。如果您启用了InnoDB\u file\u per\u table,您必须从操作系统检查.ibd文件的时间戳。考虑到InnoDB是mysql 5.5以来的默认存储引擎,这个答案相当误导。