フラッシュバッククラスター
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 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 拡張機能です。