MySQL 8.0 18個管理相關的新特性
最近在梳理 MySQL 8.0 的新特性,以下是從中選取的 18 個管理相關的新特性。
這 18 個新特性涉及的範圍比較廣,包括安裝、備份、升級、DDL、慢日誌、遷移、日常維護等。
掌握這些新特性有助於我們更好地使用 MySQL 8.0。
1. 可持久化全域性變數
持久化後的變數會儲存在資料目錄下的 mysqld-auto.cnf 檔案中。
以下是持久化變數相關的命令。
# 持久化變數,同時修改變數的記憶體值。
SET PERSIST max_connections = 2000;
# 只持久化變數,不修改變數的記憶體值,適用於只讀引數的調整。
SET PERSIST_ONLY back_log = 2000;
# 從 mysqld-auto.cnf 中刪除所有持久化變數。
RESET PERSIST;
# 從 mysqld-auto.cnf 中刪除指定的變數。如果變數不存在,會報錯。
RESET PERSIST system_var_name;
# 從 mysqld-auto.cnf 中刪除指定的變數。如果變數不存在,會提示 warning,不報錯。
RESET PERSIST IF EXISTS system_var_name;
持久化後的變數即可在 mysqld-auto.cnf 中檢視,也可透過 performance_schema.persisted_variables 檢視。
2. 可設定管理 IP 和埠
管理 IP 透過 admin_address 引數設定,管理埠透過 admin_port 引數設定。
管理連線的數量沒有限制,但僅允許具有 SERVICE_CONNECTION_ADMIN 許可權的使用者連線。
預設情況下,管理介面沒有自己的獨立執行緒,可將 create_admin_listener_thread 設定為 ON 開啟。
建議設定管理 IP 和埠,這樣即使連線數滿了,也不用擔心登陸不上例項去調整 max_connections 的大小。
3. 安裝包
從 MySQL 8.0.16 開始,MySQL 針對通用二進位制包(Linux - Generic)提供了一個最小化版本。
最小化版本移除了 debug 相關的二進位制檔案。
MySQL 8.0.31 普通版本(mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz)包的大小是 576.8 MB,而最小化版本(mysql-8.0.31-linux-glibc2.17-x86_64-minimal.tar.xz)只有 57.4 MB。後者大小隻是前者的 9.95 %。
從 MySQL 8.0.31 開始,通用二進位制包還提供了 Linux - Generic (glibc 2.17) (ARM, 64-bit) 版本的下載。
4. 資源組(Resource Groups)
資源組,可用來控制組內執行緒的優先順序及其能使用的資源,目前,能被管理的資源只有 CPU。
# 建立資源組
CREATE RESOURCE GROUP Batch
TYPE = USER # 資源組的型別,可設定USER(使用者資源組),SYSTEM(系統資源組)。
VCPU = 0-1 # 設定 CPU 親和性,讓執行緒執行在指定的 CPU 上。不設定,則預設會使用所有的 CPU。
THREAD_PRIORITY = 10; # 設定執行緒優先順序,有效值是-20(最高優先順序)到19(最低優先順序)。不設定,則預設為0。對於系統資源組,可設定的優先順序範圍是-20到0,對於使用者資源組,可設定的優先順序範圍是0到19。
以下是資源組的幾種常用方式。
SET RESOURCE GROUP Batch FOR 702,703; # 將指定執行緒分配給資源組。702 是執行緒ID,對應 performance_schema.threads 中的 THREAD_ID。
SET RESOURCE GROUP Batch; # 將當前會話的執行緒分配給資源組
SELECT /*+ RESOURCE_GROUP(Batch) */ COUNT(*) FROM sbtest.sbtest1;
5. ALTER DATABASE 支援 READ ONLY 選項
設定為只讀模式的庫將禁止任何更新操作。適用於資料庫遷移場景。
# 將 mydb 設定為只讀模式
ALTER DATABASE mydb READ ONLY = 1;
# 關閉只讀模式
ALTER DATABASE mydb READ ONLY = 0;
6. 設定 SHOW PROCESSLIST 的實現方式
SHOW PROCESSLIST 預設是從執行緒管理器中獲取執行緒資訊。這種實現方式會持有全域性互斥鎖,對資料庫的效能會有一定的影響。
所以一般都推薦使用 performance_schema.processlist,這種方式不會持有全域性鎖。
在 MySQL 8.0.22 中,引入了 performance_schema_show_processlist 引數,用來設定 SHOW PROCESSLIST 的實現方式。設定為 ON,則會使用 performance_schema.processlist 這種實現方式,預設為 OFF。
7. DDL
在 MySQL 8.0.27 中,引入了 innodb_ddl_threads 和 innodb_ddl_buffer_size 提升索引的建立速度。
8. 秒級加列
從 MySQL 8.0.12 開始,Online DDL 開始支援 INSTANT 演算法。
使用這個演算法進行加列操作,只需修改表的後設資料資訊,操作瞬間就能完成。不過在 MySQL 8.0.29 之前,列只能新增到表的最後位置。
從 MySQL 8.0.29 開始,則移除了這一限制,新增列可以新增到表的任何位置。
不僅如此,從 MySQL 8.0.29 開始,刪列操作也可以使用 INSTANT 演算法。
9. 提升了 DROP TABLE,TRUNCATE TABLE,DROP TABLESPACE 操作的效能
這個最佳化是 MySQL 8.0.23 引入的。在之前的版本中,這些操作會遍歷整個 Buffer Pool,刪除對應表(或表空間)的資料頁。在遍歷的過程中,會加鎖(latch)。加鎖期間,會阻塞所有的 DML 操作。
注意,阻塞時間與 Buffer Pool 的大小有關,與表的大小無關。Buffer Pool 越大,遍歷時間會越長,相應的,阻塞時間也會越久。
最佳化後,待刪除的資料頁會做非同步處理。
10. 作業系統檢視 MySQL 的執行緒名
從 MySQL 8.0.27 開始,透過 ps 命令可以直接檢視 MySQL 的執行緒名。
# ps -p 22307 H -o "pid tid cmd comm"
PID TID CMD COMMAND
22307 22307 /usr/local/mysql/bin/mysqld mysqld
22307 22316 /usr/local/mysql/bin/mysqld ib_io_ibuf
22307 22318 /usr/local/mysql/bin/mysqld ib_io_log
22307 22319 /usr/local/mysql/bin/mysqld ib_io_rd-1
22307 22331 /usr/local/mysql/bin/mysqld ib_io_rd-2
...
11. 控制連線的記憶體使用量
從 MySQL 8.0.28 開始,引入了 connection_memory_limit 引數限制單個使用者連線可以使用的最大記憶體量,global_connection_memory_limit 引數限制所有使用者連線可以使用的記憶體總量。
mysql> SELECT LENGTH(GROUP_CONCAT(f1 ORDER BY f2)) FROM t1;
ERROR 4082 (HY000): Connection closed. Connection memory limit 2097152 bytes exceeded. Consumed 2456976 bytes.
注意,這裡說的記憶體不包括 InnoDB Buffer Pool。
12. 慢日誌
在 MySQL 8.0.14 中,引入了 log_slow_extra 引數,可以將更詳細的資訊記錄到慢日誌中。
看下面這個示例,對比下引數開啟前後的輸出。
# Time: 2022-12-11T08:19:52.135515Z
# User@Host: root[root] @ localhost [] Id: 660
# Query_time: 10.000188 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1
SET timestamp=1670746782;
select sleep(10);
# Time: 2022-12-11T08:20:54.397597Z
# User@Host: root[root] @ localhost [] Id: 662
# Query_time: 10.000194 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1 Thread_id: 662 Errno: 0 Killed: 0 Bytes_received: 23 Bytes_sent: 57 Read_first: 0 Read_last: 0 Read_key: 0 Read_next: 0 Read_prev: 0 Read_rnd: 0 Read_rnd_next: 0 Sort_merge_passes: 0 Sort_range_count: 0 Sort_rows: 0 Sort_scan_count: 0 Created_tmp_disk_tables: 0 Created_tmp_tables: 0 Start: 2022-12-11T08:20:44.397403Z End: 2022-12-11T08:20:54.397597Z
SET timestamp=1670746844;
select sleep(10);
除此之外,SET timestamp 現在記錄的是語句的開始時間,不再是語句的結束時間。
13. 備份
在 MySQL 8.0.30 中,mysqldump 新增了 --mysqld-long-query-time 選項,允許自定義 long_query_time 的會話值。
這樣可避免將備份相關的查詢語句記錄在慢日誌中。
14. 克隆外掛
克隆外掛(Clone Plugin)是 MySQL 8.0.17 引入的一個重大特性。
有了克隆外掛,只需一條命令就能很方便地新增一個新的節點,無論是在組複製還是普通的主從環境中。
克隆外掛的具體用法及實現細節可參考:MySQL 8.0 新特性之 Clone Plugin
15. 備份鎖
注意,引入備份鎖是為了阻塞備份過程中的 DDL,不是為了替代全域性讀鎖。
之所以 XtraBackup 8.0 及 MySQL Enterprise Backup 在備份的過程中不再加全域性讀鎖,主要是因為 performance_schema.log_status 的引入。
16. 資料庫升級
資料庫升級無需再執行 mysql_upgrade 指令碼。升級邏輯已內建到 mysqld 的啟動流程中。
升級之前,可透過 MySQL Shell 中的 util.checkForServerUpgrade() 檢查例項是否滿足升級條件。
17. MySQL 客戶端
mysql 客戶端預設會開啟 --binary-as-hex。
開啟後,mysql 客戶端會使用十六進位制表示法顯示二進位制資料。例如,
mysql8.0> SELECT UNHEX(41);
+----------------------+
| UNHEX(41) |
+----------------------+
| 0x41 |
+----------------------+
1 row in set (0.00 sec)
mysql5.7> SELECT UNHEX(41);
+-----------+
| UNHEX(41) |
+-----------+
| A |
+-----------+
1 row in set (0.00 sec)
如果要禁用十六進位制表示法,需設定 --skip-binary-as-hex。
18. 可透過 RESTART 命令重啟 MySQL 例項
能使用 RESTART 命令的前提是 mysqld 是透過 mysqld_safe 或 systemctl 等守護程式啟動的。
mysql> restart;
ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2936159/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 8.0 20個 InnoDB 及資料字典相關的新特性MySql
- MySQL 8.0 新特性MySql
- MySQL 8.0新特性概覽MySql
- Oracle 21c新特性預覽與日常管理相關的幾個新特性Oracle
- MySQL8.0-新特性彙總MySql
- MySQL8.0-新特性-DescendingIndexMySqlIndex
- MySQL 8.0 新特性梳理彙總MySql
- MySQL·8.0新特性·InvisibleIndexMySqlIndex
- MySQL 8.0新特性更新介紹MySql
- MySQL8.0 新特性 top10MySql
- Mysql8.0部分新特性MySql
- mysql8.0新特性--隱藏索引MySql索引
- Oracle 18c新特性詳解 - 表和表空間相關的新特性Oracle
- MySQL8.0新特性-臨時表的改善MySql
- MySQL 8.0新特性-倒敘索引 desc indexMySql索引Index
- MySQL8.0新特性-CTE語法支援MySql
- MySQL·8.0新特性·Newdatadictionary嚐鮮篇MySql
- MySQL8.0 新特性:Partial Update of LOB ColumnMySql
- 新特性解讀 | MySQL 8.0 對 UNION 的改進MySql
- MySQL 8.0 新增特性MySql
- MySQL 8.0 在關聯式資料庫方面有這些新特性MySql資料庫
- C# 8.0的三個令人興奮的新特性C#
- C++ 11 新特性之容器相關特性C++
- MySQL8.0 · 引擎特性 · 關於undo表空間的一些新變化MySql
- 新特性解讀 | MySQL 8.0 新密碼策略(終篇)MySql密碼
- 新特性解讀 | MySQL 8.0 多因素身份認證MySql
- MySQL 8.0表空間新特性簡單實驗MySql
- MySQL-18 MySQL8其他新特性MySql
- MySQL 5.6, 5.7, 8.0版本的新特性彙總大全MySql
- 8.0新特性-不可見索引索引
- MySQL8.0新特性隨筆:NOWAIT以及SKIPLOCKEDMySqlAI
- MySQL 8.0 新增特性介紹MySql
- MySQL 5.6的72個新特性(譯)MySql
- MySQL9的3個新特性MySql
- 新特性解讀 | MySQL 8.0錯誤日誌深入過濾(上)MySql
- MySQL 5.7 學習心得之安全相關特性MySql
- Java18的新特性Java
- MYSQL8.0特性—無select注入MySql