ネイティブフラッシュバック 機能を使用すると、SQL ステートメントで特定の時点のデータを照会または復元でき、誤操作後に履歴データを迅速に取得できます。
概要
データベースメンテナンス中の誤操作は、ビジネスに深刻な影響を与える可能性があります。バイナリログフラッシュバック などの従来のデータ復旧方法は、多くの場合、複雑でエラーが発生しやすく、時間がかかります。バックアップセット からデータを復元するには追加のシステムリソースが必要であり、大量のデータを処理する場合、復旧時間が予測できません。
AliSQL は、InnoDB ストレージエンジン向けのネイティブフラッシュバック 機能を導入しており、複雑な復旧操作が不要になります。シンプルな SQL ステートメントを使用して、誤操作前の履歴データを照会または復元でき、貴重な時間を節約して事業継続性を確保できます。
前提条件
この機能を使用するには、インスタンスのデータベースバージョンが次の要件を満たす必要があります。マイナーエンジンバージョン が要件を満たしていない場合は、更新できます。
MySQL 8.4
MySQL 8.0 (マイナーエンジンバージョン 20210930 以降)
制約
InnoDB ストレージエンジン のテーブルのみをサポートしています。
この機能は追加の UNDO 表領域を消費します。最大サイズはinnodb_undo_space_supremum_size パラメーターで設定できます。
ネイティブフラッシュバック クエリは、指定されたタイムスタンプに最も近い時点のデータを返します。完全一致は保証されません。
DDL 操作をまたいだ履歴データの照会および復元はサポートしていません。たとえば、ネイティブフラッシュバック を使用して、削除されたテーブルの内容を照会することはできません。
構文
ネイティブフラッシュバック 機能では、復元する時点を指定するためにAS OF 句を使用します。構文は次のとおりです:
SELECT ... FROM <table_name>
AS OF TIMESTAMP <expression>;式は対象の時点を指定し、複数の形式をサポートします。例:
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);パラメーター
ネイティブフラッシュバック 機能は、次のパラメーターで設定します:
パラメーター | 説明 |
innodb_rds_flashback_task_enabled |
説明 ネイティブフラッシュバック 機能を無効にする場合は、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 に、一時テーブルを mt1 に名前変更して、データ復旧を完了します。
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)