全部產品
Search
文件中心

ApsaraDB RDS:Recycle Bin

更新時間:Aug 02, 2024

由於DDL語句無法復原,開發或營運人員如果誤操作(例如DROP TABLE)可能會導致資料丟失。阿里雲支援資源回收筒(Recycle Bin)功能,臨時將刪除的錶轉移到資源回收筒,還可以設定保留的時間,方便您找回資料,同時提供了工具包(DBMS_RECYCLE)便於您快捷使用。

前提條件

執行個體版本如下:

  • RDS MySQL 8.0(核心小版本20191225及以上)

  • RDS MySQL 5.7(核心小版本20210430及以上)

Recycle Bin參數

Recycle Bin設計了如下五個參數。

參數

說明

loose_recycle_bin

是否開啟資源回收筒功能,包括session層級和global層級。您可以在控制台修改參數。預設值:OFF。

loose_recycle_bin_retention

資源回收筒保留時間,單位:秒。預設為604800,即一周。您可以在控制台修改參數。

loose_recycle_scheduler

是否開啟資源回收筒的非同步清理任務線程。您可以在控制台修改參數。預設值:OFF。

loose_recycle_scheduler_interval

資源回收筒非同步清理任務線程的輪詢間隔,單位:秒。預設為30。暫不開放。

loose_recycle_scheduler_purge_table_print

是否列印非同步清理現場工作的詳細日誌。預設值:OFF。暫不開放。

重要

為了防止磁碟空間被佔滿,建議合理設定保留時間,並開啟後台清理任務線程。

Recycle Bin介紹

  • 回收/清理機制

    • 回收機制

      執行TRUNCATE TABLE語句時,將原始表移動到專門的recycle bin目錄中,並在原位置使用相同的結構建立新表。

      說明

      僅RDS MySQL 8.0(核心小版本20200331及以上)支援。

      執行DROP TABLE/DATABASE語句時,只保留相關的表對象,並移動到專門的recycle bin目錄中。其它對象的刪除策略如下:

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

      • 如果是表的附屬對象,可能會修改表資料的,做刪除處理,例如Trigger和Foreign key。 但Column statistics不做清理,隨表進入資源回收筒。

    • 清理機制

      資源回收筒會啟動一個後台線程,來非同步清理超過recycle_bin_retention時間的表對象。在清理資源回收筒表的時候,如果遇到大表,會再啟動一個後台線程非同步刪除大表。

  • 許可權

    RDS MySQL執行個體啟動時,會初始化一個名為__recycle_bin__的資料庫,作為資源回收筒使用的專有資料庫。__recycle_bin__是系統級資料庫,您無法直接進行修改和刪除。

    對於資源回收筒內的表,雖然您無法直接執行drop table語句,但是可以使用call dbms_recycle.purge_table('<TABLE>');進行清理。

    說明

    帳號在原表和資源回收筒表都需要具有DROP許可權。

  • 資源回收筒表命名規則

    Recycle Bin會從不同的資料庫回收到統一的__recycle_bin__資料庫中,所以需要保證目標表表名唯一,所以定義了如下命名格式:

    "__" + <Storage Engine> + <SE private id>

    參數說明如下。

    參數

    說明

    Storage Engine

    儲存引擎名稱。

    SE private id

    儲存引擎為每一個表產生的唯一值。例如在InnoDB引擎中就是table id。

  • 獨立回收

    回收的設定只會影響該執行個體本身,不會影響到日誌複製到的節點(備執行個體、唯讀執行個體和災備執行個體)上。例如我們可以在主執行個體上設定回收,保留7天;在備執行個體上設定回收,保留14天。

    說明

    資源回收筒保留周期不同,將導致執行個體的空間佔用差別比較大。

注意事項

  • 如果資源回收筒資料庫和待回收的表跨了檔案系統,執行drop table語句將會搬遷資料表空間檔案,耗時較長。

  • 如果Tablespace為General,可能會存在多個表共用同一個資料表空間的情況,當回收其中一張表的時候,不會搬遷相關的資料表空間檔案。

管理Recycle Bin

AliSQL在Recycle Bin中提供三種管理功能。詳細說明如下:

  • 查看資源回收筒中臨時儲存的表

    DBMS_RECYCLE中提供展示資源回收筒中所有臨時儲存的表的介面。命令如下:

    call dbms_recycle.show_tables();

    樣本:

    mysql> 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

    資源回收筒的資料庫名。

    TABLE

    進入資源回收筒後的表名。

    ORIGIN_SCHEMA

    原資料庫名。

    ORIGIN_TABLE

    原表名。

    RECYCLED_TIME

    回收時間。

    PURGE_TIME

    預計從資源回收筒刪除的時間。

  • 手動清理資源回收筒中的表

    DBMS_RECYCLE中提供手動清理資源回收筒中的表的介面命令如下:

    call dbms_recycle.purge_table('<TABLE>');
    說明
    • TABLE為進入資源回收筒後的表名。

    • 帳號在原表和資源回收筒表都需要具有DROP許可權。

    樣本:

    call dbms_recycle.purge_table('__innodb_1063');
  • 恢複資源回收筒內的表資料

    • DBMS_RECYCLE中提供恢複資源回收筒內的表的介面。

      命令樣本如下:

      call dbms_recycle.restore_table('<RECYCLE_TABLE>','<DEST_DB>','<DEST_TABLE>');

      參數說明如下。

      參數

      說明

      RECYCLE_TABLE

      需要恢複的資源回收筒內的表名。

      說明

      如果僅傳入此參數,會恢複到原始表。

      DEST_DB

      目標資料庫名。

      DEST_TABLE

      目標表名。

      說明

      由於restore_table命令需要SUPER許可權,因此暫不支援手動執行。

      樣本:

      mysql> call dbms_recycle.restore_table('__innodb_1063','testDB','testTable');
    • 使用INSERT ... SELECT恢複資源回收筒內的表資料。

      首先查詢資源回收筒中所有臨時儲存的表,在SQL返回結果中查詢要恢複的表在__recycle_bin__庫中對應的表名。建立有相同表結構的目標表,通過INSERT ... SELECT將資料匯入到目標表中。樣本如下:

      mysql> call dbms_recycle.show_tables();
      +-----------------+---------------+---------------+--------------+---------------------+---------------------+
      | SCHEMA          | TABLE         | ORIGIN_SCHEMA | ORIGIN_TABLE | RECYCLED_TIME       | PURGE_TIME          |
      +-----------------+---------------+---------------+--------------+---------------------+---------------------+
      | __recycle_bin__ | __innodb_1132 | sbtest        | sbtest1      | 2024-07-31 15:08:56 | 2024-08-07 15:08:56 |
      +-----------------+---------------+---------------+--------------+---------------------+---------------------+
      1 row in set (0.00 sec)
      
      mysql> CREATE TABLE `db1`.`t1` (
          ->   `id` int NOT NULL AUTO_INCREMENT,
          ->   `k` int NOT NULL DEFAULT '0',
          ->   `c` char(120) NOT NULL DEFAULT '',
          ->   `pad` char(60) NOT NULL DEFAULT '',
          ->   PRIMARY KEY (`id`),
          ->   KEY `k_1` (`k`)
          -> ) ENGINE=InnoDB AUTO_INCREMENT=400001 DEFAULT CHARSET=utf8mb3;
      Query OK, 0 rows affected, 1 warning (0.01 sec)
      
      mysql> insert into `db1`.`t1` select * from `__recycle_bin__`.`__innodb_1132`;
      Query OK, 400000 rows affected (2.76 sec)
      Records: 400000  Duplicates: 0  Warnings: 0