V21.2.5
问题修复
修复 CDC(Change Data Capture)在同步包含反引号(`)的表名时,SQL 语句解析异常,导致主灾备(主从)同步失败的问题。该问题在所有版本中存在,错误日志显示生成的 REPLACE 语句语法错误(如 INTO newdts.`t``),进而导致 CDC 同步延迟显著增加。
修复在21.2.4版本中引入的,因 groupPartition 函数内部排序不稳定导致的分区打散(Distribution)不符合预期的问题。该问题表现为相同分区类型(如 Hash 4 分区)的不同表,在相同节点集上打散后的分布顺序可能不一致(例如表 t1 分布为 p0、p1、p2、p3,而表 t2 可能为 p1、p2、p0、p3)。
修复在特定条件下,优化器选择 SkipScan 索引访问方式后,查询结果不正确(结果条数变多)的问题。该问题源于 SkipScan 实现中的逻辑缺陷,在跳跃扫描过程中未能正确处理某些边界条件。
修复跨地域灾备场景下用户同步连接失败问题。
V21.2.4
版本更新说明
运维
新增内存监控触发时打印协程栈信息
为辅助诊断因内存使用过高或疑似死锁导致的问题,本次新增功能在 Agent 内存监控达到阈值并打印堆内存(heap)信息时,同步打印一份当前所有 Goroutine 的栈信息。这有助于开发人员分析是否存在因协程阻塞或死锁导致的内存泄漏或心跳堆积等问题,提升问题定位效率。
SST 文件监控能力增强
新增查询过小 SST 文件数量的方法,支持展示指定层的小 SST 文件数量和总 SST 文件数量。小 SST 文件的判定标准参考 RocksDB 的 compaction_merge_small_file_trigger_ratio 配置,便于运维人员监控和优化存储层性能。
慢日志存储路径优化
将慢日志默认路径从数据盘迁移至日志盘。解决 Bulk Load 等大数据导入场景下慢日志堆积占用数据盘空间,导致 MC 对磁盘占用量判断不准、表分布看起来不均匀的问题。
并行查询错误信息增强
增强 SQL 并行执行失败时的错误信息,补充必要的错误节点信息。解决多节点实例中并行查询失败时仅显示"read data from remote node error"而无法定位具体问题节点的问题,提升问题排查效率。
DDL 监控指标增强
新增 Ddl_count(执行的 DDL 个数)和 Ddl_failed_count(失败的 DDL 个数)两个监控指标,支持计算 DDL 失败率告警,便于及时发现和处理 DDL 执行异常。
归档任务清理策略优化
优化 MC 归档任务清理策略,将保留天数和保留条目设置为两个独立的阈值。解决归档任务过多导致 Range 请求耗时高的问题,提升 MC 运行效率。
参数模板动态读取能力
支持前端参数模板动态读取实际内核的参数默认值和取值范围。解决前端展示的参数默认值和 Range 与实际内核不匹配的问题,避免用户误以为参数被修改,提升用户体验。
数据库管理
优化 mc-ctl 命令行工具,提升易用性
本次更新对 mc-ctl 命令行工具进行了多项优化:1) 新增 cluster gv delete-single 命令,用于删除单个全局变量,语法更直观;2) 新增 cluster gv-old get 和 cluster gv-old delete-single 命令,以支持对旧格式(JSON)全局变量的查询和删除操作;3) 新增 show node_role 命令,方便用户查看节点角色的枚举值。
副本类型变配能力
支持现网存量实例从全部全功能副本变配为全功能副本与日志副本的混合部署模式,满足不同业务场景下的副本配置需求,优化资源利用率。
扩展性与性能
优化大分区表 DDL 执行路径,减少跨节点 RPC
针对分区数量庞大的分区表执行 DDL(如 CREATE/DROP TABLE)或执行 DROP DATABASE 时,每个分区都需要与数据字典(DD)交互,若执行节点与系统副本组(sys rg)Leader 不在同一节点,会产生大量跨节点 RPC 调用。本次优化将此类 DDL 语句的转发逻辑,使其优先在 sys rg Leader 所在的节点执行,从而大幅减少网络开销,提升 DDL 执行效率。
批量 DELETE/UPDATE 性能优化
默认开启 tdsql_stmt_optim_batch_delete 和 tdsql_stmt_optim_batch_update 参数,启用批量删除和更新语句的优化能力,提升大批量数据变更操作的执行效率。
分区表元数据内存优化
优化分区表场景下 Table Cache 的内存开销。共享分区之间的相关结构,延迟内存分配,显著降低大规模分区表场景的内存占用。
分裂场景慢查询优化
优化事务执行期间发生 RG 分裂时的处理逻辑。当协调者收到参与者返回 EC_TDS_TRANS_PREPARE_NEED_MORE_PART 后,立刻给已 Ready 的参与者发送 Prepare 请求刷新参与者列表,避免等待下一轮重试(默认1秒)导致的慢查询。
切主场景慢查询优化
优化 RG 切主场景下 SQLEngine 感知新 Leader 的速度。修复 Lease::CheckLease 函数在 RG 状态不可写时返回错误码不准确的问题,确保返回 EC_TDS_TRANS_REP_GROUP_NOT_LEADER 并携带 recommended_retry_connection,使 SQLEngine 能及时发现新 Leader,避免2秒以上的路由延迟。
合并场景慢查询优化
优化 TPCC 与 RG 合并并发场景下的死锁问题。当 HandleBlockParticipantPrepareForMergeTrans 无法获取参与者锁时,主动中断锁等待,避免因锁等待超时(默认50秒)导致的慢查询。
Proxy Executor 内存优化
优化 Proxy Executor 的内存释放机制。在 OnConnClose 时启动后台协程立即执行释放动作,而非依赖后台线程定期清理,避免短连接高并发场景下因内存延迟释放导致的 OOM 风险。
单行 INSERT 批量优化
优化单行数据插入场景的性能。当数据和多个索引位于同一节点时,使用 Batch Insert 将数据和索引的写入合并为一次 RPC 调用,减少网络开销。
Compaction 压缩算法优化
优化 Compaction 输出 SST 文件的压缩算法选取策略。不仅考虑目标层的压缩算法设置,还考虑输入 SST 文件的压缩算法,确保输出的压缩级别不低于输入。解决 RG 迁移时 ZSTD 压缩的 SST 被 Ingest 到 L0/L1 层后因 Compaction 退化为无压缩导致的空间膨胀问题。
L0 层写入控制优化
为 L0 层数据量增加 Soft/Hard Limit 参数控制缓写停写行为。解决 estimated_pending_compaction_bytes 估算偏大导致的误缓写问题,同时通过 L0 层大小限制控制 L0 到 L1 层 Compaction 所需的额外磁盘空间,提升写入性能稳定性。
大内存实例参数自适应
根据实例内存大小动态设置 tdstore_data_db_table_cache_numshardbits 和 tdstore_block_cache_num_shard_bits 参数。Block Cache 大小在64GB 以下设置为6,64-128GB 设置为7,128-256GB 设置为8,256-512GB 设置为9,512GB 以上设置为10,优化大内存实例的缓存性能。
INSERT ON DUPLICATE KEY UPDATE 性能优化
优化扩展语法 INSERT INTO... AS new ON DUPLICATE KEY UPDATE 的写入性能。解决该语法相比 REPLACE INTO 性能差距较大的问题,支持 Batch 优化提升批量写入效率。
强制 BKA 优化开关
在 optimizer_switch 中开启 force_batched_key_access 开关,默认启用强制批量键访问(BKA)连接优化,提升多表 Join 查询的性能。 I_S 系统视图自动 Proxy 转发
Information_Schema 系统视图查询自动使用 Proxy 转发至 System RG 节点执行。由于 I_S 视图基本都是多表 NLJ 查询,转发到 System RG 所在节点执行更高效,减少跨节点 RPC 调用。
优化 Region 分裂/合并过程中 Write Fence 的处理效率
针对在 Region 数量较多或 Write Fence 操作频繁的场景下,Region 分裂和合并操作中处理 Write Fence 耗时过长的问题进行了优化。通过改进内部处理逻辑,减少了相关操作的延迟,提升了数据分片动态调整(分裂/合并)的执行效率,从而增强了集群在面对数据增长和负载变化时的弹性与响应速度。
默认关闭优化器选项 skip_scan 以避免潜在负优化
根据现网实践和 POC 测试反馈,优化器选项 skip_scan 在 TDSQL Boundless 的某些查询场景中可能导致性能下降(负优化)。默认将此优化器开关关闭。
稳定性
升级兼容性增强
修复 Sys_var_flagset 类型参数(如 parallel_query_switch、optimizer_switch)在版本升级前后不兼容导致节点无法启动的问题。在配置文件读取路径中增加与 SET 语句路径相同的容错处理,确保升级过程平滑。
MC 关键 RPC 限流优化
MC 限流机制默认对 SQLEngine 和 TDStore 的心跳等关键 RPC 放开不做限制,确保 NodeHeartbeat 和 EngineHeartbeat 在高负载场景下不受限流影响,提升系统稳定性。
MC 模块化运行能力
支持 MC 在极端故障场景下只运行指定的工作模块。可通过配置文件指定禁止或允许启动的模块/协程,支持运行时暂停和恢复指定协程,确保时间戳服务等关键功能在故障时仍可独立恢复。
MC 集群管理能力增强
优化克隆实例时 History Job 拉取逻辑,避免从 ETCD 一次性加载过多 Job 导致 MC OOM。采用分批加载策略,提前过滤不需要的 Job,并将部分字段置空以减少内存占用,提升大规模 Job 场景下的稳定性。
RG 重启重试策略优化
优化 Error RG 重启逻辑,将固定次数重试改为指数退避重试,并持续重试直到启动成功。解决磁盘满场景下因元数据写失败超过重试次数后副本启动失败的问题,增强系统自愈能力。
语法与功能
并行查询权限继承优化
并行查询执行的 Worker 线程继承 SKIP_DD_ACCESS_CHECK 权限,确保并行执行时能正确访问数据字典,避免权限检查导致的执行失败。
非阻塞 DDL 与抢占式 DDL
实现非阻塞 DDL(Nonblock DDL)和抢占式 DDL(Preemptive DDL)功能。非阻塞 DDL 在无法获取 MDL-X 锁时仍允许新事务进入目标表;抢占式 DDL 可主动终止持有 S 锁的长事务。通过 Session 变量控制,提升 DDL 执行的灵活性和成功率。
锁视图可读性增强
增强 TDStore data_locks 系统视图的可读性。在视图中增加数据库名和表名。
Online Copy Table 并行校验
Online Copy Table 校验新旧表数据行数一致性时适配并行查询(PQ)逻辑下的 SELECT COUNT 操作,提升大表 DDL 操作的校验效率。
数据迁移
TiDB 迁移 TDSQL Boundless 工具
基于 BR 备份文件实现 TiDB 一键迁移至 TDSQL Boundless 的工具。支持将 TiDB BR 备份文件转换为 SQL/CSV 格式,通过 Bulk Load 导入 TDSQL Boundless 集群。已验证 TiDB v6.1.7、v6.5.12、v7.1.5、v7.5.3、v8.1.1、v8.5.0 等版本。
备份恢复
增强物理机集群备份恢复的 COS 访问稳定性
为物理机(增强型本地盘)集群的备份恢复(TDBR)功能增加了通过服务发现组件(Polaris)访问 COS 对象存储的能力。该方案替代了原有的内部域名访问方式,能够智能地负载均衡 COS 服务请求,避免在流量高峰时将压力集中到少数 COS 节点,从而显著提升在 IDC 环境下进行大规模备份和恢复操作的网络稳定性与成功率。
问题修复
修复了在使用 SUBPARTITION BY KEY 的分区表中,当 GROUP BY 子句的列与索引分组列不完全匹配时,查询优化器错误地将 GROUP BY 操作完全下推到存储层的问题。这可能导致返回错误的分组聚合结果。
修复了行存引擎中因 Jemalloc 内存分配器默认参数配置(如未开启 background_thread)导致的偶发性查询抖动问题。在特定内存分配场景下,Jemalloc 内部调用 madvise 系统调用可能耗时超过1秒,导致点查、点更新等简单操作出现严重延迟。
分区表持久化(Persist)全表统计信息时,可能只汇总计算了部分分区的统计信息
修复了 TDStore 在特定并发场景下(如 Split 操作失败后的回滚流程),因悲观锁管理器(TDRequestPessimisticTransLockManager)内部链表访问未加锁导致的竞态条件。该问题会引起空指针解引用,最终导致节点崩溃(Core)。
修复了在索引数量庞大的场景下,频繁访问的热表其 Range 统计信息(range stats)因缓存容量限制被频繁淘汰和重新加载,导致性能损失的问题。本次修复新增了通过参数指定热表列表的功能,在使用 FIFO 淘汰策略时,这些表的索引对应的 Range 统计信息将被"钉住"(pin),避免被常规淘汰机制移除。
修复了原容量均衡触发阈值(relaxed-usage-diff-ratio 和 strict-usage-diff-ratio)设置过小的问题。在磁盘容量较小的节点上,此问题容易触发不必要的均衡调度,破坏 Hash/Key 分区表的默认数据分布,进而影响查询性能。
修复了分区表在执行 Batched Key Access (BKA) Join 时,内表数据读取路径中一个冗余的 get_record 操作。此多余操作导致了不必要的性能开销。
修复了调用 ScatterPartition 接口进行分区打散时效果不符合预期的两个问题:1) 打散逻辑基于 Primary 副本组(RG)进行,但在 21.2.3 版本中未正确处理 Log-Only 节点(其上不存在 Primary RG),导致打散不完整;2) 分区索引需要与对应数据分区放置在一起的约束在实现上存在缺陷,导致打散结果不满足预期分布。
修复单表聚合查询走错索引的问题。当查询已经使用覆盖索引时,优化器不再错误地切换到排序索引,避免因二级索引回表导致查询变慢。
equal 条件落入到单个 range 内,并且存在数据倾斜时,线性估计可能会导致估计行数偏小
range 估计行数时,相同索引前缀的不同索引估计行数偏差较大
修复快照恢复过程中重试 Job 在 HistoryJobList 中冗余的问题。重试 Job 对应的原 Job 已在历史列表中,需过滤掉重试 Job 避免冗余,防止 TDBR 后续动作失败。
修复 Bulk Load 分裂任务状态判断问题。当一个 RG 中有多个表进行 Bulk Load 导入时,某张表结束后 MC 不再提前放开该 RG 的任务调度,需等待所有表导入完成后再解除禁止调度。
修复 BatchPut RPC 遇到锁超时执行失败时客户端未返回错误信息的问题。
修复 MC 均衡调度过度迁移的问题。当 Destroy Replica 任务完成后,MC 需等待该节点收到新心跳后,才可将其作为迁移的 Src 节点,避免因心跳延迟导致重复发送迁移任务。
修复 Merge Empty RG 时未检查副本角色一致性的问题。在合并空 RG 前增加副本角色检查,确保两个 RG 的 Voter/Learner 配比一致后再执行合并操作。
修复 pthread 模式下 futex timed wait 被虚假唤醒后未正确推进已消耗等待时间的问题。
修复整机迁移中被动终止阶段完成后未清理节点 RG 缓存的问题。迁移回滚进入 Passive Abort Stage 完成后,需同步清理节点缓存中的 RG 记录。
修复 19.1.x 版本直接升级 21.2.3 时因 sys 表不存在导致节点启动卡住的问题。调整前向兼容版本判断,从 19.2.x 版本开始走新的 sys 表升级路径。
修复行存节点在 GenericCleanupData 过程中因 PhysicallyDeleteRange 执行成功但 Range 内数据未清空导致 Core 的问题。
修复 Region 分裂和合并条件不一致导致频繁调度的问题。当 Region 大小较小但 Key 数量很大时(如11MB 包含700万个 Key),统一分裂和合并的判断条件,避免反复触发调度。
修复 TDRlogBackuper 在关闭文件描述符时阻塞导致长时间不退出的问题。采用标准关闭流程,先执行 shutdown 再执行 close,避免因缓冲区数据残留导致阻塞。
修复单副本实例中 Fix Offline 函数持续报错的问题。在处理 Offline 状态前先判断 Leader Commit ID,避免单副本场景下直接跳过处理逻辑。
修复 No Range Lock 功能未适配 Batch Update 场景的问题。在 Batch Update 优化路径中增加二级索引值变化校验和回表记录获取的容错处理,确保更新操作数据一致性。
计算节点聚合路由 RPC,高并发场景下减少路由 RPC 次数、降低 MC CPU 压力
修复 UPDATE 语句在包含 VARCHAR 字段的唯一索引上可能破坏唯一性约束的问题。修正唯一性校验的扫描范围计算逻辑,避免因字符串长度变化导致校验范围缩小。
修复 LogService 在回放创建约束关系时卡住的问题。解决因找不到下一个待回放任务创建的数据对象路由而导致回放阻塞的问题。
修复 MultiScan 重聚合失败时访问 GetRegion 导致空指针崩溃的问题。在 GetRegion 函数中增加空指针判断,当 multi_range 为空时返回 nullptr 而非访问空指针。
修复 TDStore Replay Barrier 机制存在日志回放乱序的问题。解决多个 Barrier Log 并发回放时,后一个 Barrier Log 可能在前一个完成后错误释放状态锁,导致其他日志与 Barrier Log 并发执行的问题。
修复 MC 无主时 TDStore Client 调用导致 Client 工具 Core Dump 的问题。解决 MC 切主期间因数组越界导致的崩溃。
修复快照恢复中 Migrate 任务报错的问题。采用遍历副本找 Leader 的方式替代直接使用 RG Meta 中的 Leader,确保 Migrate 任务正确获取源节点。
修复 raft_data 目录残留大量 deleted__async-cleanup 目录导致 Agent 执行 du -cshm 频繁 Core 的问题。
修复异步 Clean Job 卡住导致 CheckConflictWithCleanupDataTask 持续检测到 Range Overlap 的问题。当 Destroy Job 的异步清理任务长时间未完成时,不再持续阻塞后续迁移任务。
修复 LogReceiver 在多 CDC 节点分布不均衡的问题。MC 增加定时调用 CDC 均衡接口的协程,同时修改 LogService 参数限制 CDC 节点 MySQL Client 内存占用,避免单个 CDC 节点承载过多 LogReceiver 导致 OOM。
修复快照恢复回放单副本迁移 Job 时 Offline Leader 报错的问题。单副本迁移场景下,快照恢复不会回放 Transfer Leader Job,需在发现 Migrate Offline Leader 时先进行一次切主。
修复 Item_int_with_ref 未实现 Parallel Safe 导致特定 SQL 并行执行崩溃的问题。
修复 UTF8 字符集下并行查询执行 CONVERT(SUBSTR()) 函数结果不一致的问题。确保并行执行与串行执行返回相同的字符串内容。
修复 Proxy 报错信息不准确的问题,提升问题排查效率。
修复时间戳下沉场景下 PutTimestampToEtcdLoop 协程异常退出的问题。将协程中获取时间戳失败时的 break 改为 continue,确保协程持续运行。
修复 mc_rg_state_leader_transfer_high_frequency_gauge 指标无法正确重置的问题。指标重置逻辑原先写在 AddLeaderHistoryLocked 中,只有下次切主发生后才会重置,现已修复为可正常重置。
当 RG 被删除后,其对应的 raft_data 目录,不再进行重命名并保留,而是直接删除目录。
修复 Proxy 在分区表场景下总是将转发目标节点选在第一个分区 RG Leader 的问题。根据 SQL 指定的分区或 WHERE 条件做分区裁剪后,正确选择对应分区的 RG Leader 节点进行转发,充分利用 Local Scan 优化。
修复磁盘接近满容量时 RG_JOB_TYPE_DELETE_REGION_IN_RG 任务无法调度执行的问题。允许 Local Meta CF 写入跳过缓写状态,确保 Drop Table 等释放空间的操作能尽快正常执行。
修复实例只读后 Drop Table 操作卡住的问题。解决 Write Fence 版本不匹配(SQLEngine 发送版本1,TDStore 记录版本2)导致校验失败的问题。
修复 TDBR 备份时因 CDC 节点 Agent 未启动导致持续报错的问题。TDStore 备份逻辑适配 CDC 节点、Log-only 节点和 Columnar 节点,这些节点的 Agent 状态不影响备份流程。
修复 dbms_admin.show_variables 查询字符集相关变量时 Candidate Values 显示为空的问题,同时修复大数值显示为科学计数法的问题。
修复创建实例偶现的数据字典初始化失败问题。解决 TDStore User RG Save Meta 时因 Permission Denied 报错导致节点初始化失败的问题。
修复了在全量备份恢复(TDBR)过程中,当网络拥塞导致从 COS 下载 SST 文件频繁超时(如 context deadline exceeded)时,重试机制存在两个问题:1) 重试次数固定为10次,不可配置;2) 重试间隔为固定的20-30秒随机值,在网络持续拥塞时效果不佳。这可能导致下载任务在达到重试上限后失败,进而使整个备份恢复流程卡住。
修复了在 Region 数量较多的副本组(RG)中,MC 内部负责合并主键的协程在遍历 Region 元数据时持有读锁时间过长,与定期检查 Leader 的协程(checkLeader)发生读写锁竞争,进而导致死锁的问题。死锁后心跳包处理被阻塞并堆积,最终引发 MC 内存溢出(OOM)。
修复了在创建具有隐式亲和性的多张分区表时,MC 的调度逻辑存在缺陷。当创建第二张表时,因判断具有亲和性而跳过了对 prefer leader 和数据保护(DP)规则的检查,而此时有亲和性的目标副本组(RG)可能正处于合并(Merge)状态而无法创建。这导致后续分区表的 Leader 选择不受约束,全部集中到同一个节点,未能实现预期的打散分布。
数据字典变更
|
修改 | | 新增了 OBJECT NAME、OBJECT SCHEMA 说明。 |
V21.2.3
版本更新说明
数据库管理
提高只读参数 max_digest_length 的默认值以支持更长的 SQL 语句指纹
将 SQL 语句摘要(Digest)的最大长度参数 max_digest_length 的默认值从1024提升到10240,以便 Outline 可以使用到更长 SQL。
增大参数 range_stat_maximum_scanned_partitions 的默认值,以优化超大分区表的范围行数估计性能
增大该值意味着在估计范围行数时,可以允许扫描更多分区来获取更精确的统计信息,旨在平衡估计精度与优化器估计的耗时。
完善 SST 边界对齐策略
增强 SST 边界对齐策略,支持设置最小分割文件大小,缓解打开边界对齐策略时,小 SST 文件过多的问题。默认值为4MB,即当 Compaction 输出的 SST 大小超过4MB 时,才会进行分割。
优化 KEY 分区默认算法配置
调整 KEY 分区表的默认打散算法,提升数据分布均匀性和查询效率。需要注意:KEY 分区的 algorithm=1,原本1表示 KTY_51 算法,现在1表示 MURMURHASH 算法;KEY 分区原本的默认 algorithm=2,表示 KEY_55,现在默认 algorithm=1 使用 MURMURHASH。
优化迁移调度策略
改进迁移调度策略,基于 bvar 指标数据优化节点选择逻辑,避免 IO 资源竞争导致的性能问题。
扩展性与性能
修复分区表处理逻辑中,按记录数排序的分区 ID 列表的排序逻辑
修复了在分区表中,m_part_ids_sorted_by_num_of_records 没有按照子分区表的行数降序排序。
优化 RangeSearch 实现,减少内存拷贝与冗余计算以降低开销
在 Range Search 过程中,直接计算生成 Range 内的行数,避免产生大量中间结果的性能开销。
优化 RPC 调用超时重试机制
增加 RPC 最大阈值变量用于强制限制 RPC 重试不会超过最大阈值,避免了因目标服务长时间不可用而导致大量 bthread 资源被无效重试长时间占用的问题,提升了系统在高负载或部分故障场景下的整体资源利用效率和稳定性。
优化分区表点查场景下 rec_per_key 统计信息的计算性能
针对分区数量众多(如超过1000个分区)的表,优化了在点查等查询中计算每键平均记录数(rec_per_key)的开销。
优化大分区表 DDL 操作的执行效率
针对分区数量庞大的分区表执行 DDL 时,优化了与数据字典(DD)的交互模式。通过将 DDL 操作转发至系统资源组(sys rg)Leader 所在节点执行,避免了跨节点产生的大量 RPC 调用,显著减少了大分区表进行结构变更时的延迟。
优化 NDV 估计算法
采用 Duj1 算法优化整体 NDV(唯一值数量)的估计精度,减少统计误差。
优化热点调度策略
优化热点调度策略,允许分裂多张表进行调度,提升系统负载均衡能力。
优化 Compaction 线程数配置
优化使用本地盘时的 Compaction 线程数配置,将修正倍数从2倍调整为1.5倍,平衡 CPU 占用与 I/O 性能。
优化 SQL 转发机制
优化 SQL 转发机制,修复错误日志、状态设置及超时控制等问题,提升转发性能与稳定性。
优化 BulkLoad 参数更新机制
优化 BulkLoad 批量更新 options 的机制,确保在数据导入完成后能正确恢复参数设置并有效降低 pending compaction bytes。
增强系统表索引统计信息管理能力
支持重新加载系统表索引统计信息到内存,避免频繁触发重新计算,提升执行计划稳定性。
优化 BatchPut 聚合操作的路由获取范围
针对批量写入(BatchPut)操作中的路由聚合(Aggregate)逻辑进行了优化。解决了在操作涉及大量 tindex ID(例如跨多个分区的分区表或间隔很久执行 ADD INDEX)的场景下,获取路由范围过大的问题,避免了不必要的路由信息获取,提升了批量数据写入的效率。
优化备份恢复性能
针对离线 MySQL 场景的恢复慢问题进行优化,提升数据恢复效率。
减少 setup_read_decoders 函数调用频率
优化关联子查询执行逻辑,降低 setup_read_decoders 函数在查询执行中的开销占比。
优化 UPDATE 语句的 RPC 调用性能
对 SQLEngine 模块中的 UPDATE 语句执行流程进行了优化,将原本针对每行数据的索引冲突检查和存储层写入操作进行批量处理,显著减少了高频次、小数据量的 RPC 网络调用。此优化提升了涉及多行更新的 UPDATE 语句的执行效率。线上默认不开,按需打开 tdsql_stmt_optim_batch_update 开关。
优化 Log Receiver COS 链路性能
优化 Log Receiver 的 COS 链路性能,通过减少 Raft Log 文件的重复下载,来降低 IO 资源的消耗以及提升日志获取效率。
优化 SST 文件大小参数配置
调整 target_file_size_multiplier_additional 参数默认值,从 1:1:1:2:2:4:8 调整为 1:1:1:2:2:2:2,当 user_cf_target_file_size_base = 32M 时,在新的默认值下,L1~L6 的 SST 大小上限为:32M, 32M, 64M, 128M, 256M, 512M,下层的 SST 大小更加合理。
优化并行查询执行器启动性能
改进 StartExecutor 在网络压力下的执行效率,减少耗时波动,提升查询稳定性。
特定场景禁用 LIMIT 并行
不带 ORDER BY / GROUP BY 的简单 LIMIT 走并行会带来额外开销,默认禁用并行,若实在需要通过并行解决可以在 SQL 中添加 Hint /*+ parallel(n) */。
优化 Block Statistics 缓存淘汰机制
重构缓存淘汰策略,解决 FIFO 和 LRU 模式下已失效统计信息的内存占用问题,提升内存使用效率。
扩展 GetSmallRange 函数支持远程调用
增强 GetSmallRange 函数功能,使其支持在远程节点上执行,为并行查询的进一步优化提供基础支持。
优化行锁提前释放机制
改进行锁管理逻辑,兼容 MySQL 行为,在打开特殊开关的场景下提前释放不满足过滤条件的行锁,提升系统并发处理能力。
统一 Exchange 为非阻塞模式以提升查询性能
解决并行查询中 Worker 间数据不均匀问题,避免阻塞等待,提升整体执行效率。
优化 Thomas Write 并行回填策略
采用 Small Range 替代 Region 划分任务,提升数据回填的并发效率与负载均衡。
优化统计信息采样性能
针对 FindSampleKey 函数进行性能优化,降低 CPU 开销。
改进 Range 估计算法
优化统计信息中 Gap Range 的处理逻辑,避免因跳过 Gap Range 导致行数估计严重偏低。
优化 GetRegionsByKeyRange 查询性能
针对现网实例 Region 数量大的场景,优化 GetRegionsByKeyRange 查询性能,解决 CPU 打满问题,提升系统稳定性。
增强 BulkLoad 与 RG Job 并发处理能力
优化 BulkLoad 导入与 RG Job 的并发控制,以表粒度来限制两者并发,BulkLoad 导入的表所属的 RG 禁止发起 RG Job,其他不涉及 BulkLoad 导入的 RG 则允许发起 RG Job。
优化 SHOW INDEX 命令执行性能
优化 SHOW INDEX 命令在跨 AZ 场景下的执行效率,提升查询响应速度。
优化 BulkLoad 与 DDL 操作的并发控制
优化 BulkLoad 导入与 DDL 操作的互斥粒度,提升系统并发处理能力。优化 BulkLoad 导入与 DDL 操作的并发控制,以表粒度来限制两者并发,BulkLoad 导入的表禁止执行 DDL 操作,其他不涉及 BulkLoad 导入的表则允许发起 DDL 操作。
优化 DDL 操作中分区策略元信息读取效率
优化 DDL 操作中分区策略元信息读取效率,通过缓存优化等方式减少元数据读取次数,提升 DDL 执行性能。
优化日志副本负载均衡策略
优化日志副本的负载均衡策略,使用写入速度、预估日志大小和副本数量作为负载指标,提升系统资源利用效率。
优化 DELETE 操作性能
改进 DELETE 操作的执行效率,通过 BatchDelete RPC 提升批量删除操作的性能表现。线上默认关闭,控制参数为 tdsql_stmt_optim_batch_delete。
优化大事务 Commit 解锁性能
优化大数据量场景下 Commit 流程中的解锁机制,通过异步处理提升系统整体性能表现。
优化 DDL Recovery 线程并发控制
改进 DDL Recovery 后台线程的并发管理机制,避免在大量 DDL 操作失败时资源过度占用,提升系统整体稳定性。
优化 BulkLoad 与普通事务并发处理能力
改进 BulkLoad 事务与普通事务在不同表上的并发控制逻辑,允许 BulkLoad 事务与不同表上的普通事务并发执行。提升系统资源利用效率。
优化 Exchange 按需传输 VARCHAR 大字段问题
优化 Exchange 传输 VARCHAR 大字段时,仅按需发送。
增强 MC HTTP V2 接口能力
支持指定 HTTP V2 接口的最大请求和返回长度,提升接口稳定性。
语法与功能
通过 Hint 语法支持会话级启用或禁用 Range Cache
新增 SQL Hint,允许用户针对单条查询语句控制 Range Cache 的使用。使用 /*+no_range_cache*/ 可强制关闭当前查询的 Range Cache;使用 /*+use_range_cache*/ 可强制启用。
增强闪回查询功能
提供获取事务时间戳的接口,支持在闪回查询中使用特定时间戳进行数据查询。
优化同名表并发创建的错误提示
改进同名表并发创建时的错误信息返回,提供更明确的冲突提示,统一 DDL 和 DML 操作对表存在性的判断逻辑。
增强执行计划下推信息显示
优化 EXPLAIN 输出,增加明确的下推执行标识,提升 SQL 执行计划的可读性与调试效率。
增加 MC 配置文件的备份功能
在 Shark 渲染 MC 配置文件时自动备份配置文件,方便后续进行参数变更比对与问题排查。
新增 Savepoint 功能支持
扩展 BATCH LIMIT 语法功能
稳定性
修复进程启动时因特定持久化变量校验失败的问题
修复了 SQLEngine 进程启动时,因读取并校验持久化变量 dd_history_record_cleaner_interval_second 而可能失败的问题。优化了校验逻辑,确保在相关后台线程尚未初始化的启动阶段也能安全处理,提升了进程启动成功率。
修复 DML/DDL 操作中因底层锁机制缺陷导致的偶发崩溃(Core)问题
修复了在压测 Range Tree 等场景下,由于底层 BRPC 库中锁生命周期管理问题引发的 Use-After-Free(UAF)缺陷。
增强 Flush Table 与 Write Fence 广播操作的校验与容错能力
加固了 SQLEngine 模块中广播 FLUSH TABLE 和 Write Fence 操作的执行逻辑。新增了 Schema 版本不匹配时的本地缓存刷新机制,并强化了 flush_cache_table 操作在遇到 RPC 卡住等异常时的错误处理,提升了 DDL 相关操作的健壮性。
修复 DDL Job 回滚时因读取空临时表信息而导致的进程自杀问题
修复了 SQLEngine 中 DDL Job 在回滚阶段的一个缺陷。该缺陷导致 Job 尝试为一个数据库名为空字符串的"临时表"申请锁,进而引发向 MC 的无效 RPC 请求并最终触发进程 KillSelf。修复后确保了 DDL 回滚流程的稳定性。
修复进程启动初期因插件系统未完全初始化而可能发生的崩溃(Core)问题
修复了 SQLEngine 在特定启动时序下,因外部请求过早到达而访问尚未初始化的全局插件变量(global_system_variables.table_plugin),进而引发空指针访问导致进程崩溃的问题。提升了服务启动过程的鲁棒性。
优化 RPC 连接超时参数配置
修复 tdsql_rpc_connect_timeout 参数与持久化变量的逻辑适配问题,确保参数修改生效。
优化统计信息 RPC 重试机制
细化统计信息相关 RPC 的重试逻辑,避免长时间占用系统资源,确保操作执行的稳定性。
优化 Inplace DDL 操作稳定性
综合改进 Inplace DDL 操作相关问题,包括:优化 RENAME COLUMN 在非 LogService 下无需禁写阶段;增强批量 Rename 操作的原子性;改进 start_ddl_job 日志输出;修复 DDL 回滚流程中的状态管理问题,确保 DDL 操作的可靠性和一致性。
解决 CPU 资源异常占用问题
细化统计信息相关的 RPC 机制,以及新增时间戳机制,避免重复的计算导致消耗过多的 CPU 资源。
优化 Vanished RG 事务处理机制
改进 Vanished RG 的事务反向探活逻辑,确保事务在 RG 状态变化时能够正确处理,提升系统可靠性。
优化 MC 与 TDStore 状态感知机制
改进 MC 对 TDStore 运行状态的感知能力,确保在 TDStore 完全启动后再下发相关任务,提升操作成功率。
优化大事务与 RG 合并的并发处理
优化大事务与 RG 合并操作的并发控制,确保在复杂场景下事务处理的正确性和一致性。
优化主灾备切换高可用性
改进主灾备切换流程,提升系统在故障场景下的自动恢复能力和服务连续性。
优化 DDL Recovery 后台线程退出机制
改进 DDL Recovery 后台线程管理,确保线程能够及时响应退出信号,提升系统维护效率。
修复 DROP VIEW 操作连接丢失问题
解决 jmysql 执行 DROP VIEW 时出现的连接丢失异常,确保操作执行的稳定性。
修复克隆实例规格不匹配问题
修复多 RG 实例克隆为单 RG 实例时,因 RG 规格不匹配导致无法创建数据对象的问题。
修复 InstallSnapshot 持续失败问题
修复 InstallSnapshot 监控采集错误导致的误报。
Merge RG 去除校验 leader 和 follower 上报 index 位点一致性
去除冗余的位点一致性检测,提升 Merge RG 稳定性。
备份恢复
增强全量备份过程中 SST 文件上传失败的重试能力
优化了全量备份流程的容错性。当上传 SST 文件到对象存储(COS)过程中,因网络波动或 COS SDK 分段上传部分失败而报错时,新增了针对该场景的重试机制,提高了备份任务的整体成功率。
优化快照备份恢复流程
改进快照备份恢复任务的回放逻辑,增强错误处理和重试能力。
增强增量备份状态监控能力
支持通过 MySQL Status 查询增量备份状态,提升备份任务的可见性与运维便利性。
数据迁移
优化克隆过程中的节点驱逐处理
改进克隆过程中节点驱逐的处理逻辑,确保在节点异常情况下能够正常完成数据恢复。
运维
增强 bstack_fast 诊断工具,支持按线程 ID 输出原始调用栈
为快速线程栈聚合工具 bstack_fast 增加非聚合输出模式。新模式下,工具将输出每个线程的原始调用栈,并关联 bthread_id 或 pthread_id。此功能便于运维人员在排查复杂并发问题时,准确定位到特定线程的执行路径。
修复 MC 任务归档逻辑缺陷,防止内存泄漏与 OOM
修复了 MC 在归档已完成任务时的一个逻辑错误:当任务列表中存在"迁移中"(migrated)状态的任务时,归档流程会错误地中断,导致后续所有已完成任务都无法归档。大量任务堆积在内存中最终导致 MC OOM。修复后,归档逻辑能正确判断任务状态,确保内存得到及时释放。
统一慢查询日志(Slow Log)中所有耗时时长的单位为秒,并修复显示格式
修复了升级后慢查询日志中执行时长(如 Query_time)在前端界面显示为0的问题。同时,对内核慢查询日志格式进行标准化:将 Query_time、Lock_time 等所有耗时时长的单位统一为秒(s),并统一保留6位小数的精度,使其与 MySQL 标准格式一致,便于日志中心与 DBBrain 等监控工具解析,消除歧义。
改进 bstack_fast 诊断工具的回溯算法,使用 libunwind 提升栈回溯完整性
将 bstack_fast 工具的栈回溯方法从原有的帧指针(FP)回溯法替换为 libunwind 库。新方法能够正确回溯那些未保存帧指针的函数(如 libc 库中的 usleep、nanosleep 等),解决了原有方法在遇到此类函数时调用栈信息不完整或跳跃的问题,使诊断工具输出的调用栈更精确、更接近 gdb bt 或原生 bstack 命令的结果,提升了线上问题排查效率。
增强后台线程卡死自动诊断能力
优化了系统诊断功能,当后台监控线程检测到所有工作线程(Worker Thread)均处于卡死状态时,将自动触发快速堆栈转储(Fast Dump Stack)模式。该模式会导出所有 pthread 和 bthread 的调用栈信息,为后续分析严重系统僵死问题提供关键现场数据。
优化多 AZ 实例启动时副本分布策略
修复多可用区实例启动时 Primary RG 副本分布不均匀的问题,确保数据分布均衡,提升系统稳定性。
推进 RPC 版本升级
在升级到21.2.3版本时同步更新 RPC 版本,确保功能兼容性。
优化分布式锁获取失败日志输出
改进获取 MC 分布式锁失败时的日志信息,提供更明确的警告提示。
保障 Agent 个性化配置持久化
优化 Agent 配置管理机制,确保个性化修改的参数在重启和升级过程中不被默认值覆盖。
优化 Bvar 状态名称长度限制
把 Bvar 的展示从 SHOW GLOBAL STATUS 中去掉,提供内存表 BVAR_INFO 来展示所有 Bvar 的值。 增强 Pod IP 分配异常处理能力
改进 Pod IP 分配失败场景下的拨测机制,确保变配流程不受影响。
优化 MC Cntl RPC 超时配置
支持通过 tdsql_mc_meta_rpc_timeout 参数配置 MC 控制 RPC 超时时间。
优化事务重试日志输出级别
调整事务重试日志的输出级别,便于日常运维问题定位。
增强审计日志的耗时统计详情
完善审计日志中的分段耗时统计信息,提供更细粒度的性能分析依据。
增强 TDStore 慢查询日志分析能力
在事务和 RPC 层面新增细化的慢查询日志,提供更详细的性能分析信息,便于快速定位和解决慢查询问题。
优化 SQL Engine 升级回滚机制
将升级过程 sys 表的更新和节点重启过程解耦开来,待所有节点重启完成后,通过 dbms_admin.upgrade() 实现系统表变更的幂等操作,提升升级过程的安全性与可靠性。
优化 Binlog 相关参数默认配置
调整 Binlog 相关参数默认值,避免给熟悉 MySQL 的用户带来困惑,提升用户体验。
增强 KILL 命令错误信息反馈
优化 KILL 命令执行失败时的错误信息返回,提供更明确的错误提示。
优化 Persist 变量设置逻辑
改进 Persist 变量的设置和管理机制,增强 MC 对全局变量配置文件的支持能力,提升系统配置管理灵活性。新增语法 SET PERSIST node_type x=x1; 其中 node_type 类型为 hyper、storage、engine、cdc、columnar、log_only 之一;变量 x 只会同步到对应类型的节点。SET PERSIST x=x1; 根据执行 SET PERSIST 命令的节点的 node type 转化为 SET PERSIST node_type x=x1 执行,这里 node_type 代表该节点的节点类型。
增强事务等锁慢日志功能
在 TDStore 中添加事务等锁的慢查询日志,并支持通过开关动态控制,便于问题定位和分析。
优化 Schema 状态展示
完善 SHOW CREATE TABLE 命令,使其能够正确显示所有相关的 Schema 状态信息。
统一 RPC 包大小配置参数
废弃冗余的 tdstore_rpc_max_body_size 参数,统一使用 tdsql_max_rpc_body_size,简化配置管理。
扩展内核监控指标采集能力
增强内核监控指标采集功能,提供更丰富的系统运行状态监控数据,便于系统性能分析和问题定位。
增强内核直采指标时间戳支持
完善内核直采指标接口,在 Prometheus 协议指标 Value 后增加时间戳信息,便于时序数据分析和监控告警配置。
优化表打开与查询执行逻辑
改进表打开与查询执行流程,避免不必要的关联表操作,优化内存使用效率。
优化 BulkLoad 参数配置体验
简化 BulkLoad 操作涉及的 RocksDB 参数配置,提供低、中、高三档资源预设,简化运维操作,提升导入效率。
提供 MC 全局变量快速修改工具
开发便捷工具,支持快速修改 MC 保存的全局变量信息,提升运维效率。
优化 Unix Socket 锁文件设置
改进 Unix Socket 锁文件设置逻辑,避免进程冲突导致的启动失败问题。
建立 TDStore 数据文件格式升级兼容性规范
制定 TDStore 数据文件格式升级兼容性规范,确保升级过程可安全回滚,提升系统维护的可靠性。
推进数据对象位置分布能力产品化
整合数据对象位置分布相关基础功能,形成体系化的产品解决方案。增加 MC 对一级时间 Range 分区的调度能力,丰富数据管理和调度功能。支持通过 SQL 语句创建 Distribution Policy,提供更灵活的数据分布管理手段。
启用 RocksDB 监控指标
启用 RocksDB 的监控指标范围查询次数,完善系统监控体系。
修复21.2版本升级流程中的系统表创建问题
改进升级流程中的系统表创建逻辑,确保升级失败时可安全回滚系统表相关 DDL。
问题修复
修复了在批量访问键值 (Batch Access Key) 的初始化阶段,接收到终止 (killed) 信号后,未能立即退出,而是等待到下一个检查点才退出的问题。通过提前关键位置的检查点,使查询能更及时地响应终止操作。
降低计时器精度要求,修复了其在部分机器上初始化缓慢的问题
修复了在模糊测试 (Fuzz Testing) 中,由特定复杂嵌套查询(涉及大量 NOT EXISTS、UNION ALL、GROUP BY、HAVING 等子句的组合)触发多范围读取 (MRR) 路径下的程序崩溃 (Crash) 问题。
修复了在分区表上使用 ref 访问方法进行等值查询时性能不佳的问题。根因在于每次获取一条记录后,都需要为所有分区执行 reset_parallel_scan_exec_flags 操作,该操作成本与分区数成正比,导致大量开销。
修复了在使用多范围读取 (MRR) 执行包含分区表的复杂查询时,因分区表处理器 (ha_rockspart) 的 ref_length_actual 字段未正确同步底层存储引擎的值,导致后续计算中使用了未初始化的异常值,进而引发内存访问错误和进程崩溃 (Core) 的问题。
修复了在超大分区表(如1000个分区)上执行查询时,优化器进行范围行数估计 (records_in_range) 时需要扫描每个分区进行行数估计,导致耗时较高。
修复了事务内存限制参数 max_txn_size 在特定配置下实际生效值与预期不符的问题。确认问题源于参数解析或传递过程中的不一致,导致事务内存上限被错误地设置为默认值(约1GB)而非配置值。
修复了从21.2.0之前版本升级上来的灾备实例,在同步数据库用户 (DB User) 权限时报错的问题。根因在于新增的 DB User 同步功能默认使用新账户 (tdsql3_sys_standby_xxx),而老版本灾备使用的是旧账户 (tdsql3_sys_standby),导致权限授予失败。
修复了 BatchGetV3 接口在特定条件下可能返回 part_ctx_version mismatch 错误的问题。该问题由开发 multi-scan 功能时引入的一段冗余逻辑导致,可能使本该走事务读的请求错误地走到了快照读路径。
修复了为复合索引(Compound Index)估算每个键部分(Keypart)的平均记录数(rec_per_key)时,可能出现"后续键部分的 rec_per_key 值比前缀键部分更大"的逻辑错误。根因在于不同键部分的 rec_per_key 可能由不同算法独立估算,彼此间无约束。
修复了当表中存在列直方图(Histogram)时,执行 ANALYZE TABLE 无法正常更新表的行数统计(table_rows)的问题。根因在于特定代码路径中,直方图估算的行数错误地覆盖了 ANALYZE TABLE 通过精确扫描获取的行数。
修复了在数据更新后,过期的列直方图(Histogram)会影响新生成的索引统计信息的问题。这导致即使执行 ANALYZE TABLE 后,复合索引的 rec_per_key 和 cardinality 值仍然是错误的,进而影响优化器的行数估算。
修复了在使用列直方图(Histogram)估算复合索引前缀的选择性时,用于累计前缀不同值数量(total_prev_ndv)的逻辑错误。该错误导致在计算后续键部分的 rec_per_key 时,使用了被错误放大的前缀不同值数量,使得估算结果不准确。
修复了在特定混合节点 (hybridnode) 故障叠加场景下,对主 MC 进程发送 kill -19 信号可能导致 I/O 持续性跌零的问题。
修复了 MC 模块在退出及切主流程中,因 GetRepGroupsByTs 函数存在潜在死锁而导致进程卡住无法正常停止的问题。
修复执行 where 条件中包含子查询的 update 语句时,binlog 生成异常的问题。
修复快照恢复过程中遇到 PassiveAbortStage 的 job 时,因 job 无需 report 而导致回放流程卡住的问题。
修复 TDStore client 执行 get_raft_node_info 时丢失 log receiver 信息的问题。
修复 RG 切换 leader 后再进行合并操作时,出现误杀事务的问题。
修复 log-receiver 残留问题,优化退出流程确保即使 log-service 不存在时也能正确删除残留的 log-receiver。
修复虚拟表 TDSTORE_INSTALL_SNAPSHOT_INFO 因存储格式变化导致升级后解析出错的问题。
修复 LogService 回放过程中 expanded RG 非预期持久化 merge log 位点的问题。
修复21.2.3版本中集群从3副本形态缩容至2 + 1形态时,因迁移条件判断未特判日志副本(其 size 应为0)导致流程卡住的问题。
LogService 还未初始化完成,查询该视图直接返回。
修复 1PC commit_ts 优化逻辑中可能导致事务 commit_ts 小于 safe_read_ts 的问题。
修复 db_pending_compaction_bytes_limit 相关监控指标混淆问题。
修复 LogService 中 manager 组件启动时序晚于 controller 导致的 panic 问题。
修复当表包含64个 Key 时执行 TRUNCATE PARTITION 失败的问题。
修复慢查询日志大小计算逻辑错误问题。
在 log receiver 向 leader 发送连接之前,log receiver 就收到了 install snapshot。因此,start_index 还未被赋值,所以采用了默认值2。导致 start_index 计算错误。
修复 tdstore_compact_on_delete_ratio 参数在21.0.0版本重构中被错误设置为0的问题。
修复 CDC 回放 Raft Log 过程中生成的 Checkpoint 导致索引回退的问题。
修复 auto commit 事务导致分布式事务统计不准确的问题。
修复在全量备份期间发起修改主可用区任务时流程卡住的问题。
修复多个节点调度 Log Receiver 对象时 Raft Leader 仍会 Purge Raft Log 的问题。
修复行存 MPP 模式下 Item_func_group_concat 函数执行异常问题。
修复 ImproveLocation 功能错误地迁移了创建失败的复制组(RG)的问题。
修复普通二级索引使用 BatchPut 时未对 RPC 包大小进行校验的问题。
修复自测环境中 ha_rocksdb::check_index_dup_key 函数导致的 core 问题。
修复降副本操作产生的 offline 任务在 abort 流程中副本状态未正确恢复的问题。
修复 online copy 操作失败后临时关联表定义残留问题。
修复 DDL 任务失败时残留 stage 信息未清理的问题。
修复实例缩容后手动打散分区时因未设置强制分裂导致任务失败的问题。
修复分区表更新时未同步更新整表统计信息的问题。
修复分区表通过二级索引执行 count(*) 时未正确调用 ha_rocksdb::records_from_index 的问题。
修复有显式分区策略的分区表在添加索引时可能出现的死锁问题。
修复 MC leader 节点被终止后出现的短暂无主状态问题。
修复 Update 语句在非隐藏主键表的非自增列上错误触发 AutoInc RPC 的问题。
修复创建灾备实例时前置检查 SQL 语句执行超时的问题。
修复因 CVM 规格过小导致 bthread_timer_threads 参数校验不通过,进而引发 Pod Crash 的问题。
语法变更
|
新增 | | SELECT CURRENT_GLOBAL_TIMESTAMP();-- 获取当前的全局时间戳(GTS)。
SELECT FROM_UNIXTIME(CURRENT_GLOBAL_TIMESTAMP () >> 24);-- 返回 GTS 的物理时间部分。
|
修改 | | 根据当前节点的类型自动转换为对应的 SET PERSIST node_type x = x1 形式,仅对同类型节点生效。 |
新增 | | 支持 SAVEPOINT 功能,具体语法如下: 1. 事务中创建 SAVEPOINT:SAVEPOINT sp_name 2. 回滚到某个 SAVEPOINT:ROLLBACK TO SAVEPOINT sp_name 3. 释放某个 SAVEPOINT:RELEASE SAVEPOINT sp_name |
修改 | | 新增对分区表的支持,同时新增限制:在 WHERE 子句中包含 GROUP BY 或 LIMIT 时,禁用 BATCH LIMIT 功能。 |
数据字典变更
|
新增 | | 用于展示 TDSQL Boundless 系统中所有的 bvar 统计监控项信息。 |
新增 | | 快速查询当前实例中是否存在灾备功能不支持的表。 |
V21.2.2
版本更新说明
版本更新
优化 RG 元数据备份性能
优化 RG 元数据备份机制,解决元数据过大导致的备份延迟、Compaction 影响以及 Agent grpc 限制导致的 OOM 风险。
精简 Job 中的 RG 元数据
精简 Job 中存储的 RG 元数据,移除不必要的 region metas,减少 etcd 存储压力,提升备份恢复效率。
问题修复
修复 MC 任务归档逻辑问题,避免因归档顺序导致任务卡住。
修复增量恢复过程中错误选择 Log-only 节点作为恢复节点导致 OOM 的问题。
修复 MC 死锁导致 SQL Engine 无法获取路由信息的问题。
修复 TDStore 节点启动时遇到停写导致启动流程卡住的问题。
修复单 RG 模式主 AZ 实例周期性切主的问题。
V21.2.1
版本更新说明
扩展性与性能
调整 create region 完成时日志的打印级别
create region 任务完成时会完整地打印 RG meta,当 DDL 并发很大并且 RG 元数据很大时会显著影响建表的效率。
减少 create/delete region 任务完成后的元数据压缩次数
create/delete region 完成后会压缩两次元数据,如果 RG 元数据大会影响 DDL 耗时。
tdstore 心跳去掉 key range 上报
region 数量增多后,心跳中的 key range 会使 mc 频繁地分配内存、gc,占用较多 CPU。
语法与功能
RR 隔离级别 range 锁优化
RR 隔离级别下可选择打开开关,不加 range 锁。
稳定性
磁盘满的情况下,需要确保 RG 一定能够重启成功
新增磁盘空间检查,避免当节点多次磁盘满时,概率会导致 RG 启动失败。
备份恢复
调整增量备份单轮次 RG 备份策略
之前的增量备份策略是执行某个 RG 备份的线程 会追到该 RG 的 applied index 才会停止然后选择下一个 RG 进行备份。
本修改将其调整为每次只会备份固定上限的日志(从备份日志的数量以及数据量两方面进行控制,选取最小的阈值), 确保大多数的 RG 的进度是差不多的。避免出现部分 RG 备份进度过于落后的问题。
数据迁移
TiDB 至 TDSQL Boundless 一键式数据迁移工具
提供一个 TiDB 到 TDSQL Boundless 的一键式迁移工具,方便 TiDB 客户快速进行数据迁移。
运维
jmysql 工具新增 -A 选项以避免 use db 操作耗时过长
jmysql 增加 -A 参数 避免 use db 操作慢的问题。
tdstore 新增 cf 类型,对于版本升级回滚的影响
之前 tdstore 在新增 cf 类型的升级版本,会因为旧版本不能识别新增的 cf 类型导致升级后无法回退。这里增加了兼容未知 cf 类型的机制,避免了出现新增 cf 后因为无法识别造成 tdstore 无法启动问题,从而支持了新增 cf 类型版本的版本回退操作。
移除乐观事务模型支持
内核新增检测屏障,启动事务类型为乐观事务的集群时,抛出错误。
问题修复
修复 SHOW MASTER STATUS 命令因需等待 Binlog 回放至当前时间点而产生约2~3秒延迟的问题。
Proxy 转发数据结构析构顺序错误,导致 heap-use-after-free。
当 checkpoint 检测到有重复的 log index 时,会重建 log handler 导致 binlog 卡住。
reload_index_stats 没有正确从 dd 中加载 index statistics。
ResetReplica 操作由于返回值被忽略,有可能实际失败但返回成功。
主键表或无主键表使用 INPLACE 算法增加 UNIQUE KEY 后,执行点查系统会稳定 crash。
超大表采样计算 index cardinality 时,采样 key 的个数溢出,错误设置为 UINT32_MAX。
大量 Job 归档的 SaveBatch 没有 limit 限制,增加了这个限制。
如果同时 set persist 多个参数,遍历每个参数时解析成功的参数生效,解析失败的 Sys_var_flagset 类型参数将打印错误日志但不报错,解析失败的其他类型参数将报错。
如果 mc 存的 persist variables 时一个"{}"解析会 core。
当并发从 cos 拉取 raft log 文件时,可能导致下载到本地的文件残留。
job 交互流程中,会多一次额外的 etcd 请求。
建表时 mc Panic,进程退出。
通过当前查询灾备延迟没有用到表的索引,在数据量较大时会导致查询超时。
容量均衡时没有把 cdc 节点筛选出去,会受到 cdc 节点磁盘容量的影响。
大表获取 block range stats 时消耗过多内存资源。
合并 RG 任务与事务执行并发时,可能导致协调者对迁移信息一致性校验的误判。
Binlog 开启时与 DML 并发,需要严格判断 DML 事务提交时刻与当前 LogService 启动时刻的先后顺序,保证不能回放之前的事务数据。
升级到21.2.0版本过程中,部分升级成功的实例通过 reloadStatistics rpc 来同步统计信息。
通过 multi query 形式执行 DDL 时,ddl_jobs.ddl_info 会记录多条 SQL。
query 查询分区表时,没有做到扫描完一个分区就释放对应内存。
超大表在获取 block range stats 时,会打印一些调试日志。
在全能型副本+日志副本的混合 RG 下,由于日志副本没有数据,数据大小永远为0,无法满足"确保 leader 和 follower 的 region size 差距不要太大"的 region 分裂条件,因此无法触发 region 分裂。
热点判断节点 cpu 离散度的指标计算不正确。
多主 az 节点创建分区表时,leader 不能均匀地分布到所有主 az 节点。
要保证相同的 ts barrier 只持久化一次。
之前对于系统视图,不会转发。修复后查询系统视图:(1)转发到 rg 所在节点执行,减少 rpc 开销;(2)加一张 INFORMATION_SCHEMA.PARTITIONS_VERBOSE,INFORMATION_SCHEMA.PARTITIONS_VERBOSE 和当前版本的 INFORMATION_SCHEMA.PARTITIONS 一样,之前依赖 INFORMATION_SCHEMA.PARTITIONS 的逻辑可以改用 INFORMATION_SCHEMA.PARTITIONS_VERBOSE;(3)INFORMATION_SCHEMA.PARTITIONS 修复后不再显示二级分区表的第一级分区。
从存储获取的小表的统计信息估计不准。
lease 过期导致拿不到 stream id。
数据字典变更
|
修改 | | 新增了 RANGE_CACHE_MISS、RANGE_CACHE_SAMPLE_ROWS、RANGE_CACHE_REFILL_TS 来监控 range cache 的运行情况。 |
修改 | | INFORMATION_SCHEMA.PARTITIONS 不再显示二级分区表的第一级分区,其他不变。
|
新增 | | INFORMATION_SCHEMA.PARTITIONS_VERBOSE用于展示比标准 PARTITIONS 表更详细的分区表信息。主要区别在于:
PARTITIONS视图:仅显示实际的分区/子分区信息,对于有子分区的表,不会显示一级分区的汇总信息。
PARTITIONS_VERBOSE视图:同时显示一级分区和二级分区的完整信息,提供更全面的分区结构视图。
|
V21.2.0
版本更新说明
扩展性与性能
BinlogThread 消费完缓存及时唤醒等待的线程推 binlog 数据
及时唤醒等待的线程,减小延迟。
增加巡检逻辑把分裂的主键合并回一个 RG
目前 mc 存在像中提到的为了均衡数据把主键分裂到多个 RG 中的情况,而在均衡一段时间后实例可能出现删数据、扩容等情况,这个时候实例的磁盘空间可能就又变得很充足了,或者某一段主键 key range 又没有多少数据了,这个时候可以尝试把分裂的主键数据再合并回一个 RG。
减少 Job 完成时对元数据的压缩次数
在 split/merge region 等任务完成时,将对元数据的压缩操作减少到1次,降低对事务耗时的影响。
灾备同步中,MC 临时帮忙进行 DB 用户同步
在灾备同步中,MC 启动一个后台线程将主实例的数据库用户信息同步到备实例。
注意:(1) DB 用户同步会忽略系统用户("root", "mysql.infoschema", "mysql.session", "mysql.sys", "tdsql3_sys_*")(2)当备实例存在对比主实例多余的用户,则这些用户会在备实例被删除。
TDStore 支持实时的多副本数据校验功能
通过参数设置, 可以在指定时间内打开多副本数据一致性校验。
sqlengine 审计日志里面区分 bulk load 导入方式
审计日志里面区分 BATCH_PUT/BULK_LOAD/STREAM_LOAD。
merge region 优化为只阻塞 vanished region 和 expanded region 中的事务
merge region 的原有实现会阻塞当前 rg 中的所有事务,可能影响 merge region 范围外的事务读写和提交耗时。该功能将影响范围缩小,只影响读写过 vanished region 和 expanded region 的事务。
优化 split rg 过程中数据准备算法
split rg 的原有数据准备算法的复杂度是 O(n*m),当 region 数量和事务写入的 key 数量同时很多时,执行时间会很长。该功能将数据准备算法的复杂度优化为 O(n+m),极大的缩短了执行时间。
区间物理删除操作执行流程优化,先判断 L0 中是否存在待删区间内数据,若无,则跳过 L0->L1 delete range compaction
提升区间物理删除操作性能,对于大量删库删表操作,空间释放速度有一定优化。
并行查询支持 GROUP MIN MAX
支持形如 SELECT c1, MIN(c2), MAX(c2) . GROUP BY(c1) 的 GROUP MIN MAX 查询并行化。
DROP DATABASE 性能优化
优化前 drop 多表的 db 时会报"更新的记录太多超过了事务大小的限制 EC_TDS_STORAGE_EXCEED_MAX_TXN_SIZE"错误而失败,优化后不会报该错误。drop database 操作性能提升30%~50%,平均43.5%。
Fast Online DDL 临时文件支持压缩
Fast Online DDL 过程中由于排序等原因会产生临时文件,其中临时文件的总大小为原数据大小未压缩的两倍,会占用大量磁盘空间。增加压缩后,最大的占用大小为两倍元数据压缩后大小。
优化估计 range 内的行数
支持通过 range cache 来缓存 sst block range 的统计信息,利用这些缓存的 block range 统计信息来估计查询 range 内的行数,避免直接复用 range 内的行数,导致选错索引。
DDL 通过广播刷缓存来替代 GLSV
DDL 不再维护 global schema version,通过广播的方式来通知其他节点刷新缓存,以此保证 table cache、dd cache 的多节点缓存一致,降低缓存更新的粒度。
将 DDL 执行阶段信息实时展示出来
支持通过查询 information_schema.DDL_JOB_STAGE_INFO 视图,来将 DDL 执行阶段信息实时地展示出来。
通过增加一个 SESSION 级别的变量 tdsql_ddl_rpc_trace_threshold_ms,用于控制 ddl stage info 中 RPC 信息的展示范围,默认值为10000ms,也就是10s。该变量的功能为:RPC 总耗时小于 tdsql_ddl_rpc_trace_threshold_ms 的 RPC 信息将不会在 HISTORY_STAGE_INFOS 字段中展示出来。
语法与功能
支持更多语句并行
放开如下并行限制:Dynamic Range Scan、Index Merge Scan (Index_Merge)、Derived Table,Table Function,带有这些的 SQL 语句可以使用并行计划执行了。
支持中断 scan/get rows count 类型的 SQL
当带条件下推的 scan 需要扫描的行数非常多时,可能在 tdstore 层执行比较久,sqlengine 需要等待 tdstore 回包后,才能中断本次 sql 的执行,期间即使用户执行了 ctrl+c 或者 kill 掉 session,也仍然无法中断,tdstore 会继续消耗资源。本功能支持了 scan 类型以及 get rows count 类型的 sql 中断能力,用户 ctrl+c 或者 kill 掉 session 后,tdstore 层的执行会立刻中断,向 sqlengine 回包。
支持使用 hint 指定 proxy 节点
提供 HINT 指定将 SQL 转发至对应节点,具体语法和规则:
启动 proxy:select * /*+ PROXY / from t_
启动 proxy,选择节点:select /+ PROXY(1) / from t
启动 proxy, 并且选择使用对应表或分区所在的第一个物理节点: select /+ PROXY([<db>.]<table> [PARTITION(<partition>)])
支持通过采样数据来估计 index 的 ndv
通过采样 sst block 数据,计算采样中的 key 的 ndv,来估计整个 index 的 ndv。同时,支持周期性的自动更新和数据变动导致的自动更新计算。支持普通表和分区表,并且更新后的统计信息同时会同步到其他节点,尽可能保证 index statistics 的准确性。
采样数据的大小通过 sample_sst_blocks(默认为8)来控制。
Logservice 回放独立维护表结构,不依赖数据字典
Binlog-dump 模式的 logservice 回放解析 raft log 时根据 sid + tindex_id 从 sys.logservice_dd_tables 里获取表结构,不再依赖数据字典(mysql.tables, mysql.table_histories)里的表结构;并且在回放 ddl 时对 sys.logservice_dd_tables 里的表结构进行更新。
稳定性
及时更新 raft 回放 log 时对 applied index 的推进
如果遇到一批需大量回放的 log,导致 applied index 延后更新。可能导致 save snapshot 等请求都被拒绝。优化更新逻辑,及时地推进 raft applied index。
缩减计算层与存储层的 RPC 重试间隔、增加重试次数
缩减重试间隔、增加重试次数,在「总重试时长」不变的前提下,减少重试间隔能尽快恢复服务。
BulkLoad 适配只读模式
bulk load 导数据的过程中,如果进入只读模式,bulk load 会重试,等退出只读模式以后,才会继续传输 sst 文件。
Routine ID 的获取兼容不同的 Go 版本、不同的架构
不同的 Go 版本、不同的架构下 runtime 包中 go 结构体的字段可能不一样,需要适配兼容保证获取到正确的 routine id。
tdstore rpc 接口预检查重构
重构 tdstore rpc 接口预检查代码。
增加 table_definition_cache_max_mem 参数支持通过 mem size 淘汰 TABLE_SHARE
增加一个参数 table_def_cache_max_mem_size,用于控制 TABLE_SHARE 结构体的淘汰,当系统中闲置的 TABLE_SHARE 结构体的内存大小超过 table_def_cache_max_mem_size 阈值,将会触发 TABLE_SHARE 结构体的淘汰机制。
MC 感知 TDStore 节点是否存在异步清理数据的任务
Destroy replica 或者 delete region 任务完成后,TDStore 会异步地清理数据,MC 可能会因此误判仍然下发均衡的任务,造成节点间出现反复迁移数据的现象。
TDStore 在心跳中上报节点是否存在异步清理任务,MC 根据指标判断决定是否需要进行数据均衡。
install snapshot 流程优化,leader 在 prepare snapshot data 时,先判断 L0 层是否存在待迁移数据,若不存在,则无需执行 L0->L1 compaction
提升 RG 迁移性能,减少 RG leader 侧准备快照的时间。
迁移任务超时时间估算优化,将快照准备时间也加入到超时时间估计当中去。
减少迁移任务超时发生的几率,提高迁移任务成功率。
优化备份恢复元数据存储
提升备份恢复系统稳定性。
运维
region 数量非常多的情况下,可能残留较多 txn_memory_lock_map 类型的内存统计
支持动态修改 REPORT_TXN_MEM_DELTA_THRESHOLD_SIZE 参数。
方便观测 binlog 处理的 tps
增加 bvar binlog_process_trans_num 记录当前生成 binlog 事务数,方便观测 binlog 的 tps。
agent 新增 binlog 状态 dump 功能
间隔一段时间 dump 一下 binlog 的状态到 binlog_stat 目录。
取消 Dumper 和灾备不能共存限制
创建灾备实例时候,取消"实例已设置 Binlog,暂时不支持添加灾备/只读实例"的限制。
新增 bstack_fast 线程调用栈回溯工具
install 目录下 新增 bstack_fast 工具。
bstack_fast 的功能和 bstack 类似,但不会影响进程运行,可以在实例运行时调用。bstack_fast 具有更快的调用栈回溯速度,在 10 秒内可以回溯上千个 bthread/pthread 的调用栈。
根据实例规格动态设置 tdstore_user_cf_soft_pending_compaction_bytes_limit 和 tdstore_user_cf_hard_pending_compaction_bytes_limit,tdstore_user_cf_max_bytes_for_level_base,tdstore_user_cf_write_buffer_size 等
当前 tdstore 的规格支持32c,64G 配置10T 以上的磁盘,这种情况下单节点的数据量就会很大。按照默认的参数很容易进入缓写,需要调整相关参数减少缓写。本地盘情况下,或可以将 compaction 线程数增加一倍。
MC CPU 占用率达到阈值时,自动采集 profile
支持 MC 在 CPU 占用率到达阈值时,自动采集 profile,该功能默认关闭。
在 information_schema.meta_cluster_rgs 新增了字段
property:广播同步 rg 和普通 rg 的 property 不同,前者为3,后者为默认值0。
witness_quorum 和 witnesses : 日志副本相关。
日志打印优化
当出现 blob 类型解析失败报错 corrupt data 的时候,日志中打印的 blob length 有误。
sqlengine.err 日志分割大小调整为128M
日志大小设置为128M,最大数量设置为10。
对齐 DATA_LOCKS、DATA_LOCK_WAITS 表中的 thread_id 语义与原生 MySQL 一致
对齐 DATA_LOCKS、DATA_LOCK_WAITS 表中的 thread_id 语义与 原生 MySQL 一致,加上 processlist_id 列;tdstore_part_ctx 表加上 thread_id 等相关字段。
优化 RpcTrace
目前 RpcTrace 粒度比较粗,造成 debug 困难的问题,如,这里需要更加细粒度的 RPC trace 追踪。比如在 PQ MPP 模式下,一个查询涉及到多个 Worker,RpcTrace 需要能够体现出不同节点之间的 rpc trace,以定位查询中的具体瓶颈所在。
log_error_verbosity 支持 session 级别 log 日志
线上定位问题的时候偶尔需要开启 debug 日志,global 级别日志量太大滚动太快,支持 session 级别 debug 日志控制:
set log_error_verbosity=4 && set tdsql_log_mod_flags='debg_flag=on' 开启会话级别 debug 日志。
log_error_verbosity=5, 打印所有 session 的 debug 日志。
支持通过系统表展示历史死锁详细信息
在执行死锁检测的节点上查询该系统表,可以得到历史所有死锁的发生时间、被回滚的事务的 ID。
构成死锁环的事务详细等待关系:包括申请锁和阻塞的事务 ID,申请和阻塞的锁范围,造成该等待关系的事务正在执行的 SQL 语句,造成该等待关系的 SQL 运行在哪个节点上)。
支持在 MySQL Status 中 统一查询 bvar
汇总 TDSQL Boundless 的各种 bvar 指标,聚合所有 bvar 自动注册到 MySQL Status 中。
CPU 占用率达到阈值时,自动打 perf
支持在 CPU 占用率达到阈值时,自动调用 perf 工具打印统计信息。功能默认关闭。
worker_busy_second 达到阈值时,自动打 bstack
支持在工作线程繁忙到一定程度时,自动调用 bstack 工具打栈信息。功能默认关闭。
支持 TDStore 控制 sys rg 是否进入只读
新增 TDStore 变量 tdstore_enable_sys_rg_readonly 控制 sys rg 是否只读,用于磁盘满场景下 DROP TABLE 释放空间。
默认为 true,行为与先前一致,如需在节点磁盘满场景下执行 DROP TABLE 操作,需要先设置 tdstore_enable_sys_rg_readonly=false 后方可执行。
数据校验工具
提供一个数据校验工具,用于两个数据库之间做数据一致性校验,并输出不一致结果与修改建议。
SST 边界对齐策略,支持指定从具体哪一层才开启 SST 边界对齐
指定从哪一层开启 SST 边界对齐,在此之上的层不再边界对齐,该层和之下的层才会执行边界对齐逻辑。从而减缓较上层(L1、L2)因为边界对齐导致大量过小 SST 文件的现象。
针对硬链接的迁移任务,适配了 mc 终止任务的流程,支持立刻终止
原有终止迁移任务的流程,当数据量很大时,无法立刻终止迁移任务。该功能支持了迁移任务的快速中断。
问题修复
只有回放 sys rg 的节点上报监控信息,多 CDC 下,会存在一些 cdc 节点没有 sys rg 的回放而不上报。
分区表 reset 时没有清理所有分区的 m_retrieved_record。
并行代价估算在预估并行拆分 range 数量时可能不准导致不走并行。
节点需要均衡时存在只选出 src 或者 dst 节点的情况。
节点升级时,hybird 节点新版本的 sqlengine 拉取 MC 中 persist 的一些旧版本枚举参数(例如 parallel_query_switch)时无法解析而失败退出,导致升级流程失败。
lease cmd 回放得到的 min prepare ts 被记录在 TDReplicationGroup 的 applied_min_prepare_ts_ 和 unapplied_min_prepare_ts_info_ 成员变量中。不过由于并行回放,lease cmd 之前的事务日志可能实际上并未完全回放,所以将 follower 上 rg 的 applied_min_prepare_ts_ 直接作为 min prepare ts 可能会比预期值偏高。
blob/test 前缀索引下推时出现踩内存问题和数据不一致。
push write fence 和切主并发导致失败,由于 error action 没有设置,导致 SQLEngine 没有做重试。
关闭增量恢复过程中的 write stall 之后 restart recover 拉起有概率会因为停写导致初始化超时失败。增加等待逻辑以及在 restart recover 初始化时设置 tdstore_user_cf_disable_slow_compaction_stall 为 true 避免停写导致的超时失败。
MC 判断 RG 是否有未完成任务时,如果有调度 Task 发起了 Job,MC 进程有概率会发生 Panic 退出。
witness 迁移回滚阶段,remove 副本完成时 witness 元数据没有更新,已经删除的副本仍然在 witnesses 中。
Item_subselect 如果属于 PARALLEL_EVAL_PRE 类型的话,那么这个数据结构的 unit 是恢复不了的。
在日志中补充 proxy 与 proxy exector tid 的关系,方便定位问题。
sqlengine 重启 + 主动切主 + merge rg 并发,导致 merge rg 的 commit 阶段执行很慢。
同步表备机回放日志时没有加区间锁。
普通副本迁移叠加 uninstall 节点导致 job 无法结束。
shark 调用 GetTDBRTaskStatus 查询 mc recover 状态,并且和 mc 恢复走到 map 逻辑并发的时候会发生。
BulkLoad 事务传输文件时因为网络问题重试,第一次发起的 RPC 删掉了第二次成功的 rpc 传输成功的文件。
2PC 参与者事务释放锁慢,一些查询会被这些锁阻塞。
修复 DML 和 rename table 并发时可能导致的 crash。
解决主可用区场景下 system rg leader 没有调度到主可用区问题。
放松了分区打散的检查条件。
建表时若使用的 partition policy 中带有 dp,则可能造成不必要的分裂。
创建带有 partition policy 的表时会通过 SQL 查询全量的信息。
快照恢复时,由于并发的问题可能导致节点注册进入常规节点注册流程而不是快照恢复节点注册流程,导致快照恢复卡住。
Leader Apply 日志时在回复完协调者后发生了协程切换,导致 Apply 的时间变长,让后续的2PC 请求发生了重试,造成慢查询。
包含 where . order by limit 查询可能会选择不相关的二级索引进行 full index scan。
当一个事务中 DELETE SQL 删除 record_version 不同的多行同表数据时,生成的 binlog 下游可能会消费失败。
DDL 后台回滚线程等 X 锁时间默认为365天,长时间竞争不到锁,会影响 DML 执行;将等锁时间修改为默认50秒。
save 时间戳失败导致切主耗时比较久,优化了获取时间戳协程退出逻辑,失败后检查 routine ctx,降低切主耗时。
将含有 index 的情况下生成 hashjoin 的场景纳入到计划生成中。
巡检 primary rg 导致发生非预期的迁移任务。
被 Proxy 转发的 SQL 无法 apply statement outline 使用绑定的执行计划。
tdstore_data_validation 跑出的结果汇总中,num_records: 0 num_bytes: 0,checksum: 0。
通过 RPC 从 tdstore 获取的 range 估计行数,只有简单的行数信息。
IsNewDDLAllowedCntl 重试成功后未清理 diagnostics_area 中的 error 信息,导致外部识别到 error 报错。
在主备实例配置错配的情况下,CDC 节点由于数据积压而 OOM。
DDL 和 DML 并发时,获取 absent 索引的统计信息会报错,然后一直 retry 到最大次数。
audit log 中的 error 信息没有转义。
事务中 put 操作因事务大小超阈值而失败时,返回给客户端的错误码不清晰。
普通表被 drop 后,autoinc indexid 还缓存在 g_auto_incr_cache 中,需要清理掉。
返回多列的子查询在提前执行可能崩溃下结果错误,触发条件:(1)并行中的返回单行(非单个值)的非相关子查询,并被提前执行(Pre-evaluated subqueries: select #?)(2) 子查询做为 <=> 运行符的参数,并且子查询结果为空集,会崩溃 (3)子查询做为普通运行符的参数,并且子查询返回的 row 中第1列为空值,会结果错误。
sqlengine.err 默认滚动 size 调整。
控制自增缓存的分桶数量,用于分散锁竞争。
变更参数 idx_recorder_queue_capacity,实际不生效。
统一审计日志时间格式。
修复 tdstore_client_new_console 工具中 get_rw_stats 命令返回格式不正确的问题。
修复因代码执行顺序问题导致误报检测日志的问题。
优化审计日志输出,移除冗余的 audit_record 记录项。
audit log 中加入 sql digest 字段。
并行 Explain 时有可能不会打印子查询的计划。
如果 ORDER BY 引用了 const table 的列,在生成并行计划时可能出现 Crash。
braft 在实现 install snapshot 时,在任务执行前就会更新 snapshot 的 meta 信息。raft leader 可能会提前 purge 掉 raft log,导致 log receiver 额外从 cos 拉取 raft log,导致 binlog 延迟变大。通过调整 log receiver 节点设置 snapshot meta 信息的时机,降低上述 log purge 的概率。
log_00000000000000068382_00000000000000739424 该文件大约是 64M, 但是包含 67 万条日志。 在_rebuild_in_memory_index 时耗时了大约 410ms。
与子查询做连接的时候丢失 condition。
官方对<=>操作符号计算在处理 null 时有正确性问题。
Online Copy 之后,old table 的 TABLE_SHARE 没有从 TDC 中 erase 掉,导致内存泄漏。
当有 const 表的时候,icp 的条件可能指向对应的 const 表。
在 hash join 有 limit 情况下,同样的计划发送了多次。
类似如下查询 MySQL 会使用不允许 Spill 到磁盘的策略做 Hash Join:SELECT * FROM t1, t2 WHERE t1a = t2a LIMIT 1;这时外表会被读多次,由于 Remote Worker 实现上的限制会 crash。
在 optimizer_switch 中加入 cost_based_hashjoin 开关去将 hashjoin 的代价计算纳入到代价模型中,筛选出 hashjoin 的计划。
增加 bnl hint 去让更多 hashjoin 的 hint 功能扩展到更多。
提供接口获取不同 rg 分组的 hybrid 节点。
insert into 自增列表 select from 自增列没有 batch 拿自增。
计算层 RPC Service 缺少校验 cluster id。
DYNAMIC_INDEX_RANGE_SCAN 类型的方式对于外表的每一行,内表都会重新选择索引执行方式,条件下推依赖计划是固定的,在拆分条件的时候依赖于具体的索引信息,如果拆分时的索引和执行时的索引不一样的话会导致 SQL 执行失败。
SQLEngine 发生的不可自愈的系统错误应上报。
batch check 时对 key 做 succsesor 操作可能越界。
当并行选择内表的时候,会导致并行 iterator 重复创建,和 local scan 的功能相冲突,导致性能回退。
基于路由操作性能已做优化,tdstore 提供范围的 checkkey 函数,重新实现 local 逻辑。
备份期间 agent 采集 dp 调度状态指标报错。
truncate part 时会锁全表。
pk_preload 查询引起计算层上报的 LES 丢失。
统计信息在节点间通过 analyze table . reload 的形式进行 broadcast。这个操作可能会 open table,对于分区表则会进行 loop-open 处理每个分区。
binlog 解析出的 stmt_id 存在 -1 的情况,会导致某些情况下 LogService Mysql Client 同步下游数据不一致。
mc 因为重启时启动协程的顺序,导致先把某个 rg 从 pending 取出进行回放(实际上说要等 refresh 成功后再启动 log-service 回放。
BatchPut 的数据量比较大时,会先批量写入数据,然后批量申请锁,批量申请锁的时候没有对内存进行限制,可能会超过设置的事务内存总大小。
参数变更
|
修改 | | 用于设置 SQLEngine 单次获取自增值的数量。自增值生成序列存放在存储节点上, 在某些情况下,为了提高插入性能,系统可以一次为多个插入操作分配连续的自增值,从而减少自增值生成器的开销。通过调整 tdsql_auto_increment_batch_size 参数,可以控制这种批量分配的大小。默认值从1调整为100。 |
新增 | | 设置为 on 或 off,是否将 hashjoin 的代价计算纳入到整体代价模型的计算中。 |
新增 | | 当该参数为 OFF , 表示关闭在线的多副本数据检验。 |
新增 | | 该参数表示每天的某个时间点开始多副本数据一致性校验。 当参数 tdstore_enable_online_data_validation 设置为 true 生效。 |
数据字典变更
|
修改 | | 新增 unconsumed_msg_count 字段,代表整体缓存中的消息数量(仅 MysqlClient 模式)。 |
修改 | | 新增 processlist_id、node_id、node_name 字段,分别代表 MySQL 会话连接 ID、请求锁的 SQLEngine 节点 ID 和 名称;修改 thread_id 字段与原生 MySQL 语义对齐,代表 performance_schema.threads 表的主键 ID。 |
修改 | | 新增 requesting_node_id 、 requesting_node_name 字段,代表请求锁的 SQLEngine 节点 ID 和 名称;修改 requesting_thread_id 、 blocking_thread_id 字段,与原生 MySQL 语义对齐,代表对应 performance_schema.threads 表的主键 ID。 |
修改 | | 新增 thread_id 、 sql_session_id 字段,分别代表 performance_schema.threads 表的主键 ID 和 MySQL 会话连接 ID;修改 node_name 的结果为有效值,代表对应 SQLEngine 的节点名称。 |
修改 | | 修改字段名: rolled_back_trans_id 改为 rollback_trans_id 。 |
新增 | | 在执行死锁检测的节点上查询 TDSTORE_PESSIMISTIC_DEADLOCK_DETAIL_INFO 系统表,可以得到历史所有死锁中,构成死锁环的事务详细等待关系:包括申请锁和阻塞的事务 ID,申请和阻塞的锁范围,造成该等待关系的 SQL 运行在哪个节点上,造成该等待关系的事务正在执行的 SQL 语句。 |
新增 | | DDL 操作具有多阶段、长流程的特点,会分成多个阶段执行并且和 TDStore 有多次 RPC 交互。然而,在调试或者线上执行 DDL 时会有概率出现 DDL 卡死的现象。现在可以通过查询 INFORMATION_SCHEMA.DDL_JOB_STAGE_INFO 视图,展示每个正在执行的 DDL 任务的运行时信息,包括 DDL 若干阶段的耗时情况,RPC 耗时情况等,方便用户、DBA 或者内核开发人员在 DDL 卡住的时候查询该系统视图就能定位(不用特意去查看 DDL 运行日志)到当前 DDL 执行到的位置。 |
新增 | | 存储 logservice 回放解析 raft log 所需的表结构信息,并在 logservice 回放 DDL 的过程中对其中的表结构进行更新。 |
新增 | | 存储每个分区的 tindex_id 到主表 tindex_id 的映射。对于分区表,在解析 Raft log 时可以通过分区的 tindex_id 找到对应主表的 tindex_id ,进而通过查询 sys.logservice_dd_tables 表获得解析 Raft log 所需的表结构。 |
修改 | | 新增 schedule_rule 字段,展示调度任务具体信息。 |
修改 | | 新增以下字段: property :广播同步 rg 和普通 rg 的 property 不同,前者为3,后者为默认值0。
witness quorum 和 witnesses :日志副本相关。
|