列出未使用的數據庫
我想顯示未使用的數據庫。為此,我嘗試了此查詢,但結果集為空:
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 #3
、FACTOR #4
或兩者的組合來獲得有關正在使用或未使用哪些數據庫的真實視圖。
所以時間不是一個因素?正如 Rolando 所逃避的那樣,您將錯過不在您查詢的時間範圍內的事情。
或者,您可以將 long_query_time 設置為 0 以記錄在實例上執行的所有查詢並保留一段時間。您應該擷取所有內容,但可以說您有 common_schema 之類的東西,並且可能很少使用它以超出擷取範圍。
一旦您對收集的持續時間感到滿意,您可以執行一些 sed|awk 來解析日誌以計算對錶/dbs 的訪問,以與實例上存在的模式列表進行比較。
有一些提升要做,但不是很重。