全部產品
Search
文件中心

PolarDB:表資源回收筒

更新時間:Jul 06, 2024

由於DDL操作無法復原,如果開發或營運人員誤操作了資料庫(例如DROP TABLE),可能會導致資料丟失。PolarDB支援資源回收筒(Recycle Bin)功能,用於將刪除的表臨時轉移到資源回收筒,並且您可以自訂刪除表的保留時間,方便您找回資料。

前提條件

PolarDB叢集版本需為PolarDB MySQL版8.0版本且Revision version為8.0.1.1.2或以上,您可以參見查詢版本號碼確認叢集版本。

Recycle Bin原理介紹

  • 回收和清理機制

    • 回收機制

      當執行DROP TABLE語句來刪除資料表,或執行DROP DATABASE語句來刪除資料庫時,PolarDB只會保留相關的表對象,並將表對象移動到專門的Recycle Bin目錄中。其它對象的刪除策略如下:

      • 與表無關的對象,根據動作陳述式決定是否保留,不做回收。

      • 對於可能會修改表資料的表附屬對象(如TriggerForeign 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_bin_retention參數設定資源回收筒內資料的最長保留周期、loose_recycle_scheduler設定資源回收筒的非同步清理任務線程。具體操作請參見設定叢集參數和節點參數。參數說明如下:

參數

層級

說明

loose_recycle_bin

Global、Session

表資源回收筒功能開關。取值範圍如下:

  • ON:開啟表資源回收筒功能開關。

  • OFF(預設值):關閉表資源回收筒功能開關。

loose_recycle_bin_retention

Global

資源回收筒內資料的最長保留周期。取值範圍:86400~1209600,單位為秒。預設值為604800(即7天)。

loose_recycle_scheduler

Global

資源回收筒的非同步清理任務線程開關。取值範圍如下:

  • ON:開啟資源回收筒的非同步清理任務線程開關。

  • OFF(預設值):關閉資源回收筒的非同步清理任務線程開關。

管理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');