全部產品
Search
文件中心

ApsaraDB RDS:Native Flashback

更新時間:Jun 19, 2024

Native Flashback功能可以通過SQL語句查詢或恢複指定時間點的資料,保證在誤操作後可以快速擷取歷史資料。

功能說明

資料庫營運過程中的誤操作可能會給業務帶來嚴重的影響,常見的恢複手段Binlog Flashback操作較為複雜、容易出錯且耗時較長,而通過備份組恢複則需要額外的系統資源,在資料量較大時恢復不可控。

AliSQL在InnoDB引擎上設計和實現了Native Flashback功能,無需複雜的恢複操作,通過簡單的SQL語句即可查詢或恢複誤操作前的歷史資料,節省了大量寶貴的時間,保證業務平穩運行。

前提條件

  • 執行個體為RDS MySQL 8.0基礎系列、高可用系列或叢集系列。

  • 核心小版本為20210930及以上。如何查看或升級核心小版本,請參見升級核心小版本

注意事項

  • 僅支援使用InnoDB引擎的表。

  • 需要消耗額外的undo資料表空間,可以通過innodb_undo_space_supremum_size參數進行配置。

  • Native Flashback的查詢結果取最接近指定時間點的資料,不保證查詢到的資料與指定時間點的資料完全符合。

  • 暫不支援跨DDL操作的歷史版本資料查詢和恢複。例如您無法通過Native Flashback查詢某個已經被刪除的表的內容。

文法

Native Flashback提供了全新的AS OF文法,通過該文法指定需要復原的時間。文法規則如下:

SELECT ... FROM <表名>
  AS OF TIMESTAMP <運算式>;

其中,在運算式中指定復原的時間,該運算式支援多種形式,樣本:

SELECT ... FROM tablename
  AS OF TIMESTAMP '2020-11-11 00:00:00';

SELECT ... FROM tablename
  AS OF TIMESTAMP now();

SELECT ... FROM tablename
  AS OF TIMESTAMP (SELECT now());

SELECT ... FROM tablename
  AS OF TIMESTAMP DATE_SUB(now(), INTERVAL 1 minute);

參數說明

Native Flashback功能開放了如下可配置參數:

參數名稱

說明

innodb_rds_flashback_task_enabled

  • 描述:Native Flashback的功能開關。

  • 命令列格式:--innodb-rds-flashback-task-enabled=#

  • 參數範圍:全域參數。

  • 資料類型:Boolean。

  • 預設值:OFF。

  • 取值範圍:[ON|OFF]。

說明

關閉Native Flashback功能時,需要同步將innodb_undo_retention參數設定為0。

innodb_undo_retention

  • 描述:undo記錄的保留時間長度,超出該時間長度的undo記錄無法查詢,單位:秒。

  • 命令列格式:--innodb-undo-retention=#

  • 參數範圍:全域參數。

  • 資料類型:Integer。

  • 預設值:0。

  • 取值範圍:0~4294967295。

說明
  • 該參數的值越大,Native Flashback支援的回檔查詢時間越長,同時undo資料表空間佔用的儲存空間也會上升。

  • innodb_rds_flashback_task_enabled參數設定為OFF時,需同步將本參數設定為0。

innodb_undo_space_supremum_size

  • 描述:undo資料表空間可佔用的最大磁碟空間,單位:MB。佔用空間超過這個值時,忽略innodb_undo_retention參數強制清理undo記錄。

  • 命令列格式:--innodb-undo-space-supremum-size=#

  • 參數範圍:全域參數。

  • 資料類型:Integer。

  • 預設值:10240。

  • 取值範圍:0~4294967295。

innodb_undo_space_reserved_size

  • 描述:預留的undo資料表空間大小,單位:MB。在innodb_undo_retention參數非0的情況下,將使用這部分空間儘可能多地保留undo記錄。

  • 命令列格式:--innodb-undo-space-reserved-size=#

  • 參數範圍:全域參數。

  • 資料類型:Integer。

  • 預設值:0。

  • 取值範圍:0~4294967295。

說明

該參數的值太大可能導致undo記錄過多,影響執行個體效能。如非必要,請保持該參數為0。

使用樣本

# 擷取時間點
MySQL [mytest]> select now();
+---------------------+
| now()               |
+---------------------+
| 2020-10-14 15:44:09 |
+---------------------+
1 row in set (0.00 sec)

# 查看資料
MySQL [mytest]> select * from mt1;
+----+------+
| id | c1   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
|  4 |    4 |
|  5 |    5 |
+----+------+
5 rows in set (0.00 sec)

# 不帶WHERE條件的更新操作
MySQL [mytest]> update mt1 set c1 = 100;
Query OK, 5 rows affected (0.00 sec)
Rows matched: 5  Changed: 5  Warnings: 0

MySQL [mytest]> select * from mt1;
+----+------+
| id | c1   |
+----+------+
|  1 |  100 |
|  2 |  100 |
|  3 |  100 |
|  4 |  100 |
|  5 |  100 |
+----+------+
5 rows in set (0.00 sec)

# 查詢記錄點的資料,成功返回結果
MySQL [mytest]> select * from mt1 AS OF timestamp '2020-10-14 15:44:09';
+----+------+
| id | c1   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
|  4 |    4 |
|  5 |    5 |
+----+------+
5 rows in set (0.00 sec)

# 如果超出保留的歷史資料範圍,返回失敗
MySQL [mytest]> select * from mt1 AS OF timestamp '2020-10-13 14:44:09';
ERROR 7545 (HY000): The snapshot to find is out of range

# 開始恢複資料
MySQL [mytest]> create table mt1_tmp like mt1; # 建立一個與原表結構相同的暫存資料表
Query OK, 0 rows affected (0.03 sec)  
MySQL [mytest]> insert into mt1_tmp
             -> select * from mt1 AS OF
             -> TIMESTAMP '2020-10-14 15:44:09'; # 將原表中的歷史資料寫入暫存資料表 
Query OK, 5 rows affected (0.01 sec) 
Records: 5  Duplicates: 0  Warnings: 0 
MySQL [mytest]> select * from mt1_tmp; # 確認暫存資料表中的資料是否正確 
+----+------+
| id | c1   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
|  4 |    4 |
|  5 |    5 |
+----+------+
5 rows in set (0.00 sec) 
MySQL [mytest]> rename table mt1 to mt1_bak,
             -> mt1_tmp to mt1; #(進行本操作需要先停止業務讀寫)更改原表表名為mt1_bak,並將暫存資料表名改成原表表名,完成資料恢複
Query OK, 0 rows affected (0.02 sec)
MySQL [mytest]> select * from mt1; # 確認恢複完成後的資料 
+----+------+
| id | c1   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
|  4 |    4 |
|  5 |    5 |
+----+------+ 
5 rows in set (0.01 sec)