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)