フラッシュバックテーブル
FLASHBACK TABLE構文は TiDB 4.0 以降で導入されました。3 ステートメント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ようなエラーが返されます。
例
- 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で最初のDDL操作(タイプDROP TABLEまたはタイプtruncate tableを見つけます。TiDBが見つけられなかった場合は、エラーが返されます。
- TiDBは、DDLジョブの開始時刻がtikv_gc_safe_pointより前かどうかを確認します。3tikv_gc_safe_point前の場合、DROPまたはTRUNCATE操作で削除されたテーブルがGCによってクリーンアップされたことを意味し、エラーが返されます。
- TiDB は、DDL ジョブの開始時刻をスナップショットとして使用して、履歴データを読み取り、テーブル メタデータを読み取ります。
- TiDB はmysql.gc_delete_rangeのテーブルtに関連する GC タスクを削除します。
- TiDBはテーブルのメタデータのnamet1に変更し、このメタデータを使用して新しいテーブルを作成します。テーブル名のみが変更され、テーブルIDは変更されないことに注意してください。テーブルIDは、以前に削除されたテーブルtと同じです。
上記のプロセスから、TiDBは常にテーブルのメタデータに対して操作を行い、テーブルのユーザーデータは変更されていないことがわかります。復元されたテーブルt1 、以前に削除されたテーブルtと同じIDを持つため、テーブルt1 tのユーザーデータを読み取ることができます。
注記:
復元されたテーブルの ID は削除されたテーブルの ID と同じであり、TiDB では既存のすべてのテーブルにグローバルに一意のテーブル ID が必要であるため、
FLASHBACKステートメントを使用して同じ削除されたテーブルを複数回復元することはできません。
FLASHBACK TABLE操作は、TiDBがスナップショット読み取りによってテーブルメタデータを取得し、 CREATE TABLEと同様のテーブル作成プロセスを実行することで実行されます。したがって、 FLASHBACK TABLE本質的には一種のDDL操作です。
MySQLの互換性
このステートメントは、MySQL 構文に対する TiDB 拡張です。