按库构建 TiFlash 副本后新增的表不会自动同步?

【 TiDB 使用环境】POC

【 TiDB 版本】6.1.0

【遇到的问题】按库构建TiFlash副本,新增的表不会自动同步

【复现路径】

  1. 按库构建tiflash副本
ALTER DATABASE test SET TIFLASH REPLICA 1;
  1. 在该库创建新表并写入数据
  2. 使用
SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = 'test';

查看同步进度,发现并没有新表的进度

按照这个排查一下

我之前又做了一次 ALTER DATABASE test SET TIFLASH REPLICA 1就可以了,不清楚是bug还是说这就是期望的行为

按库构建之后,新表预期应该会被自动同步吗?

tiflash是按照表构建的。
库是不行的。

ALTER DATABASE db_name SET TIFLASH REPLICA count; (6.0 之后版本支持的) 语句相当于 TiDB 为用户执行一系列为该数据库中表添加 tiflash 副本的 ddl 操作。该语句只会给库中当前所有的表添加 tiflash 副本,帖子中描述的行为是符合预期的。

库新增的表还需要手动操作下?这个可以提给官方 tiflash常见问题 https://docs.pingcap.com/zh/tidb/stable/troubleshoot-tiflash#tiflash-数据不同步

这个其实就相当于批量执行了按表执行添加tiflash的操作,省去了人工逐个表添加了。人工添加在未来新增加表,也是需要重新执行添加tiflash的操作。这个也许可以吧这个给库添加tiflash的操作记录在某个地方,以后新增加表都去判断下所在库是否有这个操作,有的话就给新表做添加操作。

参考一下:https://tidb.net/blog/8c069774
其中提到:

  • 从按库构建 TiFlash 副本命令执行开始到该库中所有表都已同步完成之前,不建议执行和该库相关的 TiFlash 副本数量设置或其他 DDL 操作,否则最终状态可能非预期。非预期场景包括:
    • 先设置 TiFlash 副本数量为 2,在库中所有的表都同步完成前,再设置 TiFlash 副本数量为 1,不能保证最终所有表的 TiFlash 副本数量都为 1 或都为 2。
    • 在命令执行到结束期间,如果在该库下创建表,则可能会对这些新增表创建 TiFlash 副本。
    • 在命令执行到结束期间,如果为该库下的表添加索引,则该命令可能陷入等待,直到添加索引完成。
  • 按库构建 TiFlash 副本命令会跳过系统表、视图、临时表以及包含了 TiFlash 不支持字符集的表。

在实际操作过程中,要考虑以上提示信息。其中在按库构建 TiFlash 副本命令执行到结束期间,如果在目标库下创建表,则可能会对这些新增表创建 TiFlash 副本,存在不确定性; 全部同步执行之后,再创建表,则确定会为这些新增表创建 TiFlash 副本。(经验证只有在create table like的情况下,才自动创建tiflash副本)

根据测试的结果,按库构建副本,如果ddl没有在后台执行完,结果是不可预期的,是否执行完,通过:

SELECT * FROM INFORMATION_SCHEMA.TIFLASH_REPLICA WHERE TABLE_SCHEMA = 'TESTDB';

查看。

原因是 alter database xxx set tiflash replica xx; 这个 SQL 的内部执行过程不保证原子性,通过多个设置 tiflash 表副本的 ddl 来完成工作,所以在 SQL 执行过程中对于新添加的表是否执行了对应的 ddl 是不确定的。
另外 SQL 执行完成之后,对于后续新添加的表也不会自动设置 tiflash replica。
参考文档:https://docs.pingcap.com/zh/tidb/stable/create-tiflash-replicas#按库构建-tiflash-副本

我又测试了一下,建库完成之后,如果执行的是create table test1 like test;操作,使用 SELECT * FROM INFORMATION_SCHEMA.TIFLASH_REPLICA 是能够看到新建的表的,如果直接 create table,是看不到的,刚看了文档,官方文档里面明确提到了create table like会创建tiflash副本,所以确定在按库构建之后,新建表是不会自动新建tiflash副本的

1 个赞

这个ddl的工作是个pd的调度么?除了查看tiflash副本的完成程度(SELECT * FROM INFORMATION_SCHEMA.TIFLASH_REPLICA WHERE TABLE_SCHEMA = ‘TESTDB’;
)之外,从哪可以监控到是否执行完成?

如果是 create table like 的形式,则因为 TiFlash 本身机制的原因,会自动创建 TiFlash 副本。

这个表述不完全,如果是 create table like other_schema.table_xxx, 则不会自动创建 TiFlash 副本。

可以啊,你再看看?

对,只有当前schema下的表可以,这个行为比较奇怪,create table like 不应该自动创建 tiflash 副本吧?

create table like自动创建副本在官方文档特别说明了,目前是这样的

(root@127.1) [test] 17:38:04> create table test1_2 like test2.test1;
Query OK, 0 rows affected (0.54 sec)

(root@127.1) [test] 17:51:15> select * from information_schema.tiflash_replica where table_schema like 'test%';
+--------------+------------+----------+---------------+-----------------+-----------+----------+
| TABLE_SCHEMA | TABLE_NAME | TABLE_ID | REPLICA_COUNT | LOCATION_LABELS | AVAILABLE | PROGRESS |
+--------------+------------+----------+---------------+-----------------+-----------+----------+
| test         | test       |      128 |             1 |                 |         1 |        1 |
| test         | test1      |      115 |             1 |                 |         1 |        1 |
| test         | test2      |      117 |             1 |                 |         1 |        1 |
| test         | test1_1    |      158 |             1 |                 |         1 |        1 |
+--------------+------------+----------+---------------+-----------------+-----------+----------+
4 rows in set (0.00 sec)

你后面加了个where table_schema like ‘test%’;,会不会限制了你查询范围?

:sweat_smile: 这是为了展示 schema test/test2, 分别查也是一样的。

(root@127.1) [test] 17:51:24> select * from information_schema.tiflash_replica where table_schema = 'test';
+--------------+------------+----------+---------------+-----------------+-----------+----------+
| TABLE_SCHEMA | TABLE_NAME | TABLE_ID | REPLICA_COUNT | LOCATION_LABELS | AVAILABLE | PROGRESS |
+--------------+------------+----------+---------------+-----------------+-----------+----------+
| test         | test       |      128 |             1 |                 |         1 |        1 |
| test         | test1      |      115 |             1 |                 |         1 |        1 |
| test         | test2      |      117 |             1 |                 |         1 |        1 |
| test         | test1_1    |      158 |             1 |                 |         1 |        1 |
+--------------+------------+----------+---------------+-----------------+-----------+----------+
4 rows in set (0.01 sec)

(root@127.1) [test] 17:54:34> select * from information_schema.tiflash_replica where table_schema = 'test2';
Empty set (0.00 sec)

我跨是schema可以的来,版本不一样的原因么?:sweat_smile:

DDL 是 TiDB 的 ddl master 推进的,可以用 admin show ddl; 看,但只能看到每个 table 的 ddl ……