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

PolarDB:Flashback query

最終更新日:Mar 06, 2026

フラッシュバッククエリ機能を使用すると、過去の特定の時点におけるクラスター、データベース、またはテーブルを効率的にクエリできます。

前提条件

  • ご利用の PolarDB クラスターは、次のいずれかのバージョン要件を満たす必要があります。

    • PolarDB for MySQL 8.0.2、リビジョンバージョン 8.0.2.2.21 以降

    • PolarDB for MySQL 8.0.1、リビジョンバージョン 8.0.1.1.32 以降

    • PolarDB for MySQL 5.7、リビジョンバージョン 5.7.1.0.25 以降

    • PolarDB for MySQL 5.6、リビジョンバージョン 5.6.1.0.36 以降

    クラスターのバージョンを確認する方法の詳細については、「バージョン番号のクエリ」をご参照ください。

  • フラッシュバッククエリ機能を使用するには、innodb_backquery_enable パラメーターを有効にする必要があります。このパラメーターはデフォルトで無効になっています。この機能を使用する前に、ご利用の PolarDB クラスターの パラメーター ページで innodb_backquery_enable パラメーターを有効にする必要があります。

    説明

    innodb_backquery_enable パラメーターを有効にする前にフラッシュバッククエリを実行すると、システムはエラー ERROR 1815 (HY000): Internal error: the backquery_time set is out of range, too old を返します。

注意事項

  • フラッシュバッククエリは、単一テーブルのシナリオで使用してください。JOIN やサブクエリを含むような複雑なクエリでの使用は避けてください。

  • フラッシュバッククエリにはプライマリキーを使用してください。セカンダリインデックスはサポートされていません。セカンダリインデックスを使用すると、クエリは全表スキャンに変換され、クエリパフォーマンスが低下します。

  • Undo ログには履歴データが格納されます。フラッシュバッククエリ機能を有効にすると、innodb_backquery_window で設定されたタイムウィンドウ内で Undo 表領域が大きくなります。表領域は BLOB シナリオでも大きくなる可能性があります。この増加により、書き込みパフォーマンスがわずかに低下する場合があります。

  • フラッシュバッククエリを実行すると、Undo ログの数が増加します。削除マークが付いたレコードが迅速にパージされない場合があります。これにより、場合によってはクエリ速度が低下する可能性があります。

  • 1 つのレコードが保持できる履歴バージョンは最大 100,000 です。この制限を超えるレコードに対してフラッシュバッククエリを実行すると、システムはエラー record undo history version exceed limit を返します。

  • DDL 操作を実行した後、操作前に存在していたデータに対してフラッシュバッククエリを実行することはできません。このデータをクエリしようとすると、システムはエラー Backquery primary key invisible を返す可能性があります。

  • この機能が有効になった後に削除されたテーブルは、フラッシュバッククエリを使用して表示できます。この機能が有効になる前に削除されたテーブルは、フラッシュバッククエリを使用して表示することはできません。

  • フラッシュバッククエリはスナップショット読み取りでのみ有効です。ロック読み取りを使用すると、エラー This query in backquery is not a consistent read, please check. が返されます。以下は、一般的なロック読み取り文です。

    /*REPEATABLE-READ 以上の分離レベルで S ロックを追加します*/
    INSERT INTO t1 SELECT * FROM t2 
    
    /*REPEATABLE-READ 以上の分離レベルで S ロックを追加します*/
    REPLACE INTO t1 SELECT * FROM t2 
    
    /*REPEATABLE-READ 以上の分離レベルで S ロックを追加します*/
    UPDATE t SET ... FROM (SELECT ...) AS h 
    
    /*REPEATABLE-READ 以上の分離レベルで S ロックを追加します*/
    CREATE TABLE t1 AS SELECT * FROM t2 
    
    /*S ロック*/
    UPDATE t1 JOIN (SELECT ...) t2 ON ... SET ... 
    
    /*X ロック*/
    SELECT * FROM t FOR UPDATE 
    
    /*S ロック*/
    SELECT * FROM t LOCK IN SHARE MODE 

構文

  • 単一テーブルのフラッシュバッククエリ

    SELECT column_name_list FROM table_name AS OF TIMESTAMP time_expr alias WHERE...;
  • 複数テーブルのフラッシュバッククエリ

    SELECT column_name_list FROM table1_name AS OF TIMESTAMP time_expr alias1,table2_name AS OF TIMESTAMP time_expr alias2 WHERE... ;
  • 複数テーブルの JOIN フラッシュバッククエリ

    SELECT column_name_list FROM table1_name AS OF TIMESTAMP time_expr alias1 
    JOIN table2_name AS OF TIMESTAMP time_expr alias2 ON join_cond1 
    JOIN table3_name AS OF TIMESTAMP time_expr alias3 ON join_cond2
    WHERE...;

