フラッシュバックテーブル
FLASHBACK TABLE
構文は、TiDB4.0以降に導入されました。 FLASHBACK TABLE
ステートメントを使用して、ガベージコレクション(GC)の有効期間内にDROP
またはTRUNCATE
操作によってドロップされたテーブルとデータを復元できます。
システム変数tidb_gc_life_time
(デフォルト: 10m0s
)は、以前のバージョンの行の保持時間を定義します。ガラベージ収集が実行された現在のsafePoint
は、次のクエリで取得できます。
SELECT * FROM mysql.tidb WHERE variable_name = 'tikv_gc_safe_point';
tikv_gc_safe_point
回後にテーブルがDROP
またはTRUNCATE
ステートメントドロップされる限り、 FLASHBACK TABLE
ステートメントを使用してテーブルを復元できます。
構文
FLASHBACK TABLE table_name [TO other_table_name]
あらすじ
- FlashbackTableStmt
- TableName
- FlashbackToNewName
FlashbackTableStmt ::=
'FLASHBACK' 'TABLE' TableName FlashbackToNewName
TableName ::=
Identifier ( '.' Identifier )?
FlashbackToNewName ::=
( 'TO' Identifier )?
ノート
テーブルがドロップされ、GCの有効期間が過ぎた場合、 FLASHBACK TABLE
ステートメントを使用してドロップされたデータを回復することはできなくなります。そうしないと、 Can't find dropped / truncated table 't' in GC safe point 2020-03-16 16:34:52 +0800 CST
のようなエラーが返されます。
TiDB Binlogを有効にして、 FLASHBACK TABLE
ステートメントを使用するときは、次の条件と要件に注意してください。
- ダウンストリームのセカンダリクラスタも
FLASHBACK TABLE
をサポートする必要があります。 - セカンダリクラスタのGCライフタイムは、プライマリクラスタのGCライフタイムより長くする必要があります。
- アップストリームとダウンストリーム間のレプリケーションの遅延も、ダウンストリームへのデータの回復に失敗する原因となる可能性があります。
- TiDB Binlogがテーブルを複製しているときにエラーが発生した場合は、TiDB Binlogでそのテーブルをフィルタリングし、そのテーブルのすべてのデータを手動でインポートする必要があります。
例
DROP
の操作でドロップされたテーブルデータを回復します。DROP TABLE t;FLASHBACK TABLE t;TRUNCATE
の操作で削除されたテーブルデータを回復します。切り捨てられたテーブルt
はまだ存在するため、回復するにはテーブルt
の名前を変更する必要があります。そうしないと、テーブルt
がすでに存在するため、エラーが返されます。TRUNCATE TABLE t;FLASHBACK TABLE t TO t1;
実装の原則
テーブルを削除する場合、TiDBはテーブルのメタデータのみを削除し、削除するテーブルデータ(行データとインデックスデータ)をmysql.gc_delete_range
のテーブルに書き込みます。 TiDBバックグラウンドのGCワーカーは、GCの有効期間を超えるキーをmysql.gc_delete_range
のテーブルから定期的に削除します。
したがって、テーブルをリカバリするには、GCワーカーがテーブルデータを削除する前に、テーブルメタデータをリカバリし、 mysql.gc_delete_range
のテーブルの対応する行レコードを削除するだけで済みます。 TiDBのスナップショット読み取りを使用して、テーブルのメタデータを回復できます。読み取りスナップショットの詳細については、 履歴データを読むを参照してください。
以下はFLASHBACK TABLE t TO t1
の作業プロセスです:
- TiDBは、最近のDDL履歴ジョブを検索し、表
t
でDROP TABLE
またはtruncate table
タイプの最初のDDL操作を見つけます。 TiDBが1つを見つけられなかった場合、エラーが返されます。 - TiDBは、DDLジョブの開始時刻が
tikv_gc_safe_point
より前かどうかをチェックします。tikv_gc_safe_point
より前の場合は、DROP
またはTRUNCATE
操作でドロップされたテーブルがGCによってクリーンアップされ、エラーが返されたことを意味します。 - TiDBは、DDLジョブの開始時刻をスナップショットとして使用して、履歴データを読み取り、テーブルのメタデータを読み取ります。
- TiDBは、
mysql.gc_delete_range
の表t
に関連するGCタスクを削除します。 - TiDBは、テーブルのメタデータの
name
をt1
に変更し、このメタデータを使用して新しいテーブルを作成します。テーブル名のみが変更され、テーブルIDは変更されないことに注意してください。テーブルIDは、前にドロップしたテーブルt
のIDと同じです。
上記のプロセスから、TiDBは常にテーブルのメタデータを操作し、テーブルのユーザーデータは変更されていないことがわかります。復元されたテーブルt1
は以前に削除されたテーブルt
と同じIDを持っているため、 t1
はt
のユーザーデータを読み取ることができます。
ノート:
復元されたテーブルのIDは削除されたテーブルのIDと同じであり、TiDBでは既存のすべてのテーブルにグローバルに一意のテーブルIDが必要であるため、
FLASHBACK
のステートメントを使用して同じ削除済みテーブルを複数回復元することはできません。
FLASHBACK TABLE
の操作は、TiDBがスナップショットの読み取りを通じてテーブルのメタデータを取得し、 CREATE TABLE
と同様のテーブル作成のプロセスを実行することによって実行されます。したがって、 FLASHBACK TABLE
は本質的に一種のDDL操作です。
MySQLの互換性
このステートメントは、MySQL構文のTiDB拡張です。