すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:ネイティブフラッシュバック

最終更新日:Jan 11, 2024

このトピックでは、ネイティブフラッシュバック機能について説明します。 この機能により、SQL文を実行して、特定の時点でデータを照会または復元できます。 これにより、意図しない操作が実行された場合に、履歴データをできるだけ早く取得することができます。

背景情報

データベースの運用中の意図しない操作は、ビジネスに深刻な影響を与える可能性があります。 この場合、バイナリログファイルからデータを復元できます。 この復元方法は、複雑で時間がかかり、エラーを起こしやすい。 データバックアップファイルからデータを復元することもできます。 この復元方法では、追加のデータベースリソースが必要になり、大量のデータを復元する場合は長時間を要する場合があります。

AliSQLのネイティブフラッシュバック機能はInnoDBでサポートされています。 簡単なSQL文を実行することで、短期間で履歴データを照会または復元できます。 これにより、データベースサービスの安定性を確保できます。

前提条件

  • RDSインスタンスは、RDS High-availability EditionまたはRDS Basic 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
  • ネイティブフラッシュバック機能を有効にするかどうかを指定します。
  • コマンド形式: -- innodb-rds-flashback-task-enabled=#
  • Parameter range: グローバルパラメータ。
  • データ型: BOOLEAN。
  • デフォルト値: OFF。
  • 有効な値: ONとOFF。
説明 ネイティブフラッシュバック機能を無効にする場合は、このパラメーターをOFFに設定し、INNODB_UNDO_RETENTIONパラメーターを0に設定する必要があります。
INNODB_UNDO_RETENTION
  • アンドゥレコードの保持期間を指定します。 保持期間が経過した後に生成されたレコードの取り消しは照会できません。 単位は秒です。
  • コマンド形式: -- innodb-undo-retention=#
  • Parameter range: グローバルパラメータ。
  • データ型: INTEGER。
  • デフォルト値:0
  • 有効な値: 0 ~ 4294967295
説明
  • このパラメーターの値が大きいほど、ネイティブのフラッシュバック機能が以前の履歴データのクエリをサポートしていることを示します。
  • INNODB_RDS_FLASHBACK_TASK_ENABLEDパラメーターをOFFに設定した場合は、INNODB_UNDO_RETENTIONパラメーターも0に設定する必要があります。
INNODB_UNDO_SPACE_SUPREMUM_サイズ
  • このパラメーターには、元に戻すテーブルスペースが占有できる最大ディスク容量を指定します。 単位:MB。 最大サイズに達すると、INNODB_UNDO_RETENTIONパラメーターの値に関係なく、元に戻すレコードは強制的に削除されます。
  • コマンド形式: -- innodb-undo-space-supremum-size=#
  • Parameter range: グローバルパラメータ。
  • データ型: INTEGER。
  • デフォルト値: 10240
  • 有効な値: 0 ~ 4294967295
INNODB_UNDO_SPACE_RESERVED_SIZE
  • このパラメーターには、元に戻すテーブルスペース用に予約されているディスクスペースの量を指定します。 単位:MB。 INNODB_UNDO_RETENTIONパラメーターの値が0でない場合、INNODB_UNDO_SPACE_RESERVED_SIZEパラメーターの値が大きいほど、元に戻すテーブルスペースで予約できる元に戻すレコードが多いことを示します。
  • コマンド形式: -- innodb-undo-space-reserved-size=#
  • Parameter range: グローバルパラメータ。
  • データ型: INTEGER。
  • デフォルト値:0
  • 有効な値: 0 ~ 4294967295
説明 このパラメーターを大きな値に設定すると、多数のアンドゥレコードが予約されます。 その結果、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秒)