MySQL 9.0 GA 來了!
2024 年 7 月 2 日,MySQL 9.0 GA 版本正式發布。還記得 MySQL 8.0 版本正式發布于 2018 年 4 月 19 日,中間經過了 6 年之久,MySQL 官方終于發布了大版本號變更得 9.0 版本,接下來由我給大家介紹 MySQL 在 9.0 版本中有哪些新的變化。本文包含如下內容:
- MySQL 9.0 中添加或更改的功能
- MySQL 9.0 中已棄用的功能
- MySQL 9.0 中刪除的功能
一、MySQL 9.0 中添加或更改的功能
MySQL 9.0 添加了以下功能:
- 保存 EXPLAIN 分析 JSON 輸出
- DDL 語句新增 Event 語法
- 性能模式新添加了兩個新表
1.保存 EXPLAIN 分析 JSON 輸出
從 MySQL 9.0.0 開始,現在支持使用下方得新語法 將 EXPLAIN 分析的 JSON 輸出保存到用戶變量中:
EXPLAIN ANALYZE FORMAT=JSON INTO @variable select_stmt
隨后,該變量可用作任何 MySQL JSON 函數的 JSON 參數( Section 15.1.13, “CREATE EVENT Statement”)。只有 FORMAT=JSON 時才支持 INTO 子句;必須明確指定 FORMAT。這種形式的 EXPLAIN ANALYZE 還支持可選的 FOR SCHEMA 或 FOR DATABASE 子句。
注意:僅當 explain_json_format_version 服務器系統變量設置為 2 時,此功能才可用;否則,嘗試使用它會引發 ER_EXPLAIN_ANALYZE_JSON_FORMAT_VERSION_NOT_SUPPORTED (EXPLAIN ANALYZE 不支持 FORMAT=JSON 且解釋_json_format_versinotallow=1)。
解釋
這里直接給大家看看官網得例子,方便理解:
mysql> EXPLAIN FORMAT=JSON INTO @myselect
-> SELECT name FROM a WHERE id = 2;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @myselect\G
*************************** 1. row ***************************
@myex: {
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "1.00"
},
"table": {
"table_name": "a",
"access_type": "const",
"possible_keys": [
"PRIMARY"
],
"key": "PRIMARY",
"used_key_parts": [
"id"
],
"key_length": "4",
"ref": [
"const"
],
"rows_examined_per_scan": 1,
"rows_produced_per_join": 1,
"filtered": "100.00",
"cost_info": {
"read_cost": "0.00",
"eval_cost": "0.10",
"prefix_cost": "0.00",
"data_read_per_join": "408"
},
"used_columns": [
"id",
"name"
]
}
}
}
1 row in set (0.00 sec)
大家都知道 EXPLAIN 可以用于分析 SQL 語句,在 MySQL 9.0 中,EXPLAIN 得語法發生了變化,在查詢語句 EXPLAIN FORMAT=JSON INTO @myselect SELECT name FROM a WHERE id = 2中,EXPLAIN 后面可以接上 FORMAT=JSON INTO @myselect 語句,這樣我們將 EXPLAIN 得輸出結果保存到變量 myselect 中。
在保存到變量 myselect 中后,我們就可以使用 MySQL JSON 函數處理該變量,就像處理任何其他 JSON 值一樣,如以下使用 JSON_EXTRACT() 的示例所示:
mysql> SELECT JSON_EXTRACT(@myselect, "$.query_block.table.key");
+----------------------------------------------------+
| JSON_EXTRACT(@myselect, "$.query_block.table.key") |
+----------------------------------------------------+
| "PRIMARY" |
+----------------------------------------------------+
1 row in set (0.01 sec)
mysql> SELECT JSON_EXTRACT(@myupdate, "$.query_block.table.access_type") AS U_acc,
-> JSON_EXTRACT(@mydelete, "$.query_block.table.access_type") AS D_acc;
+---------+-------+
| U_acc | D_acc |
+---------+-------+
| "range" | "ALL" |
+---------+-------+
1 row in set (0.00 sec)
關于 EXPLAIN 語句更多新的使用方式,大家可以參閱https://dev.mysql.com/doc/refman/9.0/en/explain.html#explain-execution-plan。
2.DDL 語句新增 Event 語法
從 MySQL 9.0.0 開始,可以使用以下 Event 語法:
- CREATE EVENT(創建事件)
- ALTER EVENT(修改事件)
- DROP EVENT(刪除事件)
EVENT 語句不支持使用占位符參數(?)。我們必須根據字符串文字、系統變量和用戶變量的某種組合來組裝要準備的語句文本。
EVENT 語句語法如下,
CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON {REPLICA | SLAVE}]
[COMMENT 'string']
DO event_body;
schedule: {
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]
}
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
EVENT 語句的語法看著比較復雜,參數眾多,實際掌握一些常用參數就好了。常用語法如下,
CREATE EVENT 事件名
ON SCHEDULE AT 或者 EVERY + 指定時間間隔
DO 接 SQL 語句
EVENT 后面跟事件名,ON SCHEDULE 后面可以跟 AT 或者 EVERY 表示指定時間或者每隔一段時間,DO 后面接 SQL 語句,表示當滿足時間條件后要執行的 SQL 語句。
解釋
Event 語句提供的功能跟定時任務相似,它可以在 MySQL 中定時執行一些 SQL 語句。還可以用于 MySQL 的存儲過程中。接下來給大家提供一個官網例子,供大家理解,
CREATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
UPDATE myschema.mytable SET mycol = mycol + 1;
上面的語句創建了一個名為 myevent 的事件。該事件執行一次(創建后一小時),方法是運行一條 SQL 語句,將 myschema.mytable 表的 mycol 列的值加 1。
關于 Event 語法更多新的使用方式,大家可以參閱 https://dev.mysql.com/doc/refman/9.0/en/create-event.html。
3.性能模式新添加了兩個新表
(1) Variables_metadata 表
Variables_metadata 表提供有關系統變量的一般信息。此信息包括 MySQL 服務器識別的每個系統變量的名稱、范圍、類型、范圍(如果適用)和描述。
該表中的兩列(MIN_VALUE 和 MAX_VALUE)旨在替換 Variables_info 表中已棄用的列。
Variables_metadata 表顯示每個服務器系統變量的名稱、范圍、類型、值范圍(如果適用)和說明。
(2) global_variable_attributes 表
global_variable_attributes 表提供有關服務器分配給全局系統變量的屬性值對的信息。
global_variable_attributes 表就是把 MySQL 服務器已為全局變量(例如 offline_mode 或 read_only)設置的屬性及其值的信息用表格式用作展示。
(3) 解釋
性能模式新添加的兩個新表就是方便大家直接在 MySQL cli 模式中直接查詢系統變量以及全局變量。
有關這兩個表的詳細說明,大家可以參閱官網:https://dev.mysql.com/doc/refman/9.0/en/performance-schema-system-variable-tables.html。
二、MySQL 9.0 中已棄用的功能
以下功能在 MySQL 9.0 中已棄用,并且可能會在未來的系列中刪除。如果 MySQL 更新說明中有顯示替代方案,則你們應更新應用程序并使用它們。
對于使用 MySQL 9.0 中已棄用且已在更高 MySQL 版本中刪除的功能的應用程序,從 MySQL 9.0 源復制的語句到運行更高版本的副本時,語句可能會執行失敗,或者可能對源和副本產生不同的影響。為了避免此類問題,應修改使用 9.0 中已棄用功能的應用程序以避免這些問題,并盡可能使用替代方案。以下內容為棄用功能,
性能模式 variables_info 表列
性能模式 variables_info 表的 MIN_VALUE 和 MAX_VALUE 列現已棄用,并且可能會在未來的 MySQL 版本中刪除。相反請使用 Variables_metadata 表中具有相同名稱的列(請參閱上文章節)。
三、MySQL 9.0 中刪除的功能
以下功能已過時并已在 MySQL 9.0 中刪除。如果 MySQL 更新說明中有顯示替代方案,則你們應更新應用程序并使用它們。
對于使用 MySQL 9.0 中刪除的功能的 MySQL 8.4 應用程序,從 MySQL 8.4 源復制到 MySQL 9.0 副本時,語句可能會執行失敗,或者可能對源和副本產生不同的影響。為了避免此類問題,應修改使用 MySQL 9.0 中刪除的功能的應用程序以避免這些問題,并盡可能使用替代方案。
mysql_native_password 插件。mysql_native_password 身份驗證插件已在 MySQL 8.0 中棄用,已被刪除。服務器現在拒絕來自不具有 CLIENT_PLUGIN_AUTH 功能的舊客戶端程序的 mysql_native 身份驗證請求。由于此更改,以下服務器選項和變量也已被刪除:
- --mysql-native-password 服務器選項
- --mysql-native-password-proxy-users 服務器選項
- default_authentication_plugin 服務器系統變量
給大家介紹一下 mysql_native_password 插件。
1.mysql_native_password 介紹
從 MySQL 8.0.4 開始,MySQL 默認身份驗證插件從 mysql_native_password 改為 caching_sha2_password 。相應地,libmysqlclient 也使用 caching_sha2_password 作為默認的身份驗證機制。
2.刪除起因
在這之前 MySQL 5.6/5.7 使用的默認密碼插件是 mysql_native_password。mysql_native_password 的特點是不需要加密的連接。該插件驗證速度特別快,但是不夠安全,因為,mysql_native_password 使用的是于 SHA1 算法,NIST(美國國家標準與技術研究院)在很早之前就已建議停止使用 SHA1 算法,因為 SHA1 和其他哈希算法(例如 MD5)容易被破解。
其實從 MySQL 5.6 開始就引入了更安全的認證機制:ha256_password 認證插件。它使用一個加鹽密碼(salted password)進行多輪 SHA256 哈希(數千輪哈希,暴力破解更難),以確保哈希值轉換更安全。但是,建立安全連接和多輪 hash 加密很耗費時間。雖然安全性更高,但是驗證速度不夠快。
3.改進
MySQL 試圖結合二者的優點。于是在 MySQL 8.0.3 版本引入了一個新的身份驗證插件 caching_sha2_password ,作為 sha256_password 的代替方案,在 sha256_password 的基礎上進行了改進補上了短板,既解決安全性問題又解決性能問題。與此同時 sha256_password 將退出時代的浪潮。MySQL 預計在未來版本中將其刪除。使用 sha256_password 進行身份驗證的 MySQL 賬戶建議轉為 caching_sha2_password。
其實 MySQl 早就想在 8.0 版本中替換到 mysql_native_password 插件,到了 9.0 版本直接刪除 mysql_native_password 功能其實提前跟大家打過招呼。
有關認證插件的更多問題,大家可以參閱官網 https://dev.mysql.com/doc/refman/9.0/en/authentication-plugins.html
總結
MySQL 9.0 版本新增了 EXPLAIN 分析 JSON 輸出、DDL 語句新增 Event 語法、性能模式新添加了兩個新表,棄用了老版本中的 variables_info 表,刪除了 mysql_native_password 認證插件。
這些更新沒有帶來大的功能改動,對于大多數應用程序來說影響很小,沒有當年 MySQL 5.7 發布時帶來的 innodb 存儲引擎那種給人帶來的激動感,更新說明中也沒有強調性能改進(估計性能對比 8.4 版本提升不大)。不過這也說明關系型數據庫 MySQL 如今的功能以及穩定性方面都已經越來越完善。
OK,這里也是祝賀 MySQL 9.0 GA 版本的發布,MySQL 作為開源界的數據庫一哥,地位早已無法撼動。相信新版本將進一步鞏固 MySQL 在數據庫領域的領先地位,為數據庫應用帶來更多可能性。