tencent cloud

TDSQL Boundless

V19.0.x

PDF
聚焦模式
字号
最后更新时间: 2026-04-17 11:56:51

V19.0.1

问题修复

修复 Fast Online DDL IngestBehind 期间重启后,重复 Ingest 相同 SST 导致 SST Overlap 的问题。由于第二次 Ingest 时 SST 与第一次 SST 存在 Overlap,会触发 Compaction。Compaction 结束后 Apply SST 结果到 Manifest 时,由于存在重复 Key,某个 SST 的最大 Key 可能与下一个 SST 的最小 Key 相同,从而造成 SST Overlap。
修复 Install Snapshot 无法结束的问题。
修复 Primary RG 在两个节点间来回迁移副本或切主的问题。
修复初始化次节点未正确获取用户权限的问题。

V19.0.0

版本更新说明

扩展性与性能

数据库存储引擎租约使用物理时钟,不再依赖 MC 授时
TDSQL 启动流程优化
优化了 V18.1.0 中的并行启动机制,消除并行启动机制中的木桶效应,将 TDSQL Boundless 在使用 TDSQL-TOOLS 部署 3 副本集群的耗时缩短至 5 分钟内。
在初始化阶段中:
1.1 创建 First RG 时将其成员角色由 1 Leader + (n-1) Follower 降级为 1 Leader + (n-1) Learner,以避免成员节点就绪时间不一致引起的等待。
1.2 放宽了初始化写 DD 和配置阶段的一致性要求,以避免成员节点初始化完成时间不一致引起的等待。
在完成初始化后会通过 HTTP API 恢复集群原本的配置及一致性要求,并异步地将配置之外的 Learner 副本提升为 Follower。
MC 为无 Leader RG 的节点预建 RG
新增 Primary RG 带有标签 primary-leader,表示 RG Leader 的偏好节点,正常场景 MC 会让 Primary RG Leader 都保持在偏好节点。新建实例如果有 N 个节点,在启动流程中会创建 N 个 Primary RG,升级的实例会选择已有的 RG 添加 primary-leader 标签。
实例级别存储层只读
支持实例设置存储层级别的只读来支持灾备连接的正常切换。
提供分区亲和能力
如果多张分区表拥有相同的分区规则,相同的分区将被调度到同一个 RG,目前仅限一级 HASH 分区表。由参数 tdsql_enable_partition_policy 控制,默认为 ON;关闭该参数后,新建的表(CREATE 或者 ALTER COPY DDL)不与任何表亲和调度,存量的亲和关系仍保留。
SQLEngine 支持 DELETE 事务拆分
将 DELETE 大事务拆分成若干个小事务,整个 DELETE 流程不保证事务特性,但拆分的小事务需要保证事务特性,通过新语法中的 LIMIT 来控制事务拆分的粒度。
语法:
BATCH LIMIT {batch_size} {delete_stmt}
注意:目前只支持单表删除,不能嵌套在多语句事务中,batch_size 不为 0。
删除语句执行时需先找到表对应的 RG Leader 的 SQLEngine,再通过 MySQL Client 连接上去执行 DELETE 语句,避免过多 RPC 带来的性能损耗。
SQLEngine 支持并行粒度细分
在并行过程中,根据参数 parallel_suggested_scan_ranges 来确定划分任务数量,将查询范围进行拆分,以确保拆分粒度足够小,解决之前并行查询拆分粒度大而在某些场景下不能完全并行的问题。
SQLEngine 修改临时表为 TEMPTABLE
默认打开 mmap,让 TEMPTABLE 临时表替换 InnoDB 临时表。新增 temptable_mmap_usedtemptable_ram_used 两个状态变量来监控临时表占用的存储空间。
SQLEngine 默认开启新的表存储格式,CHAR 列使用可变编码存储
将 CHAR 类型的定长存储改为变长存储,通过 LEB128 编码记录字符串长度并删除末尾空白字符,以减少存储和通讯开销,特别适合使用 UTF-8 编码的英文数据。
SQLEngine 支持分区表条件下推
分区表也支持条件下推,通过 EXPLAIN 或者 TRACE 可以看到,和非分区表一样。
Local 优化
增加参数 local_optimizer_switch 控制 Local 相关的优化,默认值:get=on,scan=on,parallel_direct_scan=on,join_direct_scan=on,preload=on,single_rg=off
主要包含两部分的优化:
对于普通表,在 Scan 时根据路由信息,如果数据在本地则走本地流程,去除 PB 相关的操作,由 scan 参数控制。同时如果涉及二级索引的回表,由参数 preload 控制是否走 Local 的回表优化。
对于并行的分区表,如果数据在本地则直接走 Direct 模式,去除路由相关的操作,由参数 parallel_direct_scan 控制。如果是多个相同分区 Policy 的以及 HASH 分区表的 JOIN 操作,由参数 join_direct_scan 控制是否开启多表 Direct 模式。get 用于控制点查时是否走 Direct 模式。
single_rg 只有在用户保证只有一个 RG 的情况下才能打开。打开后 SQL 不会判断数据是否在本地,而是直接认为在本地,走 Direct 模式。
scan 优化是基础,所以关闭所有 local 优化:set local_optimizer_switch = "scan=off"
DDL 显式使用默认 Distribution Policy,避免非必要流程
DDL 显式使用 Distribution Policy 时,SQLEngine 需和 MC 交互以获得该 Distribution Policy 的 ID。Default Distribution Policy 的 Name 和 ID 是约定固定的,所以显式使用 Default Distribution Policy 时可以避免这次交互。