次の表に、構文のパラメーターを示します。

パラメーター名

必須

説明

column_name_list

はい

クエリ対象の列名。

table_name

table1_name

table2_name

table3_name

はい

テーブル名。

time_expr

はい

フラッシュバックのタイムスタンプ。時刻文字列または時刻関数を指定できます。定数式のみがサポートされます。列名は使用できません。例:

  • 時刻文字列:'2021-08-31 14:00:00'。

  • 時刻関数:FROM_UNIXTIMESTAMP(unix_timestamp('2024-01-01 00:00:00'))CONVERT(unix_timestamp('2024-01-01 00:00:00'), DATETIME)

alias

alias1

alias2

alias3

いいえ

テーブルのエイリアス。

join_cond1

join_cond2

はい

JOIN 条件。

パラメーター

PolarDB は、フラッシュバック機能を制御するために次のパラメーターを提供します。

パラメーター名

データ型

説明

loose_innodb_backquery_enable

BOOL

フラッシュバッククエリ機能を有効または無効にします。有効値:

  • ON:機能を有効にします。

  • OFF:機能を無効にします。(デフォルト)

loose_innodb_backquery_window

ULONG

フラッシュバッククエリがサポートされるタイムウィンドウ。

  • 有効値:1~604800。

  • 単位:秒。

  • デフォルト値:86400。

loose_innodb_backquery_capacity_limit

ULONG

フラッシュバッククエリの Undo ログ容量制限。Undo ログ容量がこの制限に達すると、フラッシュバックのタイムウィンドウが短縮されます。

  • 有効値:100~200000000。

  • 単位:MB。

  • デフォルト値:100000000。

このセクションでは、単一テーブルのフラッシュバッククエリの例を示します。

  1. テストデータを準備します。

    2021-08-31 13:51 に、products テーブルを作成し、データを挿入します。

    create table products (
           prod_id bigint(10) primary key NOT NULL,
           prod_name varchar(20) NOT NULL,
           cust_id bigint(10) NULL,
           createtime datetime NOT NULL DEFAULT NOW()
    );
    
    INSERT INTO  products(prod_id,prod_name,cust_id,createtime)
    values
    (101,'Book',1,NOW()),(102,'Apple',1,NOW()),(103,'Beef',2,NOW()),(104,'Bread',3,NOW()),(105,'Cheese',4,NOW());
    
                            
  2. products テーブルのデータをクエリします。

    SELECT * FROM products;
    +---------+-----------+---------+---------------------+
    | prod_id | prod_name | cust_id | createtime          |
    +---------+-----------+---------+---------------------+
    |     101 | Book      |       1 | 2021-08-31 13:51:22 |
    |     102 | Apple     |       1 | 2021-08-31 13:51:24 |
    |     103 | Beef      |       2 | 2021-08-31 13:51:26 |
    |     104 | Bread     |       3 | 2021-08-31 13:51:27 |
    |     105 | Cheese    |       4 | 2021-08-31 13:51:29 |
    +---------+-----------+---------+---------------------+
    5 rows in set (0.00 sec)
  3. テストデータを更新します。

    2021-08-31 14:18 に、products テーブルのデータを更新します。

    UPDATE products SET prod_id = 110, createtime = NOW() WHERE prod_name = "Book";
    UPDATE products SET prod_id = 119, createtime = NOW() WHERE prod_name = "Apple";
    
    SELECT * FROM products;
    +---------+-----------+---------+---------------------+
    | prod_id | prod_name | cust_id | createtime          |
    +---------+-----------+---------+---------------------+
    |     103 | Beef      |       2 | 2021-08-31 13:51:26 |
    |     104 | Bread     |       3 | 2021-08-31 13:51:27 |
    |     105 | Cheese    |       4 | 2021-08-31 13:51:29 |
    |     110 | Book      |       1 | 2021-08-31 14:18:21 |
    |     119 | Apple     |       1 | 2021-08-31 14:18:22 |
    +---------+-----------+---------+---------------------+
    5 rows in set (0.00 sec)
  4. フラッシュバッククエリを実行します。

    2021-08-31 14:00:00 の時点の products テーブルのデータを表示します。

    SELECT * FROM products AS of TIMESTAMP '2021-08-31 14:00:00';
    +---------+-----------+---------+---------------------+
    | prod_id | prod_name | cust_id | createtime          |
    +---------+-----------+---------+---------------------+
    |     101 | Book      |       1 | 2021-08-31 13:51:22 |
    |     102 | Apple     |       1 | 2021-08-31 13:51:24 |
    |     103 | Beef      |       2 | 2021-08-31 13:51:26 |
    |     104 | Bread     |       3 | 2021-08-31 13:51:27 |
    |     105 | Cheese    |       4 | 2021-08-31 13:51:29 |
    +---------+-----------+---------+---------------------+
    5 rows in set (0.00 sec)