由於DDL操作無法復原,如果開發或營運人員誤操作了資料庫(例如DROP TABLE),可能會導致資料丟失。PolarDB支援資源回收筒(Recycle Bin)功能,用於將刪除的表臨時轉移到資源回收筒,並且您可以自訂刪除表的保留時間,方便您找回資料。
開啟表資源回收筒會佔用一定量儲存空間併產生儲存費用,請您根據業務情況設定“資源回收筒內資料的最長保留周期”。
前提條件
適用的資料庫引擎版本如下,如何查看核心版本,請參見查詢版本號碼。
PolarDB MySQL版8.0.1版本且修訂版本為8.0.1.1.2及以上。
PolarDB MySQL版8.0.2版本且修訂版本為8.0.2.1.0及以上。
Recycle Bin原理介紹
回收和清理機制
回收機制
當執行
DROP TABLE語句來刪除資料表,或執行DROP DATABASE語句來刪除資料庫時,PolarDB只會保留相關的表對象,並將表對象移動到專門的Recycle Bin目錄中。其它對象的刪除策略如下:與表無關的對象,根據動作陳述式決定是否保留,不做回收。
對於可能會修改表資料的表附屬對象(如
Trigger和Foreign key),進行刪除操作。但Column statistics不會被刪除,而是隨表進入資源回收筒。
清理機制
資源回收筒會啟動一個後台線程,來非同步清理超過recycle_bin_retention時間的表對象。在清理資源回收筒中表的時候,如果遇到大表,系統會再啟動一個後台線程非同步刪除大表。
許可權
PolarDB叢集啟動時,系統會初始化一個資料庫
__recycle_bin__,作為資源回收筒使用的專有資料庫。__recycle_bin__是系統級資料庫,您無法直接進行修改和刪除。對於資源回收筒內的表,雖然您無法直接執行
DROP TABLE語句,但是可以使用call dbms_recycle.purge_table('table name');對錶進行清理。說明執行清理操作的資料庫帳號在原表和資源回收筒表都需要具有DROP許可權。
資源回收筒表命名規則
Recycle Bin會從不同的資料庫中回收表對象到
__recycle_bin__資料庫中。因此需要定義如下的表名格式,用來保證目標表名的唯一性:"__" + <Storage Engine> + <SE private id>參數說明如下:
參數
說明
Storage Engine儲存引擎名稱。
SE private id儲存引擎為每一個表產生的唯一值。例如在InnoDB引擎中就是
table id。獨立回收
例如您可以在主節點上設定資源回收筒內資料的最長保留周期為7天;在唯讀節點上設定資源回收筒內資料的最長保留周期為14天。
說明設定不同的資源回收筒內資料的最長保留周期,將導致叢集的儲存空間佔用差別較大。
注意事項
如果資源回收筒資料庫
__recycle_bin__和待回收的表在不同的檔案系統中,執行DROP TABLE語句將會搬遷資料表空間檔案,耗時較長。如果資料表空間為
General,可能會存在多個表共用同一個資料表空間的情況。當回收資料表空間中的其中一張表時候,不會搬遷相關的資料表空間檔案。
費用說明
表資源回收筒功能所使用的空間屬於叢集儲存空間的一部分,需要收取儲存費用,詳情請參見儲存空間計費規則。
使用方法
您可以通過調整參數loose_recycle_bin來控製表資源回收筒功能的開啟與關閉。開啟表資源回收筒功能後,將根據回收機制進行資料的回收。同時,表資源回收筒功能的清理機制預設為關閉狀態。建議您開啟清理機制,以避免產生較多檔案佔用儲存空間並導致額外費用的產生。
參數loose_recycle_scheduler用於控製表資源回收筒的清理機制。若未啟用清理機制,則將忽略參數loose_recycle_bin_retention的設定,資料將長期保留,不會自動清理。
參數 | 層級 | 說明 |
loose_recycle_bin | Global、Session | 表資源回收筒功能開關。取值範圍如下:
|
loose_recycle_scheduler | Global | 資源回收筒的非同步清理任務線程開關。取值範圍如下:
|
loose_recycle_bin_retention | Global | 資源回收筒內資料的最長保留周期。取值範圍:86400~1209600(即14天),單位為秒。預設值為604800(即7天)。 重要 資源回收筒清理任務線程狀態如下:
|
管理Recycle Bin
Recycle Bin提供了如下SQL語句來管理Recycle Bin:
show_tables
查看資源回收筒中所有臨時儲存的表。
call dbms_recycle.show_tables()樣本:
call dbms_recycle.show_tables(); +-----------------+---------------+---------------+--------------+---------------------+---------------------+ | SCHEMA | TABLE | ORIGIN_SCHEMA | ORIGIN_TABLE | RECYCLED_TIME | PURGE_TIME | +-----------------+---------------+---------------+--------------+---------------------+---------------------+ | __recycle_bin__ | __innodb_1063 | product_db | t1 | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | | __recycle_bin__ | __innodb_1064 | product_db | t2 | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | | __recycle_bin__ | __innodb_1065 | product_db | parent | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | | __recycle_bin__ | __innodb_1066 | product_db | child | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | +-----------------+---------------+---------------+--------------+---------------------+---------------------+ 4 rows in set (0.00 sec)參數說明如下:
參數
說明
SCHEMA資源回收筒的Schema。
TABLE進入資源回收筒後的表名。
ORIGIN_SCHEMA原始表的Schema。
ORIGIN_TABLE原始表的表名。
RECYCLED_TIME回收時間。
PURGE_TIME預計在資源回收筒中被清理的時間。
purge_table
手動清理資源回收筒中的表。
call dbms_recycle.purge_table('TABLE_NAME')說明TABLE_NAME為進入資源回收筒後的表名。執行清理操作的資料庫帳號在原表和資源回收筒表都需要具有DROP許可權。
樣本:
mysql> call dbms_recycle.purge_table('__innodb_1063');restore_table
快速恢複資源回收筒內的表。
call dbms_recycle.restore_table('RECYCLE_TABLE','DEST_DB','DEST_TABLE');說明PolarDB MySQL版8.0版本叢集版的Revision version為8.0.1.1.12或以上才支援通過
restore_table命令,快速恢複資源回收筒內的表。您可以參見查詢版本號碼確認叢集版本。執行此命令需要有資料庫
__recycle_bin__的ALTER_ACL和DROP_ACL許可權,以及目標表的CREATE_ACL和INSERT_ACL許可權。
參數說明如下:
參數
說明
RECYCLE_TABLE需要恢複的表在資源回收筒內的表名。
說明如果僅傳入此參數,會恢複到原始表。
DEST_DB為恢複後的表指定目標資料庫。
DEST_TABLE為恢複後的表指定新的表名。
樣本:
call dbms_recycle.restore_table('__innodb_1063','testDB','testTable');
聯絡我們
若您對DDL操作有任何疑問,請聯絡我們。