Mysql

列出未使用的數據庫

  • July 18, 2013

我想顯示未使用的數據庫。為此,我嘗試了此查詢,但結果集為空:

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA where SCHEMA_NAME NOT
       IN (SELECT db FROM INFORMATION_SCHEMA.PROCESSLIST);
    Empty set (0.70 sec)

我使用 MySQL 5.5.24。

有什麼建議?

該查詢假設正在使用的數據庫是 DB Session 的目前數據庫,這是您在身份驗證時設置的。某些因素會繞過您的定義:

因素#1:快速查詢

如果您執行一個需要毫秒/微秒的查詢,那麼您的查詢有 99.9%/99.9999% 的機會會錯過這個毫秒/微秒視窗來查看該快速查詢。

因素 #2:具有顯式命名數據庫的表

如果您連接到數據庫db1並執行SELECT A.* FROM db2.tblname;,那麼您實際上正在訪問兩個數據庫,一個用於會話,一個用於查詢。

完全可以在沒有預設數據庫的情況下進行連接。這將使您的查詢無用。您應該解析查詢以檢查具有顯式命名數據庫的表。您可以從 的Info列中獲取數據庫連接的目前查詢INFORMATION_SCHEMA.PROCESSLIST

因素#3:打開文件句柄

訪問表後,您可以在作業系統中查看表的時間戳。例如:

lsof | grep "\.ibd$" | awk '{print $9}'

對於為innodb_file_per_table配置的 MySQL 實例,這將向您顯示具有打開文件句柄的 InnoDB 表的所有文件。

這個命令

lsof | grep "\.MYD$" | awk '{print $9}'

給你打開的 MyISAM 表的列表。

獲取命令的輸出,從每個文件中解析數據庫,然後計數。

因素#4:文件時間戳

您可以進入作業系統,獲取表文件的時間戳,併計算上次訪問表的時間。可以為帶有列INFORMATION_SCHEMA.TABLES的 MyISAM 執行此操作。UPDATE_TIME對於 InnoDB,您必須轉到作業系統。請參閱我的 StackOverflow 文章,了解如何.

結語

您可能需要藉助FACTOR #3FACTOR #4或兩者的組合來獲得有關正在使用或未使用哪些數據庫的真實視圖。

所以時間不是一個因素?正如 Rolando 所逃避的那樣,您將錯過不在您查詢的時間範圍內的事情。

或者,您可以將 long_query_time 設置為 0 以記錄在實例上執行的所有查詢並保留一段時間。您應該擷取所有內容,但可以說您有 common_schema 之類的東西,並且可能很少使用它以超出擷取範圍。

一旦您對收集的持續時間感到滿意,您可以執行一些 sed|awk 來解析日誌以計算對錶/dbs 的訪問,以與實例上存在的模式列表進行比較。

有一些提升要做,但不是很重。

引用自:https://dba.stackexchange.com/questions/46628