我正在處理一個不幸有很多未使用的表的數據庫,我正在嘗試清理它。我試圖找到一種方法,我可以100%確信某個表不再被使用。MySQL發現未使用的表
一些谷歌搜索後,我仍然找不到一個好的方法來這樣做。我只能到最後寫告訴使用表(INSERT,UPDATE,等):
SHOW TABLE STATUS或運行上的MySQL的datadir ls -lt
(可以通過運行SHOW VARIABLES LIKE「DATADIR」中找到)
您有任何其他建議嗎?
謝謝。
我正在處理一個不幸有很多未使用的表的數據庫,我正在嘗試清理它。我試圖找到一種方法,我可以100%確信某個表不再被使用。MySQL發現未使用的表
一些谷歌搜索後,我仍然找不到一個好的方法來這樣做。我只能到最後寫告訴使用表(INSERT,UPDATE,等):
SHOW TABLE STATUS或運行上的MySQL的datadir ls -lt
(可以通過運行SHOW VARIABLES LIKE「DATADIR」中找到)
您有任何其他建議嗎?
謝謝。
試一下http://forums.mysql.com/read.php?20,298759,299185#msg-299185
打開「一般日誌」和掃描它(編程!)會告訴你是誰打的日誌是在什麼時間表。警告:該文件快速增長。
嘗試使用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);
試試吧!
不適用於InnoDB請參閱http://dev.mysql.com/doc/refman/5.5/en/show-table-status.html('show table status' uses'information_schema.tables') – KCD 2012-05-09 21:09:23
@KCD您對InnoDB的。如果啓用了innodb_file_per_table,則必須檢查操作系統中的.ibd文件的時間戳。 – RolandoMySQLDBA 2012-05-09 21:44:28
考慮到InnoDB是MySQL 5.5以來的默認存儲引擎,這個答案很具誤導性。 – s1d 2015-10-21 07:03:14
我知道這是一個古老的問題,但似乎沒有一個正確的答案,我是由我自己尋找答案的指導。作爲每一個Mark Leith's blog post about unused tables and indexes應該能夠做這樣的事情:
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';
Official documentation about the topic從MySQL提供了更多的細節。
它當然要求您啓用了性能模式,並且統計信息尚未被清除/截斷一段時間。
我認爲確保100%的唯一方法是解決應用程序的所有表依賴性。即使過去3周沒有查詢表格,應用程序仍然可能偶爾需要它,不是嗎? – 2010-10-25 13:09:11
什麼不是'SHOW TABLE STATUS'告訴你,你想知道?誠然,如果您發現表格在過去一小時內已被修改,您不知道該從何處進行,但您確實知道表格正在使用中。如果它在一年內沒有被修改,那麼這是一個很好的跡象表明它沒有被使用。 – VoteyDisciple 2010-10-25 13:09:45
@Pekka - 我在代碼庫上運行了一個grep,但是可能有一些腳本在野外運行,仍然可能會使用這些表。 – 2010-10-25 13:16:14