【 TiDB 使用环境】POC
【 TiDB 版本】6.1.0
【遇到的问题】按库构建TiFlash副本,新增的表不会自动同步
【复现路径】
- 按库构建tiflash副本
ALTER DATABASE test SET TIFLASH REPLICA 1;
- 在该库创建新表并写入数据
- 使用
SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = 'test';
查看同步进度,发现并没有新表的进度
【 TiDB 使用环境】POC
【 TiDB 版本】6.1.0
【遇到的问题】按库构建TiFlash副本,新增的表不会自动同步
【复现路径】
ALTER DATABASE test SET TIFLASH REPLICA 1;
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 副本,存在不确定性; 全部同步执行之后,再创建表,则确定会为这些新增表创建 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副本的
这个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%’;,会不会限制了你查询范围?
这是为了展示 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)
DDL 是 TiDB 的 ddl master 推进的,可以用 admin show ddl; 看,但只能看到每个 table 的 ddl ……