本文将介绍如何编译 TiDB Server 源码。以及阐释 TiDB Server 7.x 的部分新特性。
cat /etc/redhat-release
uname -a
输出日志:
[shawnyan@centos7 ~]$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[shawnyan@centos7 ~]$ uname -a
Linux centos7.shawnyan.cn 3.10.0-1160.92.1.el7.x86_64 #1 SMP Tue Jun 20 11:48:01 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
[root@rocky9 ~]# cat /etc/redhat-release
Rocky Linux release 9.2 (Blue Onyx)
[root@rocky9 ~]# uname -a
Linux rocky9.shawnyan.cn 5.14.0-284.11.1.el9_2.x86_64 #1 SMP PREEMPT_DYNAMIC Tue May 9 17:09:15 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
go install golang.org/dl/go1.21.3@latest
go1.21.3 download
go1.21.3 version
go version go1.21.3 linux/amd64
1.2 编译步骤
$ git clone https://github.com/pingcap/tidb.git --depth=1 -b v7.5.0-alpha tidb7
$ cd tidb7
$ git lg
* 8cfe7f3 - (grafted, HEAD -> v7.5.0-alpha, tag: v7.5.0-alpha) executor, tests: move some test cases from `admin_test.go` and `foreign_key_test.go` to `integrationtest` (#47333) (12 days ago) <SeaRise>
make
[shawnyan@centos7 tidb7]$ make
CGO_ENABLED=1 GO111MODULE=on go build -tags codes -ldflags '-X "github.com/pingcap/tidb/parser/mysql.TiDBReleaseVersion=v7.5.0-alpha" -X "github.com/pingcap/tidb/util/versioninfo.TiDBBuildTS=2023-10-11 06:08:32" -X "github.com/pingcap/tidb/util/versioninfo.TiDBGitHash=8cfe7f329b56899a96422596da2b67d4e2bd1e94" -X "github.com/pingcap/tidb/util/versioninfo.TiDBGitBranch=HEAD" -X "github.com/pingcap/tidb/util/versioninfo.TiDBEdition=Community" ' -o bin/tidb-server ./tidb-server
Build TiDB Server successfully!
[shawnyan@centos7 bin]$ ./tidb-server -V
Release Version: v7.5.0-alpha
Edition: Community
Git Commit Hash: 8cfe7f329b56899a96422596da2b67d4e2bd1e94
Git Branch: HEAD
UTC Build Time: 2023-10-11 06:08:32
GoVersion: go1.21.3
Race Enabled: false
Check Table Before Drop: false
Store: unistore
(Update: 2023-10-16)
TiDB 仓库的代码结构发生了大调整,TiDB Server 核心文件移动到了新目录 pkg (https://github.com/pingcap/tidb/pull/47123 ),这一变更影响到近 4500 个文件。随之而来的好处是,TiDB 源码根目录更加清晰。
[shawnyan@centos7 tidb7]$ tree . -L 1
.
├── br --> BR
├── build
...
├── cmd
...
├── docs
├── dumpling --> Dumpling
...
├── pkg --> TiDB core
...
├── tests
├── tools
...
10 directories, 24 files
./tidb-server -store unistore
启动后,连接 TiDB,并查看版本信息。
tidb> select tidb_version()G
*************************** 1. row ***************************
tidb_version(): Release Version: v7.5.0-alpha
Edition: Community
Git Commit Hash: 8cfe7f329b56899a96422596da2b67d4e2bd1e94
Git Branch: HEAD
UTC Build Time: 2023-10-11 06:08:32
GoVersion: go1.21.3
Race Enabled: false
Check Table Before Drop: false
Store: unistore
1 row in set (0.00 sec)
依据现行 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 的新特性。
在 TiDB 7.4.0 DMR 中,资源管控能力得到增强,引入了对后台任务的管理。主要实现在 TiKV 层。
当一种任务被标记为后台任务时,TiKV 会动态地限制该任务的资源使用,以尽量避免此类任务在执行时对其他前台任务的性能产生影响。TiKV 通过实时地监测所有前台任务所消耗的 CPU 和 IO 等资源,并根据实例总的资源上限计算出后台任务可使用的资源阈值,所有后台任务在执行时会受此阈值的限制。
同时,在 v7.4.0 中,TiFlash 支持资源管控特性,完善了 TiDB 整体的资源管控能力。
① 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
-
控制是否缓存访问生成列的计划。
基础用法示例如下:
SET @@tidb_opt_fix_control=default;
select @@tidb_opt_fix_control;
SET SESSION tidb_opt_fix_control = '44262:ON,44389:ON,44823:500,44830:ON,44855:ON,45132:0,45798:ON';
SET GLOBAL tidb_opt_fix_control = '';
select /*+ set_var(tidb_opt_fix_control="1:ok") */ @@tidb_opt_fix_control;
② TiDB 7.2.0,对 DDL 任务进行暂停和恢复
ADMIN PAUSE DDL JOBS job_id [, job_id]
ADMIN RESUME DDL JOBS job_id [, job_id]
③ 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 的 Hint,以及,增加 3 个名为 INDEX_xxx_JOIN 的 TiDB Hint,具体名称如下。
NO_INDEX_JOIN
NO_INDEX_HASH_JOIN
NO_INDEX_MERGE_JOIN
NO_MERGE_JOIN
NO_HASH_JOIN
INDEX_JOIN
INDEX_HASH_JOIN
INDEX_MERGE_JOIN
此外,在使用 Hint 时,如果 INDEX_xxx_JOIN 与 NO_INDEX_xxx_JOIN 发生冲突,NO_INDEX_xxx_JOIN 可能会被忽略。
另外一个知识点,在 TiDB 中,TIDB_INLJ 是 INL_JOIN 的别名。
在 3.0.x 及之前版本仅支持使用该别名;之后的版本同时支持使用这两种名称,但推荐使用 INL_JOIN。
// TiDB hint aliases
"TIDB_HJ": hintHashJoin, -> HASH_JOIN
"TIDB_INLJ": hintInlJoin, -> INL_JOIN
"TIDB_SMJ": hintSMJoin, -> MERGE_JOIN
在使用方法上,还可以结合 SEV_VAR Hint 使用,本文下面有章节会再介绍。
示例:
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 t1G
输出:
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 t1G
*************************** 1. row ***************************
hint: use_index(@`sel_1` `test`.`t1` `idx_t1`), no_order_index(@`sel_1` `test`.`t1` `idx_t1`), no_index_join(), no_index_hash_join(), no_index_merge_join(), no_merge_join(), no_hash_join(), index_join(), index_hash_join(), index_merge_join()
1 row in set (0.00 sec)
相关 PR 参见:parser: support more join hints on parser #45525(https://github.com/pingcap/tidb/pull/45525)
具体相关文档参见:Optimizer Hints(https://docs.pingcap.com/zh/tidb/dev/optimizer-hints)
④ TiDB 7.4.0,新增支持 TIDB_PARSE_TSO_LOGICAL() 语法
对于 TSO,如果想查看逻辑计数器,之前的版本需要通过 pd 命令进行解析,从 7.4 开始支持直接从 TiDB 进行查询。
TSO 指 Time Stamp Oracle,是 PD (Placement Driver) 为每个事务提供的单调递增的时间戳。TSO 是一串数字,包含以下两部分:一个物理时间戳;一个逻辑计数器 (https://docs.pingcap.com/zh/tidb/stable/tidb-functions#tidb_parse_tso )
tidb> select @@tidb_current_ts;
+--------------------+
| @@tidb_current_ts |
+--------------------+
| 444995429049565185 |
+--------------------+
1 row in set (0.00 sec)
tidb> SELECT TIDB_PARSE_TSO(@@tidb_current_ts);
+-----------------------------------+
| TIDB_PARSE_TSO(@@tidb_current_ts) |
+-----------------------------------+
| 2023-10-17 15:07:26.411000 |
+-----------------------------------+
1 row in set (0.00 sec)
tidb> SELECT TIDB_PARSE_TSO_LOGICAL(@@tidb_current_ts);
+-------------------------------------------+
| TIDB_PARSE_TSO_LOGICAL(@@tidb_current_ts) |
+-------------------------------------------+
| 1 |
+-------------------------------------------+
1 row in set (0.00 sec)
与 pd 命令解析的结果一致。
tidb> ! tiup ctl:v7.4.0 pd tso 444995429049565185
The component `ctl` version v7.4.0 is not installed; downloading from repository.
Starting component `ctl`: /home/shawnyan/.tiup/components/ctl/v7.4.0/ctl pd tso 444995429049565185
system: 2023-10-17 15:07:26.411 +0800 CST
logic: 1
tidb>
-- 将非分区表转为分区表、修改分区表的分区类型
ALTER TABLE <table_name> PARTITION BY <new partition type and definitions>
-- 将分区表转为非分区表
ALTER TABLE <table_name> REMOVE PARTITIONING
tidb> show create table t_ageG
*************************** 1. row ***************************
Table: t_age
Create Table: CREATE TABLE `t_age` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.00 sec)
-- 转为分区表
tidb> ALTER TABLE t_age PARTITION BY RANGE (a)
-> ( PARTITION p0 VALUES LESS THAN (18)
-> , PARTITION p1 VALUES LESS THAN (35)
-> , PARTITION p2 VALUES LESS THAN (MAXVALUE));
Query OK, 0 rows affected, 1 warning (0.11 sec)
tidb> show create table t_ageG
*************************** 1. row ***************************
Table: t_age
Create Table: CREATE TABLE `t_age` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
PARTITION BY RANGE (`a`)
(PARTITION `p0` VALUES LESS THAN (18),
PARTITION `p1` VALUES LESS THAN (35),
PARTITION `p2` VALUES LESS THAN (MAXVALUE))
1 row in set (0.00 sec)
-- 分区定义从 RANGE 变更为 LIST
tidb> ALTER TABLE t_age PARTITION BY LIST (a)
-> ( PARTITION p0 VALUES IN (18)
-> , PARTITION p1 VALUES IN (35)
-> , PARTITION p2 VALUES IN (65));
Query OK, 0 rows affected, 1 warning (0.12 sec)
tidb> show create table t_ageG
*************************** 1. row ***************************
Table: t_age
Create Table: CREATE TABLE `t_age` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
PARTITION BY LIST (`a`)
(PARTITION `p0` VALUES IN (18),
PARTITION `p1` VALUES IN (35),
PARTITION `p2` VALUES IN (65))
1 row in set (0.00 sec)
-- 移除分区
tidb> alter table t_age remove partitioning;
Query OK, 0 rows affected (0.10 sec)
tidb> show create table t_ageG
*************************** 1. row ***************************
Table: t_age
Create Table: CREATE TABLE `t_age` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.00 sec)
-- 启用 CHECK 约束功能
SET GLOBAL tidb_enable_check_constraint=ON;
-- 添加约束
ALTER TABLE t ADD CONSTRAINT CHECK (1 < a);
ALTER TABLE t ADD CONSTRAINT CHECK (1 < a) NOT ENFORCED;
-- 删除约束
ALTER TABLE t DROP CONSTRAINT t_chk_1;
-- 启用约束
ALTER TABLE t ALTER CONSTRAINT t_chk_1 ENFORCED;
-- 禁用约束
ALTER TABLE t ALTER CONSTRAINT t_chk_1 NOT ENFORCED;
② TiDB 7.2.0,支持指定 utf8mb3 字符集;TiDB 7.4.0,支持指定 utf8mb4_0900_ai_ci / utf8mb4_0900_bin 排序规则
tidb> create table t_utf8 (a int) charset=utf8;
Query OK, 0 rows affected (0.02 sec)
tidb> create table t_utf8mb3 (a int) charset=utf8mb3;
Query OK, 0 rows affected (0.04 sec)
tidb> show create table t_utf8G
*************************** 1. row ***************************
Table: t_utf8
Create Table: CREATE TABLE `t_utf8` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)
tidb> show create table t_utf8mb3G
*************************** 1. row ***************************
Table: t_utf8mb3
Create Table: CREATE TABLE `t_utf8mb3` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)
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> select @@default_collation_for_utf8mb4;
+---------------------------------+
| @@default_collation_for_utf8mb4 |
+---------------------------------+
| utf8mb4_bin |
+---------------------------------+
1 row in set (0.00 sec)
③ TiDB 7.4.0, version() 返回信息变更
自 v7.4.0 起,TiDB 已经兼容 MySQL 8.0 的核心功能, version() 将返回以 8.0.11 为前缀的版本信息。
tidb> select version();
+--------------------------+
| version() |
+--------------------------+
| 8.0.11-TiDB-v7.5.0-alpha |
+--------------------------+
1 row in set (0.00 sec)
TiDB v7.4.0 新增支持与 MySQL 8.0 相似的优化器提示 SET_VAR() 。通过在 SQL 语句中添加 Hint SET_VAR() ,可以在语句运行过程中临时修改部分系统变量,以针对不同语句设置环境。
举个栗子,在之前的版本中,如果想控制当前 Session 只从 TiFlash 读取数据,需要用到下面的语句:
set session tidb_isolation_read_engines = "tiflash";
select count(*) from t;
或者:
select /*+ read_from_storage(tiflash[t]) */ count(*) from t;
select /*+ set_var(tidb_isolation_read_engines=tiflash) */ count(*) from t;
⑤ TiDB 7.4.0, 新增会话连接属性表 session_account_connect_attrs
tidb> select * from performance_schema.session_account_connect_attrs;
+----------------+-----------------+-------------+------------------+
| PROCESSLIST_ID | ATTR_NAME | ATTR_VALUE | ORDINAL_POSITION |
+----------------+-----------------+-------------+------------------+
| 2097154 | _client_name | libmysql | 0 |
| 2097154 | _client_version | 8.0.33 | 1 |
| 2097154 | _os | Linux | 2 |
| 2097154 | _pid | 103036 | 3 |
| 2097154 | _platform | x86_64 | 4 |
| 2097154 | os_user | shawnyan | 5 |
| 2097154 | program_name | mysql | 6 |
+----------------+-----------------+-------------+------------------+
7 rows in set (0.00 sec)
tidb> select * from performance_schema.session_account_connect_attrs where PROCESSLIST_ID = '2097170';
+----------------+-----------------+------------+------------------+
| PROCESSLIST_ID | ATTR_NAME | ATTR_VALUE | ORDINAL_POSITION |
+----------------+-----------------+------------+------------------+
| 2097170 | _client_name | libmariadb | 0 |
| 2097170 | _client_version | 3.2.5 | 1 |
| 2097170 | _os | Windows | 2 |
| 2097170 | _pid | 3828 | 3 |
| 2097170 | _platform | AMD64 | 4 |
| 2097170 | _server_host | 127.0.0.1 | 5 |
| 2097170 | _thread | 18236 | 6 |
| 2097170 | program_name | HeidiSQL | 7 |
+----------------+-----------------+------------+------------------+
8 rows in set (0.00 sec)
create table t_type (c1 float4, c2 float8, c3 middleint, c4 int3);)
tidb> show create table t_typeG
*************************** 1. row ***************************
Table: t_type
Create Table: CREATE TABLE `t_type` (
`c1` float DEFAULT NULL,
`c2` double DEFAULT NULL,
`c3` mediumint(9) DEFAULT NULL,
`c4` mediumint(9) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.00 sec)
感谢
💡 点击文末【阅读原文】,访问 TiDB Community 查看原版文章!
发表评论