2010-10-25 52 views
3

我正在處理一個不幸有很多未使用的表的數據庫,我正在嘗試清理它。我試圖找到一種方法,我可以100%確信某個表不再被使用。MySQL發現未使用的表

一些谷歌搜索後,我仍然找不到一個好的方法來這樣做。我只能到最後寫告訴使用表(INSERT,UPDATE,等):

SHOW TABLE STATUS或運行上的MySQL的datadir ls -lt(可以通過運行SHOW VARIABLES LIKE「DATADIR」中找到)

您有任何其他建議嗎?

謝謝。

+0

我認爲確保100%的唯一方法是解決應用程序的所有表依賴性。即使過去3周沒有查詢表格,應用程序仍然可能偶爾需要它,不是嗎? – 2010-10-25 13:09:11

+0

什麼不是'SHOW TABLE STATUS'告訴你,你想知道?誠然,如果您發現表格在過去一小時內已被修改,您不知道該從何處進行,但您確實知道表格正在使用中。如果它在一年內沒有被修改,那麼這是一個很好的跡象表明它沒有被使用。 – VoteyDisciple 2010-10-25 13:09:45

+0

@Pekka - 我在代碼庫上運行了一個grep,但是可能有一些腳本在野外運行,仍然可能會使用這些表。 – 2010-10-25 13:16:14

回答

1

嘗試使用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); 

試試吧!

+0

不適用於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

+0

@KCD您對InnoDB的。如果啓用了innodb_file_per_table,則必須檢查操作系統中的.ibd文件的時間戳。 – RolandoMySQLDBA 2012-05-09 21:44:28

+0

考慮到InnoDB是MySQL 5.5以來的默認存儲引擎,這個答案很具誤導性。 – s1d 2015-10-21 07:03:14

0

我知道這是一個古老的問題,但似乎沒有一個正確的答案,我是由我自己尋找答案的指導。作爲每一個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提供了更多的細節。

它當然要求您啓用了性能模式,並且統計信息尚未被清除/截斷一段時間。