MySQL单机版Recycle Bin回收站功能
最近調研了阿里的Recycle Bin回收站功能,可以保證數據不丟失。
為了防止開發或運維人員的誤操作,比如DROP TABLE/DATABASE、TRUNCATE TABLE,這類DDL語句不具有可操作的回滾特性,而導致數據丟失,AliSQL 8.0(基于MySQL)新特性支持回收站功能(Recycle Bin),臨時把刪除的表轉移到回收站,并保留可設置的時間,方便用戶找回數據。為了方便,提供了?DBMS_RECYCLE package?作為管理接口。
前提條件 MySQL單機版
實例版本如下:
- RDS MySQL 8.0
- RDS MySQL 5.7
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 | 是否打印異步清理現場工作的詳細日志。暫不開放。 |
Recycle Bin介紹
- 回收/清理機制
- 回收機制執行TRUNCATE TABLE語句時,將原始表移動到專門的recycle bin目錄中,并在原位置使用相同的結構創建新表。
說明 僅RDS MySQL 8.0支持。
執行DROP TABLE/DATABASE語句時,只保留相關的表對象,并移動到專門的recycle bin目錄中。其它對象的刪除策略如下:
- 如果是與表無關的對象,根據操作語句決定是否保留,不做回收。
- 如果是表的附屬對象,可能會修改表數據的,做刪除處理,例如Trigger和Foreign key。 但Column statistics不做清理,隨表進入回收站。
- 清理機制
回收站會啟動一個后臺線程,來異步清理超過recycle_bin_retention時間的表對象。在清理回收站表的時候,如果遇到大表,會再啟動一個后臺線程異步刪除大表。
- 回收機制執行TRUNCATE TABLE語句時,將原始表移動到專門的recycle bin目錄中,并在原位置使用相同的結構創建新表。
- 權限
RDS MySQL實例啟動時,會初始化一個名為__recycle_bin__的數據庫,作為回收站使用的專有數據庫。__recycle_bin__是系統級數據庫,您無法直接進行修改和刪除。
對于回收站內的表,雖然您無法直接執行drop table語句,但是可以使用call dbms_recycle.purge_table('<TABLE>');進行清理。
說明 賬號在原表和回收站表都需要具有DROP權限。
- 回收站表命名規則
Recycle Bin會從不同的數據庫回收到統一的__recycle_bin__數據庫中,所以需要保證目標表表名唯一,所以定義了如下命名格式:
參數說明如下。
| Storage Engine | 存儲引擎名稱。 |
| SE private id | 存儲引擎為每一個表生成的唯一值。例如在InnoDB引擎中就是table id。 |
獨立回收
回收的設置只會影響該實例本身,不會影響到binlog復制到的節點(備實例、只讀實例和災備實例)上。例如我們可以在主實例上設置回收,保留7天;在備實例上設置回收,保留14天。
注意事項
- 如果回收站數據庫和待回收的表跨了文件系統,執行drop table語句將會搬遷表空間文件,耗時較長。
- 如果Tablespace為General,可能會存在多個表共享同一個表空間的情況,當回收其中一張表的時候,不會搬遷相關的表空間文件。
管理Recycle Bin
AliSQL在DBMS_RECYCLE中定義了兩個管理接口。詳細說明如下:
- show_tables展示回收站中所有臨時保存的表。命令如下: call dbms_recycle.show_tables();
?參數如下:
| SCHEMA | 回收站的數據庫名。 |
| TABLE | 進入回收站后的表名。 |
| ORIGIN_SCHEMA | 原數據庫名。 |
| ORIGIN_TABLE | 原表名。 |
| RECYCLED_TIME | 回收時間。 |
| PURGE_TIME | 預計從回收站刪除的時間。 |
purge_table
手動清理回收站中的表。命令如下:
call dbms_recycle.purge_table('<TABLE>');- TABLE為進入回收站后的表名。
- 賬號在原表和回收站表都需要具有DROP權限。
示例:
call dbms_recycle.purge_table('__innodb_1063');總結
以上是生活随笔為你收集整理的MySQL单机版Recycle Bin回收站功能的全部內容,希望文章能夠幫你解決所遇到的問題。