MySQL 9.0 GA 來(lái)了!
2024 年 7 月 2 日,MySQL 9.0 GA 版本正式發(fā)布。還記得 MySQL 8.0 版本正式發(fā)布于 2018 年 4 月 19 日,中間經(jīng)過(guò)了 6 年之久,MySQL 官方終于發(fā)布了大版本號(hào)變更得 9.0 版本,接下來(lái)由我給大家介紹 MySQL 在 9.0 版本中有哪些新的變化。本文包含如下內(nèi)容:
- MySQL 9.0 中添加或更改的功能
- MySQL 9.0 中已棄用的功能
- MySQL 9.0 中刪除的功能
一、MySQL 9.0 中添加或更改的功能
MySQL 9.0 添加了以下功能:
- 保存 EXPLAIN 分析 JSON 輸出
- DDL 語(yǔ)句新增 Event 語(yǔ)法
- 性能模式新添加了兩個(gè)新表
1.保存 EXPLAIN 分析 JSON 輸出
從 MySQL 9.0.0 開(kāi)始,現(xiàn)在支持使用下方得新語(yǔ)法 將 EXPLAIN 分析的 JSON 輸出保存到用戶變量中:
EXPLAIN ANALYZE FORMAT=JSON INTO @variable select_stmt
隨后,該變量可用作任何 MySQL JSON 函數(shù)的 JSON 參數(shù)( Section 15.1.13, “CREATE EVENT Statement”)。只有 FORMAT=JSON 時(shí)才支持 INTO 子句;必須明確指定 FORMAT。這種形式的 EXPLAIN ANALYZE 還支持可選的 FOR SCHEMA 或 FOR DATABASE 子句。
注意:僅當(dāng) explain_json_format_version 服務(wù)器系統(tǒng)變量設(shè)置為 2 時(shí),此功能才可用;否則,嘗試使用它會(huì)引發(fā) ER_EXPLAIN_ANALYZE_JSON_FORMAT_VERSION_NOT_SUPPORTED (EXPLAIN ANALYZE 不支持 FORMAT=JSON 且解釋_json_format_versinotallow=1)。
解釋
這里直接給大家看看官網(wǎng)得例子,方便理解:
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 語(yǔ)句,在 MySQL 9.0 中,EXPLAIN 得語(yǔ)法發(fā)生了變化,在查詢語(yǔ)句 EXPLAIN FORMAT=JSON INTO @myselect SELECT name FROM a WHERE id = 2中,EXPLAIN 后面可以接上 FORMAT=JSON INTO @myselect 語(yǔ)句,這樣我們將 EXPLAIN 得輸出結(jié)果保存到變量 myselect 中。
在保存到變量 myselect 中后,我們就可以使用 MySQL JSON 函數(shù)處理該變量,就像處理任何其他 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)
關(guān)于 EXPLAIN 語(yǔ)句更多新的使用方式,大家可以參閱https://dev.mysql.com/doc/refman/9.0/en/explain.html#explain-execution-plan。
2.DDL 語(yǔ)句新增 Event 語(yǔ)法
從 MySQL 9.0.0 開(kāi)始,可以使用以下 Event 語(yǔ)法:
- CREATE EVENT(創(chuàng)建事件)
- ALTER EVENT(修改事件)
- DROP EVENT(刪除事件)
EVENT 語(yǔ)句不支持使用占位符參數(shù)(?)。我們必須根據(jù)字符串文字、系統(tǒng)變量和用戶變量的某種組合來(lái)組裝要準(zhǔn)備的語(yǔ)句文本。
EVENT 語(yǔ)句語(yǔ)法如下,
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 語(yǔ)句的語(yǔ)法看著比較復(fù)雜,參數(shù)眾多,實(shí)際掌握一些常用參數(shù)就好了。常用語(yǔ)法如下,
CREATE EVENT 事件名
ON SCHEDULE AT 或者 EVERY + 指定時(shí)間間隔
DO 接 SQL 語(yǔ)句
EVENT 后面跟事件名,ON SCHEDULE 后面可以跟 AT 或者 EVERY 表示指定時(shí)間或者每隔一段時(shí)間,DO 后面接 SQL 語(yǔ)句,表示當(dāng)滿足時(shí)間條件后要執(zhí)行的 SQL 語(yǔ)句。
解釋
Event 語(yǔ)句提供的功能跟定時(shí)任務(wù)相似,它可以在 MySQL 中定時(shí)執(zhí)行一些 SQL 語(yǔ)句。還可以用于 MySQL 的存儲(chǔ)過(guò)程中。接下來(lái)給大家提供一個(gè)官網(wǎng)例子,供大家理解,
CREATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
UPDATE myschema.mytable SET mycol = mycol + 1;
上面的語(yǔ)句創(chuàng)建了一個(gè)名為 myevent 的事件。該事件執(zhí)行一次(創(chuàng)建后一小時(shí)),方法是運(yùn)行一條 SQL 語(yǔ)句,將 myschema.mytable 表的 mycol 列的值加 1。
關(guān)于 Event 語(yǔ)法更多新的使用方式,大家可以參閱 https://dev.mysql.com/doc/refman/9.0/en/create-event.html。
3.性能模式新添加了兩個(gè)新表
(1) Variables_metadata 表
Variables_metadata 表提供有關(guān)系統(tǒng)變量的一般信息。此信息包括 MySQL 服務(wù)器識(shí)別的每個(gè)系統(tǒng)變量的名稱、范圍、類型、范圍(如果適用)和描述。
該表中的兩列(MIN_VALUE 和 MAX_VALUE)旨在替換 Variables_info 表中已棄用的列。
Variables_metadata 表顯示每個(gè)服務(wù)器系統(tǒng)變量的名稱、范圍、類型、值范圍(如果適用)和說(shuō)明。
(2) global_variable_attributes 表
global_variable_attributes 表提供有關(guān)服務(wù)器分配給全局系統(tǒng)變量的屬性值對(duì)的信息。
global_variable_attributes 表就是把 MySQL 服務(wù)器已為全局變量(例如 offline_mode 或 read_only)設(shè)置的屬性及其值的信息用表格式用作展示。
(3) 解釋
性能模式新添加的兩個(gè)新表就是方便大家直接在 MySQL cli 模式中直接查詢系統(tǒng)變量以及全局變量。
有關(guān)這兩個(gè)表的詳細(xì)說(shuō)明,大家可以參閱官網(wǎng):https://dev.mysql.com/doc/refman/9.0/en/performance-schema-system-variable-tables.html。
二、MySQL 9.0 中已棄用的功能
以下功能在 MySQL 9.0 中已棄用,并且可能會(huì)在未來(lái)的系列中刪除。如果 MySQL 更新說(shuō)明中有顯示替代方案,則你們應(yīng)更新應(yīng)用程序并使用它們。
對(duì)于使用 MySQL 9.0 中已棄用且已在更高 MySQL 版本中刪除的功能的應(yīng)用程序,從 MySQL 9.0 源復(fù)制的語(yǔ)句到運(yùn)行更高版本的副本時(shí),語(yǔ)句可能會(huì)執(zhí)行失敗,或者可能對(duì)源和副本產(chǎn)生不同的影響。為了避免此類問(wèn)題,應(yīng)修改使用 9.0 中已棄用功能的應(yīng)用程序以避免這些問(wèn)題,并盡可能使用替代方案。以下內(nèi)容為棄用功能,
性能模式 variables_info 表列
性能模式 variables_info 表的 MIN_VALUE 和 MAX_VALUE 列現(xiàn)已棄用,并且可能會(huì)在未來(lái)的 MySQL 版本中刪除。相反請(qǐng)使用 Variables_metadata 表中具有相同名稱的列(請(qǐng)參閱上文章節(jié))。
三、MySQL 9.0 中刪除的功能
以下功能已過(guò)時(shí)并已在 MySQL 9.0 中刪除。如果 MySQL 更新說(shuō)明中有顯示替代方案,則你們應(yīng)更新應(yīng)用程序并使用它們。
對(duì)于使用 MySQL 9.0 中刪除的功能的 MySQL 8.4 應(yīng)用程序,從 MySQL 8.4 源復(fù)制到 MySQL 9.0 副本時(shí),語(yǔ)句可能會(huì)執(zhí)行失敗,或者可能對(duì)源和副本產(chǎn)生不同的影響。為了避免此類問(wèn)題,應(yīng)修改使用 MySQL 9.0 中刪除的功能的應(yīng)用程序以避免這些問(wèn)題,并盡可能使用替代方案。
mysql_native_password 插件。mysql_native_password 身份驗(yàn)證插件已在 MySQL 8.0 中棄用,已被刪除。服務(wù)器現(xiàn)在拒絕來(lái)自不具有 CLIENT_PLUGIN_AUTH 功能的舊客戶端程序的 mysql_native 身份驗(yàn)證請(qǐng)求。由于此更改,以下服務(wù)器選項(xiàng)和變量也已被刪除:
- --mysql-native-password 服務(wù)器選項(xiàng)
- --mysql-native-password-proxy-users 服務(wù)器選項(xiàng)
- default_authentication_plugin 服務(wù)器系統(tǒng)變量
給大家介紹一下 mysql_native_password 插件。
1.mysql_native_password 介紹
從 MySQL 8.0.4 開(kāi)始,MySQL 默認(rèn)身份驗(yàn)證插件從 mysql_native_password 改為 caching_sha2_password 。相應(yīng)地,libmysqlclient 也使用 caching_sha2_password 作為默認(rèn)的身份驗(yàn)證機(jī)制。
2.刪除起因
在這之前 MySQL 5.6/5.7 使用的默認(rèn)密碼插件是 mysql_native_password。mysql_native_password 的特點(diǎn)是不需要加密的連接。該插件驗(yàn)證速度特別快,但是不夠安全,因?yàn)椋琺ysql_native_password 使用的是于 SHA1 算法,NIST(美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院)在很早之前就已建議停止使用 SHA1 算法,因?yàn)?SHA1 和其他哈希算法(例如 MD5)容易被破解。
其實(shí)從 MySQL 5.6 開(kāi)始就引入了更安全的認(rèn)證機(jī)制:ha256_password 認(rèn)證插件。它使用一個(gè)加鹽密碼(salted password)進(jìn)行多輪 SHA256 哈希(數(shù)千輪哈希,暴力破解更難),以確保哈希值轉(zhuǎn)換更安全。但是,建立安全連接和多輪 hash 加密很耗費(fèi)時(shí)間。雖然安全性更高,但是驗(yàn)證速度不夠快。
3.改進(jìn)
MySQL 試圖結(jié)合二者的優(yōu)點(diǎn)。于是在 MySQL 8.0.3 版本引入了一個(gè)新的身份驗(yàn)證插件 caching_sha2_password ,作為 sha256_password 的代替方案,在 sha256_password 的基礎(chǔ)上進(jìn)行了改進(jìn)補(bǔ)上了短板,既解決安全性問(wèn)題又解決性能問(wèn)題。與此同時(shí) sha256_password 將退出時(shí)代的浪潮。MySQL 預(yù)計(jì)在未來(lái)版本中將其刪除。使用 sha256_password 進(jìn)行身份驗(yàn)證的 MySQL 賬戶建議轉(zhuǎn)為 caching_sha2_password。
其實(shí) MySQl 早就想在 8.0 版本中替換到 mysql_native_password 插件,到了 9.0 版本直接刪除 mysql_native_password 功能其實(shí)提前跟大家打過(guò)招呼。
有關(guān)認(rèn)證插件的更多問(wèn)題,大家可以參閱官網(wǎng) https://dev.mysql.com/doc/refman/9.0/en/authentication-plugins.html
總結(jié)
MySQL 9.0 版本新增了 EXPLAIN 分析 JSON 輸出、DDL 語(yǔ)句新增 Event 語(yǔ)法、性能模式新添加了兩個(gè)新表,棄用了老版本中的 variables_info 表,刪除了 mysql_native_password 認(rèn)證插件。
這些更新沒(méi)有帶來(lái)大的功能改動(dòng),對(duì)于大多數(shù)應(yīng)用程序來(lái)說(shuō)影響很小,沒(méi)有當(dāng)年 MySQL 5.7 發(fā)布時(shí)帶來(lái)的 innodb 存儲(chǔ)引擎那種給人帶來(lái)的激動(dòng)感,更新說(shuō)明中也沒(méi)有強(qiáng)調(diào)性能改進(jìn)(估計(jì)性能對(duì)比 8.4 版本提升不大)。不過(guò)這也說(shuō)明關(guān)系型數(shù)據(jù)庫(kù) MySQL 如今的功能以及穩(wěn)定性方面都已經(jīng)越來(lái)越完善。
OK,這里也是祝賀 MySQL 9.0 GA 版本的發(fā)布,MySQL 作為開(kāi)源界的數(shù)據(jù)庫(kù)一哥,地位早已無(wú)法撼動(dòng)。相信新版本將進(jìn)一步鞏固 MySQL 在數(shù)據(jù)庫(kù)領(lǐng)域的領(lǐng)先地位,為數(shù)據(jù)庫(kù)應(yīng)用帶來(lái)更多可能性。