機能説明
データベース運用保守プロセスにおいて誤操作が発生する可能性があり、これらの誤操作はビジネスに深刻な影響を与える恐れがあります。誤操作によって業務が影響を受けた場合、一般的な復旧手段としてはロールバックやクローンなどの操作がありますが、少量のデータ変更や緊急障害復旧においては、ミスが発生しやすく時間もかかり、データ量が大きい場合の復旧時間は制御不能です。
TXSQLチームはInnodbエンジン上にフラッシュバッククエリ機能を設計・実装し、単純なSQL文を使用するだけで誤操作前の履歴データを照会可能としました。特定のSQL構文で指定時点のデータを照会することで、大量のデータ検索と復旧時間を大幅に削減し、誤操作後のデータを迅速に復旧させ、ビジネスの早期復旧を確保します。
サポートバージョン
カーネルバージョンはTDSQL-C for MySQL 5.7の2.1.13.001以上です。
カーネルバージョンはTDSQL-C for MySQL 8.0の3.1.10以上です。
適用シーン
フラッシュバッククエリ機能は、データベース運用保守プロセスにおいて誤操作後に履歴データを迅速に照会するために使用されます。
本機能を使用する際には、以下の点に注意が必要です:
Innodb物理テーブルのみサポートされ、ビューやその他のエンジンはサポートされていません。また、last_insert_id()など実際の列に対応しない関数もサポートされていません。
秒単位のフラッシュバッククエリのみサポートされ、100%の正確性を保証するものではありません。1秒以内に複数の変更があった場合、いずれかの変更がクエリされる可能性があります。
フラッシュバッククエリは主キー(または GEN_CLUST_INDEX)のみサポートします。
prepared statementおよびstored procedureでの使用はサポートしていません。
DDLはサポートされていません。テーブルに対してDDL(例:truncate table - このような操作はごみ箱からの復元を推奨)を実行した場合、フラッシュバッククエリの結果が期待通りでない可能性があります。
同一ステートメント内で同じテーブルに複数のフラッシュバッククエリ時間を指定した場合、現在のクエリ時間から最も古い時間が選択されます。
プライマリインスタンスとスタンバイインスタンスの間に時間差が生じるため、同じ時間を指定してフラッシュバッククエリを実行しても、両インスタンスで取得される結果が異なる可能性があります。
フラッシュバッククエリを有効にすると、undoログのクリーンアップが遅延し、メモリ使用量が増加します。Innodb_backquery_windowの設定を過大(推奨値は900~1800)にすることは推奨されません。特にビジネスアクセスが頻繁なインスタンスでは注意が必要です。
データベースインスタンスが再起動またはクラッシュした場合、再起動またはクラッシュ前の履歴情報を照会できなくなります。指定された時間はサポート範囲内である必要があります(サポート範囲はステータス変数 Innodb_backquery_up_time および Innodb_backquery_low_time で確認可能です。show status like '%backquery%'を実行します)。
使用説明
フラッシュバッククエリは新しいAS OF構文を提供します。パラメータ設定でInnodb_backquery_enableパラメータをONに設定することで本機能を有効化し、特定の構文を使用して指定時点のデータを照会できます。構文は以下の通りです:
SELECT ... FROM <テーブル名>
AS OF TIMESTAMP <時間>;
指定時間クエリの参考例
MySQL [test]> create table t1(id int,c1 int) engine=innodb;
Query OK, 0 rows affected (0.06 sec)
MySQL [test]> insert into t1 values(1,1),(2,2),(3,3),(4,4);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
MySQL [test]> select now();
+---------------------+
| now() |
+---------------------+
| 2023-08-17 15:50:01 |
+---------------------+
1 row in set (0.00 sec)
MySQL [test]> delete from t1 where id=4;
Query OK, 1 row affected (0.00 sec)
MySQL [test]> select * from t1;
+------+------+
| id | c1 |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.00 sec)
MySQL [test]> select * from t1 as of timestamp '2023-08-17 15:50:01';
+------+------+
| id | c1 |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+------+------+
4 rows in set (0.00 sec)
履歴データを介したテーブル作成の例
create table t3 select * from t1 as of timestamp '2023-08-17 15:50:01';
履歴データのテーブルへの挿入例
insert into t4 select * from t1 as of timestamp '2023-08-17 15:50:01';
フラッシュバッククエリは永続化をサポートしており、メモリ内のリードビュー情報を定期的に物理テーブルに永続化できます。これにより再起動後も、再起動前のフラッシュバッククエリを実行可能です。この機能を有効にするには、フラッシュバッククエリを有効化した上で永続化スイッチをオンにする必要があります(永続化設定:innodb_backquery_persistent = ON)。そうでない場合は無効になります。
説明:
フラッシュバッククエリの永続化機能を利用するには、TDSQL-C for MySQL 8.0 カーネルバージョンが3.1.15以上である必要があります。
パラメータ説明
以下の表では、フラッシュバッククエリ機能で設定可能なパラメータの説明を列举します。
|
innodb_backquery_enable | グローバルパラメータ | Boolean | OFF | ON/OFF | いいえ | フラッシュバッククエリ機能のスイッチ。 |
innodb_backquery_window | グローバルパラメータ | Integer | 900 | 1 - 86400 | いいえ | フラッシュバッククエリがサポートする時間範囲(単位:秒)。このパラメータの値が大きいほど、フラッシュバッククエリでサポートされる履歴データの照会期間が長くなりますが、同時にundo表領域が占有するストレージスペースも増加します。 |
innodb_backquery_history_limit | グローバルパラメータ | Integer | 8000000 | 1 - 9223372036854476000 | いいえ | undo履歴リンクリストの長さ制限。設定値を超えると、Innodb_backquery_windowを無視してパージがトリガーされ、履歴リンクリストの長さが設定値より低くなるまで継続します。 |
innodb_backquery_persistent | 非グローバルパラメータ | Boolean | OFF | ON/OFF | いいえ | フラッシュバッククエリ永続化のスイッチ。 |