Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sql-statements: flashback cluster support through ddl history #12811

Merged
merged 12 commits into from
Feb 10, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 18 additions & 16 deletions sql-statements/sql-statement-flashback-to-timestamp.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,11 @@ FlashbackToTimestampStmt ::=
```

* 执行 `FLASHBACK CLUSTER` SQL 语句的用户需要有 `SUPER` 权限。
* 在 `FLASHBACK` 指定的时间点到开始执行的时间段内不能存在相关表结构变更的 DDL 记录。若存在,TiDB 会拒绝该 DDL 操作。
* 在执行 `FLASHBACK CLUSTER TO TIMESTAMP` 前,TiDB 会主动断开所有相关表上的连接,并禁止对这些表进行读写操作,直到 `FLASHBACK` 完成。
* `FLASHBACK CLUSTER` 不支持回退修改 PD 相关信息的 DDL,如 `ALTER TABLE ATTRIBUTE`、`ALTER TABLE REPLICA`、`CREATE PLACEMENT POLICY` 等。
* `FLASHBACK CLUSTER` 指定的时间点不能存在未执行完成的 DDL 记录。若存在,TiDB 会拒绝该 DDL 操作。
* 在执行 `FLASHBACK CLUSTER TO TIMESTAMP` 前,TiDB 会主动断开所有相关表上的连接,并禁止对这些表进行读写操作,直到 `FLASHBACK CLUSTER` 完成。
* `FLASHBACK CLUSTER TO TIMESTAMP` 命令不能取消,一旦开始执行 TiDB 会一直重试,直到成功。
* 若 `FLASHBACK CLUSTER` 导致了元信息(表结构、库结构)的回滚,则相关的修改**不会**被 TiCDC 同步。因此,用户需主动暂停任务,待 `FLASHBACK CLUSTER` 完成后将上下游的 schema 定义手动同步一致,然后重新创建 TiCDC changefeed。

## 示例

Expand Down Expand Up @@ -74,22 +76,22 @@ mysql> SELECT * FROM t;
Empty set (0.00 sec)
```

如果从 `FLASHBACK` 指定的时间点到开始执行的时间段内有改变表结构的 DDL 记录,那么将执行失败
如果 `FLASHBACK CLUSTER` 指定的时间点有未完成的 DDL 记录,那么 `FLASHBACK CLUSTER` 将执行失败

```sql
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
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` 执行进度,具体的日志如下所示:
Expand Down