| title | FLASHBACK CLUSTER | |
|---|---|---|
| summary | TiDB 数据库中 FLASHBACK CLUSTER 的使用概况。 | |
| aliases |
|
TiDB v6.4.0 引入了 FLASHBACK CLUSTER TO TIMESTAMP 语法,其功能是将集群的数据恢复到过去指定的时间点。指定时间点时,你可以使用日期时间和时间函数,日期时间的格式为:'2016-10-08 16:45:26.999',最小时间精度范围为毫秒,通常可只写到秒,例如 '2016-10-08 16:45:26'。
TiDB v6.5.6 开始引入了 FLASHBACK CLUSTER TO TSO 的语法,支持使用时间戳 TSO 更加精确地指定恢复时间点,实现更加灵活的数据恢复。
警告:
在指定恢复时间点时,请务必检查 TIMESTAMP 或 TSO 的有效性,避免指定可能超过 PD 当前分配的最大 TSO(参考 Grafana PD 面板上
Current TSO)的未来时间。否则,可能破坏并发处理线性一致性以及事务隔离级别,导致严重的数据正确性的问题。
注意:
FLASHBACK CLUSTER TO [TIMESTAMP|TSO]是用最新的时间戳写入特定时间点的旧数据,但不会删除当前数据,所以在使用前请确保集群有足够的存储空间来同时容纳旧数据和当前数据。
FLASHBACK CLUSTER TO TIMESTAMP '2022-09-21 16:02:50';
FLASHBACK CLUSTER TO TSO 445494839813079041;FlashbackToTimestampStmt
::= 'FLASHBACK' 'CLUSTER' 'TO' 'TIMESTAMP' stringLit
| 'FLASHBACK' 'CLUSTER' 'TO' 'TSO' LengthNum
-
FLASHBACK指定的时间点需要在 Garbage Collection (GC) life time 时间内。你可以使用系统变量tidb_gc_life_time配置数据的历史版本的保留时间(默认值是10m0s)。可以使用以下 SQL 语句查询当前的safePoint,即 GC 已经清理到的时间点:SELECT * FROM mysql.tidb WHERE variable_name = 'tikv_gc_safe_point';
-
执行
FLASHBACK CLUSTERSQL 语句的用户需要有SUPER权限。 -
在
FLASHBACK指定的时间点到开始执行的时间段内不能存在相关表结构变更的 DDL 记录。若存在,TiDB 会拒绝该 DDL 操作。 -
在执行
FLASHBACK CLUSTER前,TiDB 会主动断开所有相关表上的连接,并禁止对这些表进行读写操作,直到FLASHBACK完成。 -
FLASHBACK CLUSTER命令不能取消,一旦开始执行 TiDB 会一直重试,直到成功。
闪回到指定的 TIMESTAMP 来恢复新写入的数据:
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; -- 获取当前 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 记录,那么将执行失败:
mysql> SELECT now();
+---------------------+
| now() |
+---------------------+
| 2022-10-09 16:40:51 |
+---------------------+
1 row in set (0.01 sec)
mysql> CREATE TABLE t(a int);
Query OK, 0 rows affected (0.12 sec)
mysql> FLASHBACK CLUSTER TO TIMESTAMP '2022-10-09 16:40:51';
ERROR 1105 (HY000): Detected schema change due to another DDL job during [2022-10-09 16:40:51 +0800 CST, now), can't do flashback可以通过 Raft admin > Peer in Flashback State 监控项和日志查看 FLASHBACK 执行进度,具体的日志如下所示:
[2022/10/09 17:25:59.316 +08:00] [INFO] [cluster.go:463] ["flashback cluster stats"] ["complete regions"=9] ["total regions"=10] []
该语句是 TiDB 对 MySQL 语法的扩展。