フラッシュバッククエリ機能を使用すると、過去の特定の時点におけるクラスター、データベース、またはテーブルを効率的にクエリできます。
前提条件
ご利用の 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 | はい | フラッシュバックのタイムスタンプ。時刻文字列または時刻関数を指定できます。定数式のみがサポートされます。列名は使用できません。例:
|
alias alias1 alias2 alias3 | いいえ | テーブルのエイリアス。 |
join_cond1 join_cond2 | はい | JOIN 条件。 |
パラメーター
PolarDB は、フラッシュバック機能を制御するために次のパラメーターを提供します。
パラメーター名 | データ型 | 説明 |
loose_innodb_backquery_enable | BOOL | フラッシュバッククエリ機能を有効または無効にします。有効値:
|
loose_innodb_backquery_window | ULONG | フラッシュバッククエリがサポートされるタイムウィンドウ。
|
loose_innodb_backquery_capacity_limit | ULONG | フラッシュバッククエリの Undo ログ容量制限。Undo ログ容量がこの制限に達すると、フラッシュバックのタイムウィンドウが短縮されます。
|
例
このセクションでは、単一テーブルのフラッシュバッククエリの例を示します。
テストデータを準備します。
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());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)テストデータを更新します。
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)フラッシュバッククエリを実行します。
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)