当前位置: 首页 > news >正文

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&#xff0c;目前代码虽未冻结&#xff0c;但已经可以看到 Alpha 版本的 Code 了&#xff0c;本文代码将以 v7.5.0-alpha 为基准。 TiDB Se…...

Hadoop实验putty文件

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 很多朋友反馈做hadoop实验中的putty找不到Connection-SSH-Auth路径下找不到Private key for authentication私有密钥&#xff0c;无法将转…...

研发人员绩效考核难题及解决措施

研发部门是技术型企业的核心人员&#xff0c;研发人员的设计贯穿着产品实现过程包括后续的持续改进。倘若研发人员的设计源头得以保障&#xff0c;那么后续工作包括研发人员的绩效考核&#xff0c;相对简单。接下来华恒智信便根据多年来从事的人力资源相关的服务经验为您对于研…...

Inference with C# BERT NLP Deep Learning and ONNX Runtime

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

6、原型模式(Prototype Pattern,不常用)

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

图像万物分割——Segment Anything算法解析与模型推理

一、概述 在视觉任务中&#xff0c;图像分割任务是一个很广泛的领域&#xff0c;应用于交互式分割&#xff0c;边缘检测&#xff0c;超像素化&#xff0c;感兴趣目标生成&#xff0c;前景分割&#xff0c;语义分割&#xff0c;实例分割&#xff0c;泛视分割等。 交互式分割&am…...

Redis实战篇笔记(最终篇)

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

游戏配置表的导入使用

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

❀dialog命令运用于linux❀

目录 ❀dialog命令运用于linux❀ msgbox部件&#xff08;消息框&#xff09; yesno部件&#xff08;yesno框&#xff09; inputbox部件&#xff08;输入文本框&#xff09; textbox部件&#xff08;文本框&#xff09; menu部件&#xff08;菜单框&#xff09; fselect部…...

【算法】蓝桥杯2013国C 横向打印二叉树 题解

文章目录 题目链接题目描述输入格式输出格式样例自己的样例输入自己的样例输出 思路整体思路存储二叉搜索树中序遍历并存储计算目标数的行号dfs遍历并写入数组初始化和处理输入输出初始化处理输入处理输出 完整的代码如下 结束语更新初始化的修改存储二叉搜索树的修改中序遍历和…...

XunSearch 讯搜 error: storage size of ‘methods_bufferevent’ isn’t known

报错&#xff1a; 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中&#xff0c;我们将使用python3作为代码语言。 步骤图例1、入口2、创建&#xff08;我们选择使用python3.7&#xff09;3、IAM权限&#xff08;…...

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平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康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搭建&#xff0c;使用宝塔申请免费https证书&#xff0c;需要先关闭宝塔nginx的反向代理&#xff0c;申请完域名后再开启反向代理即可。 教程 新版frp搭建教程 启动命令 服务器端 sudo systemctl start frps本地 cd D:\软件安装包\f…...

国防科技大博士招生入学考试【50+论文主观题】

目录 回答模板大意创新和学术价值启发 论文分类&#xff08;根据问题/场景分类&#xff09;数学问题Efficient Multiset Synchronization&#xff08;高效的多集同步【简单集合/可逆计数Bloom过滤器】&#xff09;大意创新和学术价值启发 An empirical study of Bayesian netwo…...

CUDA简介——编程模式

1. 引言 前序博客&#xff1a; CUDA简介——基本概念 CPU是用于控制的。即&#xff0c;host控制整个程序流程&#xff1a; 1&#xff09;程序以Host代码main函数开始&#xff0c;然后顺序执行。 Host代码是顺序执行的&#xff0c;并执行在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 格式&#xff1a;app.config[参数]值 三、实现方法 3.1、Mail类 常用类方法 3.2、Message类&#xff0c;它封装了一封电子邮件。构造函数参数如下&#xff1a; flask-mail.Message(subject, recipient…...

【Filament】Filament环境搭建

1 前言 Filament 是一个实时物理渲染引擎&#xff0c;用于 Android、iOS、Linux、macOS、Windows 和 WebGL 平台。该引擎旨在提供高效、实时的图形渲染&#xff0c;并被设计为在 Android 平台上尽可能小而尽可能高效。Filament 支持基于物理的渲染&#xff08;PBR&#xff09;&…...

外包干了2个月,技术倒退2年。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;20年通过校招进入深圳某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

使用 python ffmpeg 批量检查 音频文件 是否损坏或不完整

自用工具&#xff0c;检查下载的音乐是否有损坏 或 下载不完整 使用方法&#xff0c;把 in_dir r’D:\158首无损珍藏版’ 改成你自己的音乐文件夹路径 如果发现文件有损坏&#xff0c;则会在命令行打印错误文件的路径 注意&#xff0c;要求 ffmpeg 命令可以直接在命令行调用…...