稳定性

存储稳定性增强

修复多数派满磁盘集群无法处理读写请求的问题
解决集群中多数派满磁盘后无法完成成员变更,导致无法处理读写请求的问题。修复后可以按照预期处理读写请求,并返回清晰的只读状态错误信息到客户端。
支持满磁盘状态下的 RG 迁移
节点进入只读状态,无论磁盘空间是否小于 tdstore_min_free_disk_space,都支持通过 RG 迁移释放磁盘空间。
数据存储文件 SST 边界实时与表边界对齐
将数据存储文件 SST 边界与表边界对齐逻辑,由非实时修改为实时,计算层收集统计信息更加准确。

支持分布式死锁检测

TDSQL V19.0.0 之前的版本并未支持死锁检测功能。当死锁发生时,事务只能等待悲观锁超时之后回滚事务。为此,TDSQL 默认配置的悲观锁超时时间(tdstore_lock_wait_timeout)相对较短,仅为 10s,避免发生死锁时事务被长时间阻塞。但是如此短暂的悲观锁超时时间,可能会导致非死锁场景下,热点数据上频繁发生悲观锁超时,对业务使用造成影响。
为了解决该问题,TDSQL V19.0.0 版本新增了一个 BOOL 类型 MySQL System Variable:tdstore_deadlock_detect。当 tdstore_deadlock_detect 被启用后,TDSQL 可以在 5s 内检测到死锁,并提示用户 ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction.。错误信息会包括被回滚的事务 ID、执行该事务的 SQLEngine 的 Node ID 以及事务正在访问的 TDStore 的 Node ID。与此同时,负责检测死锁的 TDStore 的日志中,一条包含构成死锁的全部事务 ID 的错误日志 [deadlock detection] found cycle among {...} 会被打印({...} 中即为构成死锁的全部事务 ID)。
tdstore_deadlock_detect 默认值为 OFF,但是对于新构建的实例,tdstore_deadlock_detect 的值会在构建好后被修改为 ON(这意味着如果用户使用 SET tdstore_deadlock_detect = default,其值仍然会被修改为 OFF)。在开启 tdstore_deadlock_detect 之后,用户可以一定程度上增加 tdstore_lock_wait_timeout 的配置值,来延长悲观锁等待超时时间。

数据库管理

TDStore 与 SQLEngine 的参数管理整合

