本文將介紹如何編譯 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-paus... )和恢復(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_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 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-co... )。
在 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-typ... )中羅列的 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 社區。