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

PolarDB:フラッシュバッククエリ

最終更新日:Oct 12, 2024

PolarDB for MySQLを使用すると、フラッシュバッククエリ機能を使用して、クラスター、データベース、およびテーブルからデータを過去の時点で効率的に取得できます。

前提条件

  • PolarDBクラスターは、次のいずれかの要件を満たしています。

    • リビジョンバージョンが8.0.2.2.2以降のPolarDB for MySQL 8.0.2クラスター。

    • リビジョンバージョンが8.0.1.1.24以降のPolarDB for MySQL 8.0.1クラスター

    • リビジョンバージョンが5.7.1.0.21以降のPolarDB for MySQL 5.7クラスター

    • リビジョンバージョンが5.6.1.0.32以降のPolarDB for MySQL 5.6クラスター

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

  • フラッシュバッククエリ機能を使用するには、innodb_backquery_enableパラメーターをONに設定する必要があります。 デフォルトでは、このパラメータはOFFに設定されています。 したがって、この機能を使用する前に、PolarDBクラスターの パラメーター ページでinnodb_backquery_enableをONに設定する必要があります。

    説明

    innodb_backquery_enableをONに設定する前にフラッシュバッククエリを実行すると、「ERROR 1815 (HY000): 内部エラー: backquery_timeセットが範囲外、古すぎる」メッセージが返されます。

注意事項

  • JOINやサブクエリなどの複雑なクエリシナリオではなく、単一テーブルシナリオでフラッシュバッククエリを使用することをお勧めします。

  • フラッシュバッククエリでは主キーを使用することを推奨します。 二次インデックスはフラッシュバッククエリではサポートされていません。 フラッシュバッククエリでセカンダリインデックスを使用すると、テーブル全体のスキャンが実行され、クエリのパフォーマンスは低くなります。

  • innodb_backquery_windowパラメーターで指定された時間枠内でフラッシュバッククエリ機能を有効にすると、一部の履歴差分データが元に戻すログに保持されるため、元に戻すテーブルスペースが増加します。 BLOBシナリオでは、テーブルスペースも増加します。 この間、書き込み性能が若干低下することがあります。

  • 1つのレコードに対して最大100,000の履歴バージョンを提供できます。 この制限に達した後にレコードに対してフラッシュバッククエリを実行すると、「レコードの取り消し履歴バージョンが制限を超えています」というエラーメッセージが返されます。

  • DDLステートメントの実行後、フラッシュバッククエリを実行して前のデータを取得することはできません。 この場合、「Backquery primary key invisible」エラーメッセージが返されることがあります。

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

構文

  • シングルテーブルのFlashbackクエリ構文

    SELECT column_name_list FROM table_name AS OF TIMESTAMP time_expr alias WHERE...;
  • 複数のテーブルのFlashbackクエリ構文

    SELECT column_name_list FROM table1_name AS OF TIMESTAMP time_expr alias1,table2_name AS OF TIMESTAMP time_expr alias2 WHERE... ;
  • 複数のテーブルを結合するためのFlashbackクエリ構文

    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

必須

結合条件。

パラメーター

PolarDBには、フラッシュバッククエリ機能を正確に制御するための次のパラメーターが用意されています。

パラメーター

タイプ

説明

loose_innodb_backquery_enable

BOOL

フラッシュバッククエリ機能を有効にするかどうかを指定します。 有効な値:

  • ON

  • OFF (デフォルト)

loose_innodb_backquery_window

ULONG

フラッシュバッククエリ機能を実装する時間範囲を指定します。

有効な値: 1 ~ 604800 単位は秒です。 デフォルト値: 86400

loose_innodb_backquery_capacity_limit

ULONG

フラッシュバッククエリでサポートされる元に戻すログのサイズを指定します。 この値に達すると、システムはフラッシュバッククエリの時間を短縮します。

有効な値: 100〜200000000。

単位:MB。

デフォルト値: 100000000

例では、単一テーブルのフラッシュバックが使用されています。

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

    13:51 on August 31, 2021productsという名前のテーブルを作成します。 テーブルにデータを挿入します。

    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. データを更新します。

    14:18 8月31日2021製品テーブルを更新します。

    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. フラッシュバッククエリを実行します。

    14:00:00 on August 31, 2021productsテーブルのデータを照会します。

    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)