フラッシュバッククラスター
TiDB v6.4.0 では、 FLASHBACK CLUSTER TO TIMESTAMP
構文が導入されました。これを使用して、クラスターを特定の時点に復元できます。タイムスタンプを指定する場合、datetime 値を設定するか、time 関数を使用できます。datetime の形式は '2016-10-08 16:45:26.999' のようで、最小時間単位はミリ秒です。ただし、ほとんどの場合、'2016-10-08 16:45:26' のように、時間単位として秒を使用してタイムスタンプを指定すれば十分です。
v6.5.6、v7.1.3、v7.5.1、v7.6.0 以降、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 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
の実行中にデータをバックアップする必要がある場合は、 バックアップと復元使用して、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 拡張です。