フラッシュバッククラスター
TiDB v6.4.0 ではFLASHBACK CLUSTER TO TIMESTAMP構文が導入されています。これを使用して、クラスターを特定の時点に復元できます。タイムスタンプを指定する場合、日時値を設定するか、時刻関数を使用できます。 datetime の形式は「2016-10-08 16:45:26.999」のようなもので、最小時間単位はミリ秒です。ただし、ほとんどの場合、時間単位として秒を使用してタイムスタンプを指定するだけで十分です (たとえば、「2016-10-08 16:45:26」)。
v6.5.6 および v7.1.3 以降、TiDB ではFLASHBACK CLUSTER TO TSO構文が導入されています。この構文ではTSO使用してより正確な回復時点を指定できるため、データ回復の柔軟性が向上します。
注記:
FLASHBACK CLUSTER TO [TIMESTAMP|TSO]の動作原理は、特定の時点の古いデータを最新のタイムスタンプで書き込み、現在のデータは削除しません。したがって、この機能を使用する前に、古いデータと現在のデータを保存するのに十分なstorage領域があることを確認する必要があります。
構文
FLASHBACK CLUSTER TO TIMESTAMP '2022-09-21 16:02:50';
FLASHBACK CLUSTER TO TSO 445494839813079041;
あらすじ
- FlashbackToTimestampStmt
FlashbackToTimestampStmt
::= 'FLASHBACK' 'CLUSTER' 'TO' 'TIMESTAMP' stringLit
| 'FLASHBACK' 'CLUSTER' 'TO' 'TSO' LengthNum
ノート
FLASHBACKステートメントで指定する時間は、ガベージ コレクション (GC) の有効期間内である必要があります。システム変数tidb_gc_life_time(デフォルト:10m0s) は、以前のバージョンの行の保持時間を定義します。ガベージコレクションが実行された現在のsafePointの場所は、次のクエリで取得できます。SELECT * FROM mysql.tidb WHERE variable_name = 'tikv_gc_safe_point';
SUPER権限を持つユーザーのみがFLASHBACK CLUSTERSQL ステートメントを実行できます。FLASHBACK CLUSTERALTER TABLE ATTRIBUTE、ALTER TABLE REPLICA、CREATE PLACEMENT POLICYなどの PD 関連情報を変更する DDL ステートメントのロールバックをサポートしません。FLASHBACKステートメントで指定された時点で、完全に実行されていない DDL ステートメントがあってはなりません。そのような DDL が存在する場合、TiDB はそれを拒否します。FLASHBACK CLUSTERを実行する前に、TiDB は関連するすべての接続を切断し、ステートメントFLASHBACK CLUSTER完了するまでこれらのテーブルに対する読み取りおよび書き込み操作を禁止します。FLASHBACK CLUSTERステートメントは実行後にキャンセルできません。 TiDB は成功するまで再試行を続けます。FLASHBACK CLUSTERの実行中にデータをバックアップする必要がある場合は、 復元するのみを使用し、FLASHBACK CLUSTERの開始時刻よりも前のBackupTSを指定できます。さらに、FLASHBACK CLUSTERの実行中にログのバックアップを有効にすると失敗します。したがって、FLASHBACK CLUSTERが完了した後でログのバックアップを有効にするようにしてください。FLASHBACK CLUSTERステートメントによってメタデータ (テーブル構造、データベース構造) のロールバックが発生した場合、関連する変更は TiCDC によってレプリケートされません。したがって、タスクを手動で一時停止し、FLASHBACK CLUSTERの完了を待ち、アップストリームとダウンストリームのスキーマ定義を手動でレプリケートして、一貫性があることを確認する必要があります。その後、TiCDC 変更フィードを再作成する必要があります。
例
次の例は、クラスターを特定のタイムスタンプにフラッシュバックして、新しく挿入されたデータを復元する方法を示しています。
mysql> CREATE TABLE t(a INT);
Query OK, 0 rows affected (0.09 sec)
mysql> SELECT * FROM t;
Empty set (0.01 sec)
mysql> SELECT now();
+---------------------+
| now() |
+---------------------+
| 2022-09-28 17:24:16 |
+---------------------+
1 row in set (0.02 sec)
mysql> INSERT INTO t VALUES (1);
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * FROM t;
+------+
| a |
+------+
| 1 |
+------+
1 row in set (0.01 sec)
mysql> FLASHBACK CLUSTER TO TIMESTAMP '2022-09-28 17:24:16';
Query OK, 0 rows affected (0.20 sec)
mysql> SELECT * FROM t;
Empty set (0.00 sec)
次の例は、クラスターを特定の TSO にフラッシュバックして、誤って削除されたデータを正確に復元する方法を示しています。
mysql> INSERT INTO t VALUES (1);
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * FROM t;
+------+
| a |
+------+
| 1 |
+------+
1 row in set (0.01 sec)
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@tidb_current_ts; -- Get the current TSO
+--------------------+
| @@tidb_current_ts |
+--------------------+
| 446113975683252225 |
+--------------------+
1 row in set (0.00 sec)
mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
mysql> DELETE FROM t;
Query OK, 1 rows affected (0.00 sec)
mysql> FLASHBACK CLUSTER TO TSO 446113975683252225;
Query OK, 0 rows affected (0.20 sec)
mysql> SELECT * FROM t;
+------+
| a |
+------+
| 1 |
+------+
1 row in set (0.01 sec)
FLASHBACKステートメントで指定された時間に完全に実行されていない DDL ステートメントがある場合、 FLASHBACKステートメントは失敗します。
mysql> ALTER TABLE t ADD INDEX k(a);
Query OK, 0 rows affected (0.56 sec)
mysql> ADMIN SHOW DDL JOBS 1;
+--------+---------+-----------------------+------------------------+--------------+-----------+----------+-----------+---------------------+---------------------+---------------------+--------+
| JOB_ID | DB_NAME | TABLE_NAME | JOB_TYPE | SCHEMA_STATE | SCHEMA_ID | TABLE_ID | ROW_COUNT | CREATE_TIME | START_TIME | END_TIME | STATE |
+--------+---------+-----------------------+------------------------+--------------+-----------+----------+-----------+---------------------+---------------------+---------------------+--------+
| 84 | test | t | add index /* ingest */ | public | 2 | 82 | 0 | 2023-01-29 14:33:11 | 2023-01-29 14:33:11 | 2023-01-29 14:33:12 | synced |
+--------+---------+-----------------------+------------------------+--------------+-----------+----------+-----------+---------------------+---------------------+---------------------+--------+
1 rows in set (0.01 sec)
mysql> FLASHBACK CLUSTER TO TIMESTAMP '2023-01-29 14:33:12';
ERROR 1105 (HY000): Detected another DDL job at 2023-01-29 14:33:12 +0800 CST, can't do flashback
ログを通じて、 FLASHBACKの実行の進行状況を取得できます。以下は例です。
[2022/10/09 17:25:59.316 +08:00] [INFO] [cluster.go:463] ["flashback cluster stats"] ["complete regions"=9] ["total regions"=10] []
MySQLの互換性
このステートメントは、MySQL 構文に対する TiDB 拡張機能です。