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_undo_retention參數設定為0。 |
innodb_undo_retention |
說明
|
innodb_undo_space_supremum_size |
|
innodb_undo_space_reserved_size |
說明 該參數的值太大可能導致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)