Django:通过user-agent判断请求是来自移动端还是PC端(电脑端)

第一种思路&#xff1a; 根据博文 Djano的request.META是什么&#xff1f;的研究成果&#xff0c;先判断有无键HTTP_SEC_CH_UA_MOBILE&#xff0c;如果没有&#xff0c;再去按博文 网站如何判断请求是来自手机-移动端还是PC-电脑端&#xff1f;如何让网站能适应不同的客户端&am…...

Linux中ssh远程登录系统和远程拷贝

本章主要介绍ssh远程登录系统和远程拷贝的方法 ssh的基本用法打开远程图形化界面ssh无密码登录和安全操作Windows远程登录远程拷贝 很多时候服务器并没有显示器&#xff0c;我们也不可能每次都通过控制台去管理服务器&#xff0c;这时就需 要远程登录。远程登录到服务器可以通…...

git常用命令小记

&#xff08;文章正在持续更新中&#xff09; git init - 在当前目录下初始化一个新的 Git 仓库。 git clone [url] - 克隆远程仓库到本地。 git add [file] - 将文件添加到暂存区。 git commit -m "commit message" - 将添加到暂存区的文件提交到本地仓库。 git pus…...

深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动

文章目录 前言一、输入系统的基本组成部分二、输入系统相关源码分析1、IMS 构建1.1、SystemServer # startOtherServices()1.2、InputManagerService1.3、NativeInputManager # nativeInit()1.4、NativeInputManager1.5、InputManager1.6、InputDispatcher1.7、InputReader1.8、…...

SoC with CPLD and MCU ?

AG32 MCU 产品支持多种接口外设&#xff0c;具备与业界主流产品的兼容性&#xff0c;并内置额外的2K FPGA 可编程逻辑。 产品支持 LQFP-48&#xff0c;LQFP-64&#xff0c;LQFP-100 &#xff0c;QFN-32等不同封装。其所有可用 IO 都可以任意地进行映射和互换&#xff0c;以灵活…...

基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(二)——数据清洗、转换

2 数据清洗、转换 此实验使用S3作为数据源 ETL: E extract 输入 T transform 转换 L load 输出 大纲 2 数据清洗、转换2.1 架构图2.2 数据清洗2.3 编辑脚本2.3.1 连接数据源&#xff08;s3&#xff09;2.3.2. 数据结构转换2.3.2 数据结构拆分…...

vuepress-----6、时间更新

# 6、时间更新 基于Git提交时间修改文字时间格式 moment # 最后更新时间 # 时间格式修改 下载库文件 yarn add momentconst moment require(moment); moment.locale(zh-cn)module.exports {themeConfig: {lastUpdated: 更新时间,},plugins: [[vuepress/last-updated,{trans…...

软件下载类型网站怎么做/武汉seo结算

后退文件夹: cd - 在重复一遍就是前进了 转载于:https://www.cnblogs.com/Baronboy/p/7787760.html...

wordpress错误页/小米市场营销案例分析

每个所谓的 Token Economy&#xff08;代币经济&#xff09;&#xff0c;在没有落地之前&#xff0c;都只是一个金融游戏。文 | 王也 运营 | 盖遥 编辑 | 卢晓明出品 | Odaily星球日报&#xff08;ID&#xff1a;o-daily&#xff09;距离 Algorand 第一次荷兰拍卖结束已经一个…...

南宁网站建设智能优化/域名免费注册0元注册

一.需求 前端需要它想要的数据格式&#xff1a; 原有的数据格式&#xff1a; 二.定制化&#xff1a; 1.可以嵌套序列化pol_type,lit_des&#xff0c;area_detail&#xff0c;但结构如下&#xff1a; class ChrDetailSerializer(serializers.ModelSerializer):"""…...

wordpress 新安装 慢/金戈西地那非片

复制文件。 语法 FileCopy源&#xff0c;目标 FileCopy 语句语法包含以下命名参数&#xff1a; 部分说明source必需。 指定要复制的文件的名称的字符串表达式。 _源_可能包含目录或文件夹&#xff0c;和驱动器。目标必需。 指定的目标文件名称的字符串表达式。 _目标_可能包含目…...

郑州市政府网站的建设与发展/网络事件营销

1. 在 app 目录下新建一个文件 helpers.php 2. 在 composer.json 文件的 autoload 字典中添加 "files":["app/helpers.php"] 3. 执行命令&#xff1a;composer dumpautoload OK搞定 4. 这其实是与composer中的自动加载有关 -> 链接 转自&#xff1a;htt…...

武汉市中国建设银行网站/windows7优化大师

***********06. $(this).index() 失效****************************** 使用的库函数jquery 版本过低&#xff0c;1.4以上即可 ***********05. 加载图片后再加载相应的JS****************************** 01.$("").load(function(){...}); document.getElementByI…...