V19.0.0 之前,TDStore 和 SQLEngine 同属一个进程却使用了两套参数管理机制,属于历史遗留问题,且 TDStore 的参数只能用 TDStore Client 进行读写,对用户使用不友好。
因此,从 V19.0.0 开始,废弃 TDStore 的配置文件以及读写方式,完全整合到 SQLEngine 的参数管理体系中,全面支持通过 SQL 读写 TDStore 的参数。

根据容器规格合理设置内核参数

V19.0.0 之前,内核中和容器规格相关的参数需要计算后渲染到内核配置文件中,随着参数越来越多,增大了沟通对齐以及开发维护成本。
实际上,内核参数应该由内核侧自行设置,形成自闭环。因此,从 V19.0.0 开始,内核侧根据容器规格参数对相关参数进行合理设置。下面介绍了内核侧参数渲染以及生效的规则:
支持内核根据下发的容器规格参数将相关的参数进行计算后写入 frominstall_my_<port>.ini 文件中,会覆盖 myport.cnf 中的配置优先生效。
支持用户需要特殊设置的参数写入 add_my_<port>.ini 文件中,会覆盖 myport.cnffrominstall_my_<port>.ini 中的配置优先生效。
用户通过 SET PERSIST 或在 MC 修改的参数最终会持久化到 MC,会覆盖上述所有配置文件中的值优先生效。

DDL 功能增强

Online 创建索引加速
在日常运维中,经常需要对表结构进行调整,例如新增列或添加索引,然而当数据量很大时,添加索引可能会花费很长时间,影响业务发展速度。TDSQL 从 V19.0.0 版本扩展了 FastOnlineDDL 支持场景,可以让在线添加分区表的非唯一索引的速度提高一个数量级。
使用方法:设置 tdsql_ddl_fillback_mode = 'IngestBehind'tdsql_ddl_fillback_mode 默认为 'ThomasWrite'
CREATE TABLE sbtest1 (a INT AUTO_INCREMENT PRIMARY KEY, b INT, c INT) PARTITION BY HASH (a) PARTITIONS 3;
INSERT INTO sbtest1 VALUES(1,1,1),(2,2,2),(3,3,3);
SET SESSION tdsql_ddl_fillback_mode = 'IngestBehind';
ALTER TABLE sbtest1 ADD INDEX idx_b(b);
--IngestBehind 模式下非分区表添加索引、分区表添加唯一索引会报如下提示
ALTER TABLE sbtest1 ADD UNIQUE INDEX idx_a(a);
ERROR 8581 (HY000): Online alter table marco.sbtest2 failed, IngestBehind only supports adding non-unique index on non-system partition table, please set variable 'tdsql_ddl_fillback_mode' to others.
CREATE TABLE sbtest2(a INT AUTO_INCREMENT PRIMARY KEY, b INT, c INT);
INSERT INTO sbtest2 VALUES(1,1,1),(2,2,2),(3,3,3);
ALTER TABLE sbtest2 ADD INDEX idx_b(b);
ERROR 8581 (HY000): Online alter table marco.sbtest2 failed, IngestBehind only supports adding non-unique index on non-system partition table, please set variable 'tdsql_ddl_fillback_mode' to others.

安全增强

无。

数据迁移

迁移工具

为从 HBase 向 TDStore 迁移数据的流程添加补数工具。当前迁移数据完成后会对数据进行校验,比较 TDStore 和原 HBase 中数据的差别,并输出为一张 TDStore 表。在此基础上新增了补数工具,该工具读取校验结果;对于 TDStore 中缺少的数据,逐一再去读取 HBase,并将这些数据插入 TDStore 中。

查询处理

