Maintenance

安全永久刪除數據庫的最佳做法是什麼?

  • June 3, 2011

我們有一個“有機”的環境,這意味著人們在程式碼上堆積了十年的程式碼,而幾乎沒有監督或文件。我使用的伺服器有幾個我認為不再使用的數據庫;我很想刪除它們,只留下我實際使用的三個。

在魯莽的極端情況下,我可以禁用這些數據庫並等待有人尖叫;另一方面,我可以讓它們永遠執行“以防萬一”。您發現哪些步驟在確定是否正在使用伺服器以及如何使用方面有價值?

此外,您建議採取哪些步驟來確保隨著禁用系統的推進,它們在一段時間內仍可方便地可逆(例如,重命名對象而不是徹底刪除它們)?

謝謝!

您還想確保每個表的日期時間戳。在系統中為每個表搜尋任何元數據,按上次更新的日期時間對此類列表進行排序,並按日期時間以 desc 順序顯示輸出。您還可以檢查桌子的大小,即使是大小的微小變化。

例如,在 MySQL 5.x 中,您有 info_schema.tables,如下所示:

mysql> desc information_schema.tables;
+-----------------+---------------------+------+-----+---------+-------+
| Field           | Type                | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| TABLE_CATALOG   | varchar(512)        | NO   |     |         |       |
| TABLE_SCHEMA    | varchar(64)         | NO   |     |         |       |
| TABLE_NAME      | varchar(64)         | NO   |     |         |       |
| TABLE_TYPE      | varchar(64)         | NO   |     |         |       |
| ENGINE          | varchar(64)         | YES  |     | NULL    |       |
| VERSION         | bigint(21) unsigned | YES  |     | NULL    |       |
| ROW_FORMAT      | varchar(10)         | YES  |     | NULL    |       |
| TABLE_ROWS      | bigint(21) unsigned | YES  |     | NULL    |       |
| AVG_ROW_LENGTH  | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_LENGTH     | bigint(21) unsigned | YES  |     | NULL    |       |
| MAX_DATA_LENGTH | bigint(21) unsigned | YES  |     | NULL    |       |
| INDEX_LENGTH    | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_FREE       | bigint(21) unsigned | YES  |     | NULL    |       |
| AUTO_INCREMENT  | bigint(21) unsigned | YES  |     | NULL    |       |
| CREATE_TIME     | datetime            | YES  |     | NULL    |       |
| UPDATE_TIME     | datetime            | YES  |     | NULL    |       |
| CHECK_TIME      | datetime            | YES  |     | NULL    |       |
| TABLE_COLLATION | varchar(32)         | YES  |     | NULL    |       |
| CHECKSUM        | bigint(21) unsigned | YES  |     | NULL    |       |
| CREATE_OPTIONS  | varchar(255)        | YES  |     | NULL    |       |
| TABLE_COMMENT   | varchar(2048)       | NO   |     |         |       |
+-----------------+---------------------+------+-----+---------+-------+
21 rows in set (0.01 sec)

UPDATE_TIME 列記錄最後一次對錶應用任何 INSERT、UPDATE 或 DELETE 的時間。您可以執行這樣的查詢來找出每個數據庫最後一次訪問的時間:

上次在每個數據庫中訪問表的時間:

SELECT table_schema,MAX(update_time) last_accessed
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql')
AND update_time IS NOT NULL
GROUP BY table_schema;

上次在任何數據庫中訪問表的時間:

SELECT MAX(update_time) last_accessed FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql');

訪問表的最近 10 個日期:

SELECT * FROM
(SELECT * FROM
(SELECT last_accessed,COUNT(1) access_count
FROM (SELECT DATE(update_time) last_accessed
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql')
AND update_time IS NOT NULL) A
GROUP BY last_accessed) AA
ORDER BY last_accessed DESC) AAA
LIMIT 10;

這些只是如何從 MySQL 獲取此類元數據的幾個範例。我確信 Oracle 和 SQL Server 有類似或更好的方法。

一旦您確定數據庫(或模式)被訪問的頻率或很少,您應該手動轉儲/導出老化的數據庫以及模式本身的副本,而不是數據。請原諒我的回答與數據庫無關。SQLServer 和 Oracle DBA 也應該在這裡表達他們的答案,因為模式是數據庫實例中的集合的概念在 MySQL 中是模糊的,但在 SQLServer 和 Oracle 中卻非常嚴格地遵循。

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