TiDB 7.x 源码编译之 TiDB Server 篇,及新特性详解(文末彩蛋)
目录
TL;DR
前情提要
一、TiDB Server 编译
1.1 编译环境
1.2 编译步骤
1.3 启动 TiDB Server
二、TiDB Server v7.x 新特性
🔑 2.1 资源管控能力增强
🥳 2.2 TiDB 相关 SQL 再扩展
1️⃣ TiDB 7.1.0,新增支持 Fix Control 特性
2️⃣ TiDB 7.2.0,支持对 DDL 任务进行暂停和恢复
3️⃣ TiDB 7.3.0,新增支持 8 项 Optimizer Hint
4️⃣ TiDB 7.4.0,新增支持 `TIDB_PARSE_TSO_LOGICAL()` 语法
5️⃣ TiDB 7.4.0,新增支持分区类型管理功能
Ⓜ️ 2.3 MySQL 8.0 兼容性
1️⃣ TiDB 7.2.0,新增支持 `CHECK` 约束
2️⃣ TiDB 7.2.0,支持指定 `utf8mb3` 字符集;TiDB 7.4.0,支持指定 `utf8mb4_0900_ai_ci`/`utf8mb4_0900_bin` 排序规则
3️⃣ TiDB 7.4.0,`version()` 返回信息变更
4️⃣ TiDB 7.4.0,新增支持使用 Hint `SER_VAR()` 修改系统变量
5️⃣ TiDB 7.4.0, 新增会话连接属性表 `session_account_connect_attrs`
6️⃣ TiDB 7.4.0, 新增支持数据类型 `FLOAT4`, `FLOAT8` 和 `MIDDLEINT`
三、总结
感谢
彩蛋
TL;DR
本文将延续本系列文章,介绍如何编译 TiDB Server 源码。以及,阐释 TiDB Server 7.x 的部分新特性。
News !!!
TiDB v7.5.0 LTS 计划于 2023-11-23 正式 Release[1],目前代码虽未冻结,但已经可以看到 Alpha 版本的 Code 了,本文代码将以 v7.5.0-alpha
为基准。
前情提要
本文是该系列文章的第 5 篇,前四篇文章分别是:
- TiDB 7.x 源码编译之 PD/TiDB Dashboard 篇
- TiDB 7.x 源码编译之 TiUP 篇,及新特性解析
- TiDB 7.x 源码编译之 TiFlash 篇
- TiDB 7.x 源码编译之 TiProxy 篇,及尝鲜体验
一、TiDB Server 编译
1.1 编译环境
与前几篇文章有所区别的是,本文使用 CentOS 7.9 和 Rocky Linux 9.2 两个版本的操作系统,分别进行编译测试。由于 TiDB Server 是 go 语言开发,所以在两个系统编译过程几乎没有区别,只需注意在编译之前安装系统开发工具包(yum groupinstall 'Development Tools'
)。现已支持 Rocky Linux 9.1 及以上版本,可以在生产环境放心使用。[2]
查看版本信息:
1 | cat /etc/redhat-release |
输出日志:
- CentOS 7
1 | [shawnyan@centos7 ~]$ cat /etc/redhat-release |
- Rocky Linux 9
1 | [root@rocky9 ~]# cat /etc/redhat-release |
在 TiDB v7.5.0-alpha 的代码中,Go 版本升级到 1.21.1 (released 2023-08-08)[3][4]。本文所使用的 Go 版本为 1.21.3 (released 2023-10-10)[5]。
1 | go install golang.org/dl/go1.21.3@latest |
1 | go version go1.21.3 linux/amd64 |
Ps. 同时,关于 Go 版本,给 QE 团队提了个 Issue:
Update: 2023-10-17
TiDB 源码仓库新建了 release-7.5 分支,并且 Go 版本升级到了 1.21.3。[6]
1.2 编译步骤
克隆下载源码到本地,这里指定 v7.5.0-alpha
分支。
1 | git clone https://github.com/pingcap/tidb.git --depth=1 -b v7.5.0-alpha tidb7 |
编译 TiDB Server 仅需一条命令搞定。
1 | make |
输出日志:
1 | [shawnyan@centos7 tidb7]$ make |
查看二进制文件的版本:
1 | [shawnyan@centos7 bin]$ ./tidb-server -V |
Update: 2023-10-16
TiDB 仓库的代码结构发生了大调整,TiDB Server 核心文件移动到了新目录 pkg
[7],这一变更影响到近 4500 个文件。随之而来的好处是,TiDB 源码根目录更加清晰。
1 | [shawnyan@centos7 tidb7]$ tree . -L 1 |
1.3 启动 TiDB Server
TiDB Server 其实可以不依赖于 TiKV 而单独启动,这里选择单机存储引擎 UniStore 启动 TiDB Server,启动命令如下。
1 | ./tidb-server -store unistore |
启动后,连接 TiDB,并查看版本信息。
1 | tidb> select tidb_version()\G |
需要注意的是,TiDB Server 的参数分为命令行参数(直接启动 Server 时传递的参数)[8],配置文件参数(比命令行参数更丰富)[9],以及系统变量(连接 TiDB 后可修改)[10],所以在查看官方文档的时候,这三类参数的页面都可能用到,概念上的变量和参数非常容易混淆,如果接触 TiDB 时间不长,需要多加区分、辨别。
BTW,关于这部分的内容,欢迎学习、复习 PingCAP 相关课程:
- TiDB 系统管理基础 [TiDB v5.x] (301) ,第十课: TiDB 的配置
到此,我们可以看到 TiDB Server 已经编译成功,并成功启动运行,TiDB Server 的版本为 v7.5.0-alpha
。
二、TiDB Server v7.x 新特性
依据现行 TiDB 发版规则,TiDB 7.5.0 LTS 版本将包含 7.2.0-DMR (Released: 2023-06-29),7.3.0-DMR (Released: 2023-08-14) 和 7.4.0-DMR (Released: 2023-10-12) 中已发布的新特性。 下面的篇幅将介绍若干 TiDB 7.x 的新特性。
🔑 2.1 资源管控能力增强
在 TiDB 7.1.0 LTS 中,资源管控特性正式发布,这部分的详细内容请参考文章:
《 TiDB 7.1.0 LTS 特性解读丨关于资源管控 (Resource Control) 应该知道的 6 件事 》
在 TiDB 7.4.0 DMR 中,资源管控能力得到增强,引入了对后台任务的管理。主要实现在 TiKV 层。
当一种任务被标记为后台任务时,TiKV 会动态地限制该任务的资源使用,以尽量避免此类任务在执行时对其他前台任务的性能产生影响。TiKV 通过实时地监测所有前台任务所消耗的 CPU 和 IO 等资源,并根据实例总的资源上限计算出后台任务可使用的资源阈值,所有后台任务在执行时会受此阈值的限制。
同时,在 v7.4.0 中,TiFlash 支持资源管控特性,完善了 TiDB 整体的资源管控能力。#7660
🥳 2.2 TiDB 相关 SQL 再扩展
之前的文章 《 TiDB 7.1.0 LTS 特性解读 | 资源管控 (Resource Control) 应该知道的 6 件事 》 中,增加了“资源管控”相关 SQL,这里再次进行扩展,也是本文的第一个彩蛋。
1️⃣ TiDB 7.1.0,新增支持 Fix Control 特性
从 TiDB v7.1.0 开始,支持 Optimizer Fix Controls 特性,并引入 tidb_opt_fix_control
系统变量,以更细粒度控制优化器行为。
现在,该变量支持全局、会话、Hint,三种方式进行控制,正式发布支持的控制项有 6 个,另有 1 个已合入 Master,预计会随下个版本发布,具体列表如下。
- 44262 – New in v7.2.0/v7.1.1
- 控制是否允许使用动态模式访问没有全局统计信息的分区表。
- 44389 – New in v7.2.0/v7.1.1
- 控制在构建范围时是否考虑某些 CNF 项的非点范围(non-point ranges)。
- 44823 – New in v7.3.0/v7.1.1
- 控制可以在计划缓存中缓存的查询参数的最大数量。
- 44830 – New in v7.3.0
- 控制是否允许缓存某些复杂场景中的 Batch/PointGet。
- 44855 – New in v7.3.0/v7.1.1
- 控制在估计索引连接内侧下索引范围扫描的行数时是否使用更准确的上限。
- 45132 – New in v7.4.0
- 控制是否使用访问范围行计数来确定 Skyline 修剪上的访问路径。
- 45798 – New in v7.5.0 ??? TBD
- 控制是否缓存访问生成列的计划。
基础用法示例如下:
1 | SET @@tidb_opt_fix_control=default; |
2️⃣ TiDB 7.2.0,支持对 DDL 任务进行暂停和恢复
TiDB 7.2 引入了新的实验特性,DDL 任务支持暂停(PAUSE)[11]和恢复(RESUME)操作,比如,对正在创建索引的任务进行暂停和恢复。相关命令如下:
1 | ADMIN PAUSE DDL JOBS job_id [, job_id] |
3️⃣ TiDB 7.3.0,新增支持 8 项 Optimizer Hint
从 TiDB 7.3.0 开始,新增支持 8 (4+1+3) 项表级别 Optimizer Hint,这一特性也在 TiDB v7.1.1 中引入。
“4+1+3” 的意思是,增加 4 个名为 NO_xxx_JOIN
的 TiDB Hint,兼容(MySQL)一个名为 NO_HASH_JOIN
[12] 的 Hint,以及,增加 3 个名为 INDEX_xxx_JOIN
的 TiDB Hint,具体名称如下。
1 | NO_INDEX_JOIN |
此外,在使用 Hint 时,如果 INDEX_xxx_JOIN
与 NO_INDEX_xxx_JOIN
发生冲突,NO_INDEX_xxx_JOIN
可能会被忽略。
另外一个知识点,在 TiDB 中,TIDB_INLJ
是 INL_JOIN
的别名。
在 3.0.x 及之前版本仅支持使用该别名;之后的版本同时支持使用这两种名称,但推荐使用
INL_JOIN
。[13]
1 | // TiDB hint aliases |
在使用方法上,还可以结合 SEV_VAR
Hint 使用,本文下面有章节会再介绍。
示例:
1 | explain format = 'hint' |
输出:
1 | mysql> explain format = 'hint' SELECT /*+ NO_INDEX_JOIN(t1),NO_INDEX_HASH_JOIN(t1),NO_INDEX_MERGE_JOIN(t1),NO_MERGE_JOIN(t1) ,NO_HASH_JOIN(t1),INDEX_JOIN(t1),INDEX_HASH_JOIN(t1),INDEX_MERGE_JOIN(t1) */ * FROM t1\G |
相关 PR 参见:parser: support more join hints on parser #45525
具体相关文档参见:Optimizer Hints
Ps. 文档有部分描述缺失,已提 Issue,期待更新。
4️⃣ TiDB 7.4.0,新增支持 TIDB_PARSE_TSO_LOGICAL()
语法
对于 TSO,如果想查看逻辑计数器,之前的版本需要通过 pd 命令进行解析,从 7.4 开始支持直接从 TiDB 进行查询。
TSO 指 Time Stamp Oracle,是 PD (Placement Driver) 为每个事务提供的单调递增的时间戳。TSO 是一串数字,包含以下两部分:一个物理时间戳; 一个逻辑计数器[14]
示例:获取物理时间戳和逻辑计数器的值。
1 | tidb> select @@tidb_current_ts; |
与 pd 命令解析的结果一致。
1 | tidb> \! tiup ctl:v7.4.0 pd tso 444995429049565185 |
5️⃣ TiDB 7.4.0,新增支持分区类型管理功能
TiDB 7.4 的分区表管理功能更加完备,期待已久的普通表转分区表功能终于上线。[15]
1 | -- 将非分区表转为分区表、修改分区表的分区类型 |
举个栗子,将既存表按年龄划定分区,分区类型使用 RANGE
,然后将分区类型变更为 LIST
,最后移除分区。
1 | tidb> show create table t_age\G |
!!! Tips 提示:
在分区表定义更新后,建议手动更新统计信息(有些环境可能已经关闭自动更新[16])。
Ⓜ️ 2.3 MySQL 8.0 兼容性
在 PingCAP 公众号最近发布的通告中,TiDB 7.4 发版:正式兼容 MySQL 8.0 ,详细地介绍了 TiDB 7.4 DMR 在 MySQL 8.0 兼容性方面取得的最新进展。
通告中已经列举了若干新特性,本文将做进一步补充。同时,在 TiDB 7.4 DMR 的发版说明中有些小改动并未列出,下面也将进行列举说明,以供参考。
1️⃣ TiDB 7.2.0,新增支持 CHECK
约束
从 MySQL 8.0.16 开始,MySQL 实现了 CHECK 约束核心特性,并增加了新的信息表 INFORMATION_SCHEMA.CHECK_CONSTRAINTS
用来展示 CHECK 约束定义。[17]
从 TiDB 7.2.0 开始,TiDB 新增支持 CHECK
约束,并在 7.4 中增加表 I_S.CHECK_CONSTRAINTS
。需要注意的是,该功能默认关闭,需要通过变量 tidb_enable_check_constraint
进行控制。相关 SQL 控制命令如下:
1 | -- 启用 CHECK 约束功能 |
Ps. 在测试该特性时遇到了两个问题,分别提了 Issue,期待在 TiDB 7.5.0 LTS 代码冻结之前修复。
- [Merged] CHECK CONSTRAINT loss when ENFORCED again #47567
- [Open] Support TABLE_NAME in CHECK_CONSTRAINTS #47565
- [Closed] doc: I_S.CHECK_CONSTRAINTS #15376
2️⃣ TiDB 7.2.0,支持指定 utf8mb3
字符集;TiDB 7.4.0,支持指定 utf8mb4_0900_ai_ci
/utf8mb4_0900_bin
排序规则
在之前的文章中,TiDB 6.x 新特性解读 | Collation 规则 ,介绍过 TiDB 的字符集和排序规则,经过若干版本的迭代,TiDB 在全面兼容 MySQL 8.0 的征途上又更进一步。
从 TiDB 7.2.0 开始,支持 utf8mb3 字符集,其作为 utf8 的别名。示例如下:
1 | tidb> create table t_utf8 (a int) charset=utf8; |
从 TiDB 7.4.0 开始,支持指定 utf8mb4_0900_ai_ci/utf8mb4_0900_bin 排序规则,在 7.4.0 的发版说明中有这样一段描述[18]:
TiDB v7.4.0 增强了从 MySQL 8.0 迁移数据的支持。新增两个排序规则 (Collation)
utf8mb4_0900_ai_ci
和utf8mb4_0900_bin
。其中utf8mb4_0900_ai_ci
为 MySQL 8.0 的默认排序规则。
同时新增支持 MySQL 8.0 兼容的系统变量default_collation_for_utf8mb4
,允许用户为 utf8mb4 字符集指定默认的排序方式,以兼容从 MySQL 5.7 或之前版本迁移或数据复制的场景。
这里需要注意的是,在 TiDB 中,utf8mb4 字符集的默认排序规则仍然是 utf8mb4_bin
。
1 | tidb> select @@default_collation_for_utf8mb4; |
做个对照实验,更加直观地展示区别:
3️⃣ TiDB 7.4.0,version()
返回信息变更
自 v7.4.0 起,TiDB 已经兼容 MySQL 8.0 的核心功能,
version()
将返回以8.0.11
为前缀的版本信息。[19][20]
补充:MySQL 8.0.11 是 MySQL 8.0 系列的第一个 GA 版本。
示例:
1 | tidb> select version(); |
当然,如果为了合理规划漏扫,也可以自定义将 8.0.11
改为更新的版本,比如 8.0.35
,修改方法参照 官方文档 。
关于 TiDB 兼容 MySQL 8.0 的更多讨论,欢迎访问 AskTUG 论坛:
【唠嗑茶话会 88】关于 TiDB 兼容 MySQL 8.0 ,你最想支持的特性/功能是什么?
4️⃣ TiDB 7.4.0,新增支持使用 Hint SER_VAR()
修改系统变量
TiDB v7.4.0 新增支持与 MySQL 8.0 相似的优化器提示
SET_VAR()
。通过在 SQL 语句中添加 HintSET_VAR()
,可以在语句运行过程中临时修改部分系统变量,以针对不同语句设置环境。[21]
举个栗子,在之前的版本中,如果想控制当前 Session 只从 TiFlash 读取数据,需要用到下面的语句:
1 | set session tidb_isolation_read_engines = "tiflash"; |
或者:
1 | select /*+ read_from_storage(tiflash[t]) */ count(*) from t; |
而从 TiDB 7.4.0 开始,可以使用 SET_VAR()
语法进行控制,更加灵活、便利:
1 | select /*+ set_var(tidb_isolation_read_engines=tiflash) */ count(*) from t; |
从 TiDB 7.4 开始,官方文档的系统变量部分增加一个说明项“是否受 Hint SET_VAR
控制”[22],当前版本中,受该 Hint SET_VAR
控制的系统变量共有 91 个:
cte_max_recursion_depth
max_execution_time
mpp_exchange_compression_mode
mpp_version
sql_mode
tidb_allow_batch_cop
tidb_allow_fallback_to_tikv
tidb_allow_mpp
tidb_broadcast_join_threshold_count
tidb_broadcast_join_threshold_size
tidb_cost_model_version
tidb_default_string_match_selectivity
tidb_distsql_scan_concurrency
tidb_enable_cascades_planner
tidb_enable_extended_stats
tidb_enable_index_merge
tidb_enable_index_merge_join
tidb_enable_inl_join_inner_multi_pattern
tidb_enable_new_only_full_group_by_check
tidb_enable_non_prepared_plan_cache
tidb_enable_null_aware_anti_join
tidb_enable_ordered_result_mode
tidb_enable_outer_join_reorder
tidb_enable_paging
tidb_enable_prepared_plan_cache
tidb_enable_pseudo_for_outdated_stats
tidb_enable_vectorized_expression
tidb_enforce_mpp
tidb_executor_concurrency
tidb_index_join_batch_size
tidb_index_join_double_read_penalty_cost_rate
tidb_index_lookup_size
tidb_index_merge_intersection_concurrency
tidb_index_serial_scan_concurrency
tidb_isolation_read_engines
tidb_max_bytes_before_tiflash_external_group_by
tidb_max_bytes_before_tiflash_external_join
tidb_max_bytes_before_tiflash_external_sort
tidb_max_paging_size
tidb_merge_join_concurrency
tidb_min_paging_size
tidb_opt_advanced_join_hint
tidb_opt_agg_push_down
tidb_opt_broadcast_cartesian_join
tidb_opt_concurrency_factor
tidb_opt_copcpu_factor
tidb_opt_correlation_exp_factor
tidb_opt_correlation_threshold
tidb_opt_cpu_factor
tidb_opt_derive_topn
tidb_opt_desc_factor
tidb_opt_disk_factor
tidb_opt_distinct_agg_push_down
tidb_opt_enable_correlation_adjustment
tidb_opt_enable_late_materialization
tidb_opt_enable_mpp_shared_cte_execution
tidb_opt_fix_control
tidb_opt_force_inline_cte
tidb_optimizer_selectivity_level
tidb_opt_insubq_to_join_and_agg
tidb_opt_join_reorder_threshold
tidb_opt_limit_push_down_threshold
tidb_opt_memory_factor
tidb_opt_mpp_outer_join_fixed_build_side
tidb_opt_network_factor
tidb_opt_objective
tidb_opt_ordering_index_selectivity_threshold
tidb_opt_prefer_range_scan
tidb_opt_prefix_index_single_scan
tidb_opt_projection_push_down
tidb_opt_range_max_size
tidb_opt_scan_factor
tidb_opt_seek_factor
tidb_opt_skew_distinct_agg
tidb_opt_three_stage_distinct_agg
tidb_opt_tiflash_concurrency_factor
tidb_opt_write_row_id
tidb_partition_prune_mode
tidb_plan_cache_max_plan_size
tidb_prefer_broadcast_join_by_exchange_data_size
tidb_read_consistency
tidb_read_staleness
tidb_replica_read
tidb_runtime_filter_mode
tidb_runtime_filter_type
tidb_session_alias
tidb_stats_load_sync_wait
tidb_store_batch_size
tiflash_fastscan
tiflash_find_grained_shuffle_stream_count
tiflash_fine_grained_shuffle_batch_size
Ps. 在研究这一特性时,发现了一个源码和若干中英文文档问题中的小问题,这是第一次给 pingcap/tidb
和 pingcap/docs
提 PR,特此“马克”一下。
- [Merged] sessionctx: fix var typo #47609
- [Merged] system-variables: update docs for hint SET_VAR #15059
- [Merged] system-variables: update docs for hint SET_VAR #15207
5️⃣ TiDB 7.4.0, 新增会话连接属性表 session_account_connect_attrs
在 MySQL 早期版本中,支持从 P_S.session_account_connect_attrs
查看会话的连接属性。[23]
在 TiDB 7.4 中,也已经实现。举例如下:
1 | tidb> select * from performance_schema.session_account_connect_attrs; |
如果通过第三方工具连接,比如 HeidiSQL,则显示为:
1 | tidb> select * from performance_schema.session_account_connect_attrs where PROCESSLIST_ID = '2097170'; |
6️⃣ TiDB 7.4.0, 新增支持数据类型 FLOAT4
, FLOAT8
和 MIDDLEINT
从 TiDB 7.4 开始,新增数据类型 FLOAT4
, FLOAT8
和 MIDDLEINT
,以增强 MySQL 兼容性。其中 FLOAT4
实现为 FLOAT
的别名,FLOAT8
实现为 DOUBLE
的别名,MIDDLEINT
实现为 MEDIUMINT
的别名。
示例:
1 | create table t_type (c1 float4, c2 float8, c3 middleint, c4 int3); |
1 | tidb> show create table t_type\G |
到此,MySQL 8.1 官方文档[24]中罗列的 16 个来自其他数据库的数据类型,TiDB 7.4 已全部支持。
Ps. 最新版的文档中有一处兼容性描述未更新,已反馈,待更新。
三、总结
到 11 月 15 日,2023 年已过去 87%,TiDB 7.x 系列即将迎来 7.5 LTS 版本。TiDB 在 MySQL 5.7 EOL 之际正式兼容 MySQL 8.0,为用户从 MySQL 5.7 迁移到 TiDB 减轻了工作量,并提供了更多助力。
最后,推荐一篇文章:
- 中文版:是时候了!MySQL 5.7 的下一站,不如试试 TiDB?
- 英文版:MySQL 5.7 EOL: Migrating to a MySQL Alternative
- 日文版:MySQL 5.7サポート終了:MySQL代替データベースへの移行
2023-11-02, update.
Per Oracle’s Lifetime Support policy, as of October 25, 2023, MySQL 5.7 is covered under Oracle Sustaining Support.[25]
感谢
在 TiDB 7.4.0 DMR 的发版说明[26]中发现了自己的名字,感谢 TiDB 社区。
欢迎更多伙伴加入 TiDB 社区 。
彩蛋
TiDB Release Timeline 2023 版
数据来源:
End.
ShawnYan
2023-10-17
https://docs.pingcap.com/zh/tidb/dev/hardware-and-software-requirements ↩︎
https://groups.google.com/g/golang-announce/c/iNNxDTCjZvo ↩︎
https://docs.pingcap.com/zh/tidb/stable/command-line-flags-for-tidb-configuration ↩︎
https://docs.pingcap.com/zh/tidb/stable/tidb-configuration-file ↩︎
https://docs.pingcap.com/zh/tidb/dev/sql-statement-admin-pause-ddl ↩︎
https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html#optimizer-hints-table-level ↩︎
https://docs.pingcap.com/zh/tidb/dev/optimizer-hints#inl_joint1_name--tl_name- ↩︎
https://docs.pingcap.com/zh/tidb/stable/tidb-functions#tidb_parse_tso ↩︎
https://docs.pingcap.com/zh/tidb/v7.4/partitioned-table#对现有表进行分区 ↩︎
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-16.html ↩︎
https://docs.pingcap.com/zh/tidb/v7.4/release-7.4.0#数据库管理 ↩︎
https://dev.mysql.com/doc/refman/8.0/en/performance-schema-connection-attribute-tables.html ↩︎
https://dev.mysql.com/doc/refman/8.1/en/other-vendor-data-types.html ↩︎
- Title: TiDB 7.x 源码编译之 TiDB Server 篇,及新特性详解(文末彩蛋)
- Author: ShawnYan
- Created at: 2023-10-17 12:00:00
- Updated at: 2023-11-15 01:00:00
- Link: https://shawnyan.cn/2023/tidb/tidb-7.x-compile-tidb/
- License: This work is licensed under CC BY-NC-SA 4.0.