用户自定义(SP)函数、Window 函数和 UNION/UNION ALL 相关子查询支持并行执行
用户自定义(SP)函数通过启用 SET parallel_query_switch = 'restricted_functions=on',支持并行查询。使用时请注意,SP 函数不能出现在 WHERE 条件中,否则会禁用并行执行;SP 函数必须定义为 DETERMINISTIC
支持 Window 函数在 Leader 上执行。
V18.1.0 及之前版本,并行中包含相关子查询会被整个下推的 Worker 执行,如果相关子查询是 UNION/UNION ALL 子句,会不走并行;V19.0.0 版本系统支持在并行查询中处理 UNION/UNION ALL 相关子查询。
并行查询支持查询中部分表下推执行
V18.1.0 及之前版本,如果在某些表的过滤条件上有不能并行下推的表达式,则整个查询不能并行执行,V19.0.0 版本中包含不能并行下推表达式的表留在 Leader 上执行,其余表下推执行。
MPP 支持 UNION

备份恢复

从 COS 中查找 Raft Log 时,以实际保留天数为准
旧版本从 COS 查找 Raft Log 时,会默认往前找 7 天,和云当前的保留天数一致。但是考虑到未来如果保留天数变化,可能导致复杂的同步逻辑。
内核将在该版本获取 Raft Log 时,首先查询实际的保留天数后,再决定往前找多少天,不再固定天数。

运维

