このトピックでは、ネイティブフラッシュバック機能について説明します。 この機能により、SQL文を実行して、特定の時点でデータを照会または復元できます。 これにより、意図しない操作が実行された場合に、履歴データをできるだけ早く取得することができます。
説明
データベースの運用中の意図しない操作は、ビジネスに深刻な影響を与える可能性があります。 この場合、バイナリログファイルからデータを復元できます。 この復元方法は、複雑で時間がかかり、エラーを起こしやすい。 データバックアップファイルからデータを復元することもできます。 この復元方法では、追加のデータベースリソースが必要になり、大量のデータを復元する場合は長時間を要する場合があります。
AliSQLのネイティブフラッシュバック機能はInnoDBでサポートされています。 簡単なSQL文を実行することで、短期間で履歴データを照会または復元できます。 これにより、データベースサービスの安定性を確保できます。
前提条件
RDSインスタンスは、RDS Basic Edition、RDS High-availability Edition、またはRDS Cluster EditionでMySQL 8.0を実行します。
RDSインスタンスのマイナーエンジンバージョンが20210930以降です。 マイナーエンジンバージョンを表示または更新する方法の詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
使用上の注意
ネイティブフラッシュバック機能は、InnoDBテーブルでのみサポートされます。
ネイティブフラッシュバック機能は、追加の取り消しテーブルスペースを消費します。 innodb_undo_space_supremum_sizeパラメーターを設定して、元に戻すテーブルスペースを指定できます。 詳細については、「パラメーター」をご参照ください。
ネイティブフラッシュバック機能は、指定された時点に最も近い時点のデータを返しますが、クエリ結果が指定された時点のデータと完全に一致することを保証することはできません。
ネイティブフラッシュバック機能を使用して、DDL操作が実行されたテーブルのデータを照会または復元することはできません。 たとえば、ネイティブフラッシュバック機能を使用して、削除されたテーブルのデータを照会することはできません。
構文
ネイティブフラッシュバック機能は、テーブルを復元する時点を指定するために使用される新しいAS OF
構文を提供します。 次のコードは、AS OF構文を示しています。
SELECT... FROM <テーブルの名前>
タイムスタンプのように <表現>;
Expressionパラメーターは、テーブルを復元する時点を指定し、複数の形式をサポートします。 例:
SELECT... タブラメから
タイムスタンプの時点 '2020-11-11 00:00:00 ';
SELECT... タブラメから
現在のタイムスタンプ ();
SELECT... タブラメから
タイムスタンプの時点 (今すぐ選択 ());
SELECT... タブラメから
TIMESTAMP DATE_SUBの時点 (now() 、インターバル1分);
パラメーター
次の表に、ネイティブフラッシュバック機能のパラメーターを示します。
パラメーター | 説明 |
innodb_rds_flashback_task_enabled |
説明 ネイティブフラッシュバック機能を無効にする場合は、このパラメーターをOFFに設定し、innodb_undo_retentionパラメーターを0に設定する必要があります。 |
innodb_undo_保持 |
説明
|
innodb_undo_space_supremum_サイズ |
|
innodb_undo_space_reserved_サイズ |
説明 このパラメーターを大きな値に設定すると、多数のアンドゥレコードが予約されます。 その結果、RDSインスタンスのパフォーマンスが低下します。 このパラメーターを0に設定することを推奨します。 |
例
# ポイントを取得します。
MySQL [mytest]> 今すぐ選択 ();
+ --------------------- +
| now() |
+ --------------------- +
| 2020-10-14 15:44:09 |
+ --------------------- +
セットの1列 (0.00秒)
# テーブルのデータを照会します。
MySQL [mytest]> select * from mt1;
+ ---- + ------
| id | c1 |
+ ---- + ------
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+ ---- + ------
セットの5行 (0.00秒)
# WHERE句を含まない更新操作を実行します。
MySQL [mytest]> update mt1 set c1 = 100;
クエリOK、影響を受ける5行 (0.00秒)
一致した行: 5変更: 5警告: 0
MySQL [mytest]> select * from mt1;
+ ---- + ------
| id | c1 |
+ ---- + ------
| 1 | 100 |
| 2 | 100 |
| 3 | 100 |
| 4 | 100 |
| 5 | 100 |
+ ---- + ------
セットの5行 (0.00秒)
# ある時点で履歴データを照会します。 結果は正常に返されます。
MySQL [mytest]> select * from mt1 ASタイムスタンプ '2020-10-14 15:44:09 ';
+ ---- + ------
| id | c1 |
+ ---- + ------
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+ ---- + ------
セットの5行 (0.00秒)
# 履歴データの保持期間内でない時点で履歴データを照会します。 エラーメッセージが返されます。
MySQL [mytest]> select * from mt1 ASタイムスタンプ '2020-10-13 14:44:09 ';
エラー7545 (HY000): 見つけるスナップショットが範囲外です
# テーブルのデータを復元します。
MySQL [mytest]> mt1のようにテーブルmt1_tmpを作成します。# 元のテーブルと同じスキーマを使用する一時テーブルを作成します。
クエリOK、影響を受ける0行 (0.03秒)
MySQL [mytest]> mt1_tmpに挿入
-> select * from mt1 AS OF
-> TIMESTAMP '2020-10-14 15:44:09 '; # 元のテーブルから一時テーブルに履歴データを書き込みます。
クエリOK、影響を受ける5行 (0.01秒)
記録: 5重複: 0警告: 0
MySQL [mytest]> select * from mt1_tmp; # 一時テーブルのデータを確認します。
+ ---- + ------
| id | c1 |
+ ---- + ------
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+ ---- + ------
セットの5行 (0.00秒)
MySQL [mytest]> テーブルmt1の名前をmt1_bakに変更し、
-> mt1_tmp to mt1; #(この操作を実行する前に、元のテーブルの読み取り操作と書き込み操作を停止する必要があります) 。元のテーブルの名前をmt1_bakに変更し、一時テーブルの名前を元のテーブルの元の名前に変更して、データの復元を完了します。
クエリOK、影響を受ける0行 (0.02秒)
MySQL [mytest]> select * from mt1; # 復元プロセス後にデータが正しいことを確認します。
+ ---- + ------
| id | c1 |
+ ---- + ------
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+ ---- + ------
セットの5行 (0.01秒)