MySQL 8.0 18個管理相關的新特性

ITPUB社群發表於2023-02-21

最近在梳理 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.7SELECT 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章