INFORMATION_SCHEMA 增加系统表,展示 TDStore 侧 Event 信息
INFORMATION_SCHEMA.TDSTORE_REPLICATION_GROUP_EVENT_INFO:展示 TDStore 层 Replication Group 相关任务执行情况,详细请参见 TDSTORE_REPLICATION_GROUP_EVENT_INFO
INFORMATION_SCHEMA.TDSTORE_REGION_EVENT_INFO:展示 TDStore 层 Region 相关任务执行情况,详细请参见 TDSTORE_REGION_EVENT_INFO
INFORMATION_SCHEMA.TDSTORE_COMMON_EVENT_INFO:展示 TDStore 层一些泛用任务的执行结果,详细请参见 TDSTORE_COMMON_EVENT_INFO
INFORMATION_SCHEMA.TDSTORE_INSTALL_SNAPSHOT_INFO:展示 TDStore 层 Install Snapshot 任务的执行情况,包括当前正在执行的任务以及执行完毕的历史任务,详细请参见 TDSTORE_INSTALL_SNAPSHOT_INFO
INFORMATION_SCHEMA 增加系统表,提供对 SST 属性以及 ColumnFamily 部分配置的展示
INFORMATION_SCHEMA.TDSTORE_SST_PROPS:展示 TDStore 中 SSTable 的属性,详细请参见 TDSTORE_SST_PROPS
INFORMATION_SCHEMA.TDSTORE_CF_OPTIONS:展示 SQLEngine 中 ColumnFamily 相关的配置项,详细请参见 TDSTORE_CF_OPTIONS
INFORMATION_SCHEMA.TDSTORE_COMPACTION_HISTORY 的 ThreadID 字段改为 16 进制表示,以优化与日志的关联性
TDSTORE_COMPACTION_HISTORY 相关说明请参见 TDSTORE_COMPACTION_HISTORY
INFORMATION_SCHEMA.LOGSERVICE_PROCESSLIST 新增 err_msg 字段
INFORMATION_SCHEMA.LOGSERVICE_PROCESSLIST 新增 err_msg 字段用来展示 LogService 运行时的错误,详细请参见 LOGSERVICE_PROCESSLIST
INFORMATION_SCHEMA.META_CLUSTER_RGS 字段优化
优化 INFORMATION_SCHEMA.META_CLUSTER_RGSrep_group_stats_approximate_size 字段,详细请参见 META_CLUSTER_RGS
丰富调度 Job 或 Task 发起时的指标信息
对每种调度(如分裂、切主、合并、迁移、Multi-Job-Task)Job 或 Task 的发起增加更丰富的指标信息(如迁移时 RG Size,迁移标准 Size,分裂标准 Size,热点信息等),方便运维时排查问题。这些信息在 INFORMATION_SCHEMA.META_CLUSTER_JOBS 表里的 job_desc 字段。
启用 PERFORMANCE_SCHEMA.METADATA_LOCKS 表
METADATA_LOCKS 记录着当前 SQLEngine 元数据锁的占用情况,方便用户快速定位元数据锁(Metadata Locks, MDL)相关的问题,提高系统的稳定性和性能,详细请参见 METADATA_LOCKS
tdstore_client_new_console 功能增强
增加根据事务 ID 结束事务参与者功能
end_participant --rep_group_id=xxx --txn_id=xxxxxxxxxxxxxx
修复 get_region_info 未提供正确 rep_group_id 时,返回全量 RegionInfo 的问题。
SHOW PROCESSLIST 返回当前节点的 Node ID
广播的 SHOW PROCESSLIST 返回所有节点的 Node ID,包括当前的节点,同时不再是之前的 IP 信息,而是改为 Node ID 信息。
EXPLAIN、OPTIMIZER_TRACE 支持更多信息
EXPLAIN FORMAT=TREE 时显示下推相关的信息。
OPTIMIZER_TRACE 提供下推相关的详细信息,如果没有下推,提供具体原因。同时提供 Local 优化的详细信息。
存储层增加 Slow Log 信息
针对 TDStore 上一些主要的 RPC(Scan、Get、Commit 等)增加慢日志,有助于定位线上性能波动问题。日志目录为 dblogs/tdstore/slow_log
支持 SHOW ENGINE ROCKSDB STATUS 命令
执行 SHOW ENGINE ROCKSDB STATUS 命令可以获取到对应节点如 Memory、Bthread 等方面的统计信息。
EXPLAIN ANALYZE 展示 RPC 耗时信息
支持两个新实例建立异步灾备关系的容灾策略
用户可以直接为现有实例集群版添加灾备实例。目前仅支持异步的数据同步模式。支持用户手动断开灾备连接,正常切换与故障切换。
使用限制:
灾备实例的创建需在原实例创建后的 5 天内完成。
单副本实例不允许创建灾备实例。
Binlog 能力与灾备能力互斥。
每个主实例仅支持创建一个对应的灾备实例。
仅支持在对等架构下建立灾备关系。
仅支持在同 Region 创建灾备实例,暂不支持跨 Region。
不支持含有 Unique Key 的表、Hidden Primary Key 的表以及 Primary Key 有字符串前缀索引的表进行同步(底层 LogService 不支持)。
备实例不允许进行备份恢复、读写状态更改及日志管理等操作。
实例在销毁前,必须先解除其与灾备实例的关系(强制销毁除外)。
主备实例版本需要一致。升级实例时,需要先升级备实例,再升级主实例。
仅适用于公有云。
灾备主备实例均推荐使用云盘,并应该尽量避免缩磁盘操作。
MC 启用了 HTTP V2 版本
统一了 HTTP / RPC / MC-CTL 三个 MC 接口访问方式的参数字段名。
支持自动化生成接口文档。

问题修复

修复统计信息获取表、索引行数不准确的问题。
修复数据字典升级无法处理"新版本二进制修改已有系统表的表定义"的问题。
修复 Online Copy DDL 失败导致 Coredump 的问题。
修复 UPDATE 使用通配符作为条件报错 Data truncated 的问题。
修复创建外键时未正确报错或告警的问题。
修复 DROP PARTITION 走 OnlineCopy 路径,清理不掉数据的问题。
修复非分区表 RENAME INDEX 时没有按指定算法执行 ALTER 的问题。
修复线上 KILL 不生效的问题。
修复 V18.0.0 之后新增 INFORMATION_SCHEMA 视图可能丢失的问题。
修复磁盘扩容后,TDStore 没有从只读状态恢复的问题。
修复 TDStore 估算统计信息时误差过大的问题。
修复 RG Meta Version 与路由中的 Version 不匹配,导致无法下发 DELETE Region 任务的问题。

参数变更

变更类型
参数名称
描述
新增
是否启用死锁检测。
新增
是否强制节点在满磁盘状态下接收 Raft Leader 发送的 configuration log。
默认为 true,确保多数派进入满磁盘状态后可以快速完成成员变更。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