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 | 必須 | フラッシュバックのタイムスタンプ。 これは、時間ストリングまたは他の時間関数である。 定数式である必要があり、列名を含めることはできません。 例:
|
alias alias1 alias2 alias3 | 選択可能 | テーブルのエイリアスを設定します。 |
join_cond1 join_cond2 | 必須 | 結合条件。 |
パラメーター
PolarDBには、フラッシュバッククエリ機能を正確に制御するための次のパラメーターが用意されています。
パラメーター | タイプ | 説明 |
loose_innodb_backquery_enable | BOOL | フラッシュバッククエリ機能を有効にするかどうかを指定します。 有効な値:
|
loose_innodb_backquery_window | ULONG | フラッシュバッククエリ機能を実装する時間範囲を指定します。 有効な値: 1 ~ 604800 単位は秒です。 デフォルト値: 86400 |
loose_innodb_backquery_capacity_limit | ULONG | フラッシュバッククエリでサポートされる元に戻すログのサイズを指定します。 この値に達すると、システムはフラッシュバッククエリの時間を短縮します。 有効な値: 100〜200000000。 単位:MB。 デフォルト値: 100000000 |
例
例では、単一テーブルのフラッシュバックが使用されています。
データを準備します。
13:51 on August 31, 2021
に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());
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)
データを更新します。
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)
フラッシュバッククエリを実行します。
14:00:00 on August 31, 2021
に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)