TiDB 7.x 源码编译之 TiDB Server 篇,及新特性详解
本文将介绍如何编译 TiDB Server 源码。以及阐释 TiDB Server 7.x 的部分新特性。
TiDB v7.5.0 LTS 计划于 2023 年 11 月正式 Release,目前代码虽未冻结,但已经可以看到 Alpha 版本的 Code 了,本文代码将以 v7.5.0-alpha 为基准。
TiDB Server 编译
1.1 编译环境
与前几篇文章有所区别的是,本文使用 CentOS 7.9 和 Rocky Linux 9.2 两个版本的操作系统,分别进行编译测试。由于 TiDB Server 是 go 语言开发,所以在两个系统编译过程几乎没有区别,只需注意在编译之前安装系统开发工具包( yum groupinstall 'Development Tools' )。现已支持 Rocky Linux 9.1 系统,可以在生产环境放心使用。
查看版本信息:
cat /etc/redhat-release
uname -a
输出日志:
● CentOS 7
[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
● Rocky Linux 9
[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
在 TiDB v7.5.0-alpha 的代码中,Go 版本升级到 1.21.1 (released 2023-08-08) 。本文所使用的 Go 版本为 1.21.3 (released 2023-10-10) 。
go install golang.org/dl/go1.21.3@latest
go1.21.3 download
go1.21.3 version
go version go1.21.3 linux/amd64
Ps. 同时,关于 Go 版本,给 QE 团队提了个 Issue:[Closed] update go v1.21.3 #2507 ( https://github.com/PingCAP-QE/ci/issues/2507 )
TiDB 源码仓库新建了 release-7.5 ( https://github.com/pingcap/tidb/tree/release-7.5 )分支,并且 Go 版本升级到了 1.21.3。( https://github.com/pingcap/tidb/pull/47440 ) (Update: 2023-10-17)
1.2 编译步骤
克隆下载源码到本地,这里指定 v7.5.0-alpha 分支。
$ 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>
编译 TiDB Server 仅需一条命令搞定。
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
1.3 启动 TiDB Server
TiDB Server 其实可以不依赖于 TiKV 而单独启动,这里选择单机存储引擎 UniStore 启动 TiDB Server,启动命令如下。
./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 Server 的参数分为命令行参数(直接启动 Server 时传递的参数,配置文件参数(比命令行参数更丰富),以及系统变量(连接 TiDB 后可修改),所以在查看官方文档的时候,这三类参数的页面都可能用到,概念上的变量和参数非常容易混淆,如果接触 TiDB 时间不长,需要多加区分、辨别。
● BTW,关于这部分的内容,欢迎学习、复习 PingCAP 相关课程:
TiDB 系统管理基础 [TiDB v5.x] (301) ( https://learn.pingcap.com/learner/course/30002 ),第十课: 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 整体的资源管控能力。
2.2 TiDB 相关 SQL 再扩展
之前的文章 《 TiDB 7.1.0 LTS 特性解读 | 资源管控 (Resource Control) 应该知道的 6 件事 》 中,增加了“资源管控”相关 SQL,这里再次进行扩展,也是本文的第一个彩蛋。
① 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 任务进行暂停和恢复
TiDB 7.2 引入了新的实验特性,DDL 任务支持暂停(PAUSE)( https://docs.pingcap.com/zh/tidb/dev/sql-statement-admin-pause-ddl )和恢复(RESUME)操作,比如,对正在创建索引的任务进行暂停和恢复。相关命令如下:
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_JOINNO_HASH_JOININDEX_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 t1\G
输出:
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
*************************** 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 o n 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>
⑤ TiDB 7.4.0,新增支持分区类型管理功能
TiDB 7.4 的分区表管理功能更加完备,期待已久的普通表转分区表功能终于上线。( https://docs.pingcap.com/zh/tidb/v7.4/partitioned-table#对现有表进行分区 )
-- 将非分区表转为分区表、修改分区表的分区类型
ALTER TABLE <table_name> PARTITION BY <new partition type and definitions>-- 将分区表转为非分区表
ALTER TABLE <table_name> REMOVE PARTITIONING
举个栗子,将既存表按年龄划定分区,分区类型使用 RANGE ,然后将分区类型变更为 LIST ,最后移除分区。
tidb> show create table t_age\G
*************************** 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_age\G
*************************** 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_age\G
*************************** 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_age\G
*************************** 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)
!!! Tips 提示:
在分区表定义更新后,建议手动更新统计信息(有些环境可能已经关闭自动更新 )。
2.3 MySQL 8.0 兼容性
在 PingCAP 公众号最近发布的通告中, TiDB 7.4 发版:正式兼容 MySQL 8.0 ,详细地介绍了 TiDB 7.4 DMR 在 MySQL 8.0 兼容性方面取得的最新进展。通告中已经列举了若干新特性,本文将做进一步补充。同时,在 TiDB 7.4 DMR 的发版说明中有些小改动并未列出,下面也将进行列举说明,以供参考。
① TiDB 7.2.0,新增支持 CHECK 约束
从 MySQL 8.0.16 开始,MySQL 实现了 CHECK 约束核心特性,并增加了新的信息表 INFORMATION_SCHEMA.CHECK_CONSTRAINTS 用来展示 CHECK 约束定义。( https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-16.html )
从 TiDB 7.2.0 开始,TiDB 新增支持 CHECK 约束,并在 7.4 中增加表 I_S.CHECK_CONSTRAINTS 。需要注意的是,该功能默认关闭,需要通过变量 tidb_enable_check_constraint 进行控制。相关 SQL 控制命令如下:
-- 启用 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;
Ps. 在测试该特性时遇到了两个问题,分别提了 Issue,期待在 TiDB 7.5.0 LTS 代码冻结之前修复。
● [Closed] CHECK CONSTRAINT loss when ENFORCED again #47567 ( https://github.com/pingcap/tidb/issues/47567 )
● [Open] Support TABLE_NAME in CHECK_CONSTRAINTS #47565 ( https://github.com/pingcap/tidb/issues/47565 )
② 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 的别名。示例如下:
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_utf8\G
*************************** 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_utf8mb3\G
*************************** 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 7.4.0 开始,支持指定 utf8mb4_0900_ai_ci/utf8mb4_0900_bin 排序规则,在 7.4.0 的发版说明中有这样一段描述 ( https://docs.pingcap.com/zh/tidb/v7.4/release-7.4.0#数据库管理 ):
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 。
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)
当然,如果为了合理规划漏扫,也可以自定义将 8.0.11 改为更新的版本,比如 8.0.35 ,修改方法参照官方文档 ( https://docs.pingcap.com/zh/tidb/stable/high-reliability-faq#我们的安全漏洞扫描工具对-mysql-version-有要求 tidb-是否支持修改-server-版本号呢 )。
关于 TiDB 兼容 MySQL 8.0 的更多讨论,欢迎访问 AskTUG 论坛:【唠嗑茶话会 88】关于 TiDB 兼容 MySQL 8.0 ,你最想支持的特性/功能是什么?( https://asktug.com/t/topic/1013682 )
④ TiDB 7.4.0,新增支持使用 Hint SER_VAR() 修改系统变量
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;
而从 TiDB 7.4.0 开始,可以使用 SET_VAR() 语法进行控制,更加灵活、便利:
select /*+ set_var(tidb_isolation_read_engines=tiflash) */ count(*) from t;
从 TiDB 7.4 开始,官方文档的系统变量部分增加一个说明项“是否受 Hint SET_VAR 控制”,当前版本中,受该 Hint SET_VAR 控制的系统变量共有 91 个(具体内容请参考官方文档)。
⑤ TiDB 7.4.0, 新增会话连接属性表 session_account_connect_attrs
在 MySQL 早期版本中,支持从 P_S.session_account_connect_attrs 查看会话的连接属性( https://dev.mysql.com/doc/refman/8.0/en/performance-schema-connection-attribute-tables.html )。
在 TiDB 7.4 中,也已经实现。举例如下:
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)
如果通过第三方工具连接,比如 HeidiSQL,则显示为:
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)
⑥ TiDB 7.4.0, 新增支持数据类型 FLOAT4 , FLOAT8 和 MIDDLEINT
从 TiDB 7.4 开始,新增数据类型 FLOAT4 , FLOAT8 和 MIDDLEINT ,以增强 MySQL 兼容性。其中 FLOAT4 实现为 FLOAT 的别名, FLOAT8 实现为 DOUBLE 的别名, MIDDLEINT 实现为 MEDIUMINT 的别名。
示例:
create table t_type (c1 float4, c2 float8, c3 middleint, c4 int3);)
tidb> show create table t_type\G
*************************** 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)
到此,MySQL 8.1 官方文档 ( https://dev.mysql.com/doc/refman/8.1/en/other-vendor-data-types.html )中罗列的 16 个来自其他数据库的数据类型,TiDB 7.4 已全部支持。
总结
到 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?
感谢
在 TiDB 7.4.0 DMR 的 发版说明 ( https://docs.pingcap.com/zh/tidb/v7.4/release-7.4.0#贡献者 )中发现了自己的名字,感谢 TiDB 社区。
欢迎更多伙伴加入 TiDB 社区。
相关文章:

TiDB 7.x 源码编译之 TiDB Server 篇,及新特性详解
本文将介绍如何编译 TiDB Server 源码。以及阐释 TiDB Server 7.x 的部分新特性。 TiDB v7.5.0 LTS 计划于 2023 年 11 月正式 Release,目前代码虽未冻结,但已经可以看到 Alpha 版本的 Code 了,本文代码将以 v7.5.0-alpha 为基准。 TiDB Se…...

Hadoop实验putty文件
🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 很多朋友反馈做hadoop实验中的putty找不到Connection-SSH-Auth路径下找不到Private key for authentication私有密钥,无法将转…...
研发人员绩效考核难题及解决措施
研发部门是技术型企业的核心人员,研发人员的设计贯穿着产品实现过程包括后续的持续改进。倘若研发人员的设计源头得以保障,那么后续工作包括研发人员的绩效考核,相对简单。接下来华恒智信便根据多年来从事的人力资源相关的服务经验为您对于研…...

Inference with C# BERT NLP Deep Learning and ONNX Runtime
目录 效果 测试一 测试二 测试三 模型信息 项目 代码 下载 Inference with C# BERT NLP Deep Learning and ONNX Runtime 效果 测试一 Context :Bob is walking through the woods collecting blueberries and strawberries to make a pie. Question …...

6、原型模式(Prototype Pattern,不常用)
原型模式指通过调用原型实例的Clone方法或其他手段来创建对象。 原型模式属于创建型设计模式,它以当前对象为原型(蓝本)来创建另一个新的对象,而无须知道创建的细节。原型模式在Java中通常使用Clone技术实现,在JavaSc…...

图像万物分割——Segment Anything算法解析与模型推理
一、概述 在视觉任务中,图像分割任务是一个很广泛的领域,应用于交互式分割,边缘检测,超像素化,感兴趣目标生成,前景分割,语义分割,实例分割,泛视分割等。 交互式分割&am…...

Redis实战篇笔记(最终篇)
Redis实战篇笔记(七) 文章目录 Redis实战篇笔记(七)前言达人探店发布和查看探店笔记点赞点赞排行榜 好友关注关注和取关共同关注关注推送关注推荐的实现 总结 前言 本系列文章是Redis实战篇笔记的最后一篇,那么到这里…...

游戏配置表的导入使用
游戏配置表是游戏策划的标配,如下图: 那么程序怎么把这张配置表导入使用? 1.首先,利用命令行把Excel格式的文件转化成Json格式: json-excel\json-excel json Tables\ Data\copy Data\CharacterDefine.txt ..\Clien…...

❀dialog命令运用于linux❀
目录 ❀dialog命令运用于linux❀ msgbox部件(消息框) yesno部件(yesno框) inputbox部件(输入文本框) textbox部件(文本框) menu部件(菜单框) fselect部…...
【算法】蓝桥杯2013国C 横向打印二叉树 题解
文章目录 题目链接题目描述输入格式输出格式样例自己的样例输入自己的样例输出 思路整体思路存储二叉搜索树中序遍历并存储计算目标数的行号dfs遍历并写入数组初始化和处理输入输出初始化处理输入处理输出 完整的代码如下 结束语更新初始化的修改存储二叉搜索树的修改中序遍历和…...
XunSearch 讯搜 error: storage size of ‘methods_bufferevent’ isn’t known
报错: error: storage size of ‘methods_bufferevent’ isn’t known CentOS8.0安装迅搜(XunSearch)引擎报错的解决办法 比较完整的文档 http://www.xunsearch.com/download/xs_quickstart.pdf 官方安装文档 http://www.xunsearch.com/doc/php/guide/start.in…...

基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(三)——serverless数据分析
3 serverless数据分析 大纲 3 serverless数据分析3.1 创建Lambda3.2 创建API Gateway3.3 结果3.4 总结 3.1 创建Lambda 在Lambda中,我们将使用python3作为代码语言。 步骤图例1、入口2、创建(我们选择使用python3.7)3、IAM权限(…...

08、分析测试执行时间及获取pytest帮助
官方用例 # content of test_slow_func.py import pytest from time import sleeppytest.mark.parametrize(delay,(1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,1.0,0.1,0.2,0,3)) def test_slow_func(delay):print("test_slow_func {}".format(delay))sleep(delay)assert…...

视频集中存储/智能分析融合云平台EasyCVR平台接入rtsp,突然断流是什么原因?
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...
JavaScript 复杂的<三元运算符和比较操作>的组合--案例(一)
在逆向的时候,碰上有些复杂的js代码,逻辑弄得人有点混; 因此本帖用来记录一些棘手的代码,方便自己记忆,也让大家拓展认识~ ----前言 内容: function(e, t, n) {try {1 (e "{" e[0] ? JSON.parse(e) : JSON.parse(webInstace.shell(e))).Status || 200 e.Code…...
uniapp搭建内网映射测试https域名
搭建Https域名服务器 使用github的frp搭建,使用宝塔申请免费https证书,需要先关闭宝塔nginx的反向代理,申请完域名后再开启反向代理即可。 教程 新版frp搭建教程 启动命令 服务器端 sudo systemctl start frps本地 cd D:\软件安装包\f…...
国防科技大博士招生入学考试【50+论文主观题】
目录 回答模板大意创新和学术价值启发 论文分类(根据问题/场景分类)数学问题Efficient Multiset Synchronization(高效的多集同步【简单集合/可逆计数Bloom过滤器】)大意创新和学术价值启发 An empirical study of Bayesian netwo…...

CUDA简介——编程模式
1. 引言 前序博客: CUDA简介——基本概念 CPU是用于控制的。即,host控制整个程序流程: 1)程序以Host代码main函数开始,然后顺序执行。 Host代码是顺序执行的,并执行在CPU之上。Host代码会负责Launch ke…...
Linux 软件安装
目录 一、Linux 1、Linux异常解决 1、JDK安装 1、Linux卸载JDK 2、Linux安装JDK 2、Redis安装 一、Linux 1、Linux异常解决 1、Another app is currently holding the yum lock; waiting for it to exit... 解决办法: rm -f /var/run/yum.pid1、杀死这个应用程序 ps a…...

flask之邮件发送
一、安装Flask-Mail扩展 pip install Flask-Mail二、配置Flask-Mail 格式:app.config[参数]值 三、实现方法 3.1、Mail类 常用类方法 3.2、Message类,它封装了一封电子邮件。构造函数参数如下: flask-mail.Message(subject, recipient…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...