フラッシュバッククラスター
TiDB v6.4.0 では、 FLASHBACK CLUSTER TO TIMESTAMP
構文が導入されました。これを使用すると、クラスターを特定の時点に復元できます。タイムスタンプを指定する際は、datetime 値を設定するか、time 関数を使用できます。datetime の形式は「2016-10-08 16:45:26.999」のように、最小時間単位はミリ秒です。ただし、ほとんどの場合は「2016-10-08 16:45:26」のように、秒を時間単位としてタイムスタンプを指定すれば十分です。
TiDB v6.5.6、v7.1.3、v7.5.1、v7.6.0以降では、 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 | 'TSO' LengthNum)
注記
FLASHBACK
文で指定する時間は、ガベージコレクション(GC)の有効期間内である必要があります。システム変数tidb_gc_life_time
(デフォルト:10m0s
)は、以前のバージョンの行の保持期間を定義します。ガベージコレクションが実行された現在のsafePoint
、次のクエリで取得できます。SELECT * FROM mysql.tidb WHERE variable_name = 'tikv_gc_safe_point';
SUPER
権限を持つユーザーのみがFLASHBACK CLUSTER
SQL ステートメントを実行できます。FLASHBACK CLUSTER
、ALTER TABLE ATTRIBUTE
、ALTER TABLE REPLICA
、CREATE PLACEMENT POLICY
などの PD 関連情報を変更する DDL ステートメントのロールバックをサポートしていません。FLASHBACK
ステートメントで指定された時点で、完全に実行されていない DDL ステートメントは存在できません。そのような DDL が存在する場合、TiDB はそれを拒否します。FLASHBACK CLUSTER
実行する前に、TiDB は関連するすべての接続を切断し、FLASHBACK CLUSTER
ステートメントが完了するまでこれらのテーブルに対する読み取りおよび書き込み操作を禁止します。FLASHBACK CLUSTER
ステートメントは実行後にキャンセルできません。TiDB は成功するまで再試行を続けます。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 拡張です。