我正在使用一个数据库,不幸的是它有很多未使用的表,我正在尝试清理它。我正在尝试找到一种方法,让我可以 100% 确信某个特定的表不再被使用。
经过一番谷歌搜索,我仍然找不到这样做的好方法。我只能使用以下命令告诉最后一次写入表(INSERT、UPDATE 等):
SHOW TABLE STATUS 或ls -lt
在 mysql datadir 上运行(可以通过运行 SHOW VARIABLES LIKE 'datadir'; 找到)
你有什么其他的建议?
谢谢。
我正在使用一个数据库,不幸的是它有很多未使用的表,我正在尝试清理它。我正在尝试找到一种方法,让我可以 100% 确信某个特定的表不再被使用。
经过一番谷歌搜索,我仍然找不到这样做的好方法。我只能使用以下命令告诉最后一次写入表(INSERT、UPDATE 等):
SHOW TABLE STATUS 或ls -lt
在 mysql datadir 上运行(可以通过运行 SHOW VARIABLES LIKE 'datadir'; 找到)
你有什么其他的建议?
谢谢。
尝试使用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);
试试看 !!!
我知道这是一个老问题,但似乎没有正确的答案,我是通过自己寻找答案而被引导到这里的。根据Mark Leith 关于未使用的表和索引的博客文章,应该能够执行以下操作:
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 中有关该主题的官方文档提供了更多详细信息。
当然,它确实要求您启用了性能模式并且统计信息已经有一段时间没有被清除/截断。
试试http://forums.mysql.com/read.php?20,298759,299185#msg-299185
打开“通用日志”并扫描它(以编程方式!)会告诉您在日志打开期间谁在访问哪些表。注意:该文件增长很快。
我对 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 实例使用的所有文件的各种类型的使用计数。但是,要判断文件是否正在被使用,您可能需要重置这些计数。幸运的是,
文件 I/O 汇总表允许使用 TRUNCATE TABLE。它将汇总列重置为零,而不是删除行。
这样你就可以,
mysql> truncate table file_summary_by_instance;
然后观察哪些文件的计数增加了。
一个警告:因为某些表可能只在应用程序启动时读取,您可能需要重新启动应用程序(甚至服务器)并查看这是否会增加访问次数。
有关file_summary_by_instance表的更多详细信息,请参阅 https://dev.mysql.com/doc/refman/5.7/en/file-summary-tables.html
好吧,从很久以前就有人问过这个问题,但我希望这个答案对将来的人有所帮助。
SHOW TABLE STATUS where `Rows` = 0;