
MySQL 9.2 正式发布!作为开源关系型数据库管理系统的最新版本,这次更新带来了不少改进和新功能,当然也有一些功能被弃用。接下来,我们一起来看看这些变化吧!
MySQL 9.2 新增或变更的功能
CREATE_SPATIAL_REFERENCE_SYSTEM 权限
在 MySQL 9.2.0 中,新增了一个名为CREATE_SPATIAL_REFERENCE_SYSTEM
的权限。拥有这个权限的用户可以执行以下操作:
CREATE SPATIAL REFERENCE SYSTEM
CREATE OR REPLACE SPATIAL REFERENCE SYSTEM
DROP SPATIAL REFERENCE SYSTEM
如果用户没有该权限(或者没有 SUPER 权限),在尝试执行上述语句时,会触发错误ER_CMD_NEED_SUPER_OR_CREATE_SPATIAL_REFERENCE_SYSTEM
。需要注意的是,针对这些操作,使用 SUPER 权限的方式已经被弃用了。
JavaScript 库支持:更灵活的代码复用
MySQL 9.2.0 为 MLE(MySQL Language Extensions)组件带来了一个重磅更新:支持可重用的 JavaScript 库!这意味着,你可以在其他存储程序中直接调用这些库中的函数,大大提升了代码的复用性和开发效率。
库的创建与管理
- 新增了
CREATE LIBRARY
和DROP LIBRARY
语句,用于创建和删除 JavaScript 库。 - 在创建库时,MySQL 会自动解析并检查 JavaScript 代码的有效性。如果代码有错误
CREATE LIBRARY
会直接失败,确保库的可靠性。
函数调用与别名
- 在其他 JavaScript 存储程序中,可以通过
library_name.function_name
的格式调用库中的函数。 - 使用
CREATE FUNCTION
或CREATE PROCEDURE
时,新增的USING
子句允许为库设置别名,进一步简化调用流程。
查看库信息
- 新增的
SHOW CREATE LIBRARY
语句,可以方便地查看现有 JavaScript 库的代码。 - 还引入了两张 Information Schema 表:
LIBRARIES
:列出所有 JavaScript 库的详细信息。ROUTINE_LIBRARIES
:展示使用了 JavaScript 库的存储例程信息。
状态变量统计
- 通过以下状态变量,可以实时监控 JavaScript 库的操作情况:
Com_create_library
:统计CREATE LIBRARY
的执行次数。Com_drop_library
:统计DROP LIBRARY
的执行次数。Com_show_create_library
:统计SHOW CREATE LIBRARY
的执行次数。
使用场景
这项功能非常适合需要频繁复用 JavaScript 代码的场景,比如复杂的数据处理逻辑或通用的工具函数。通过将代码封装到库中,不仅减少了重复代码,还能让存储程序更加简洁和易于维护。
JavaScript 中的 SQL 存储例程和会话变量 API
MySQL 9.2.0 为 MLE 组件带来了更多灵活性,现在你可以在 JavaScript 例程中直接调用用户定义的函数、存储过程以及会话变量了!这让 JavaScript 与 MySQL 的集成更加无缝,开发效率也大大提升。
调用存储函数和存储过程
在 JavaScript 中,可以通过Schema
对象的以下方法访问 MySQL 的存储函数和存储过程:
getFunction()
:用于获取存储函数。getProcedure()
:用于获取存储过程。
这两个方法都会返回一个Function
对象,可以直接调用并传递参数:
- 对于存储函数的参数或存储过程的
IN
参数,直接传递即可。 - 对于
OUT
或INOUT
参数,需要使用mysql.arg()
创建一个占位符(Argument
对象)。
访问会话变量
通过 JavaScript 的全局Session
对象,可以直接访问 MySQL 的用户变量。这些变量以属性的形式呈现,操作起来非常直观。具体的用法可以参考「从 JavaScript 访问会话变量」部分的示例。
内置函数的直接调用
MySQL 9.2.0 还新增了对以下内置函数的直接访问支持,这些函数都可以通过全局Mysql
对象的方法调用:
rand()
:对应 MySQL 的RAND()
函数。sleep()
:对应 MySQL 的SLEEP()
函数。uuid()
:对应 MySQL 的UUID()
函数。isUUID()
:对应 MySQL 的IS_UUID()
函数。
使用场景
这些功能非常适合需要在 JavaScript 中直接操作数据库的场景,比如:
- 在存储过程中调用 JavaScript 逻辑。
- 通过 JavaScript 动态访问和修改会话变量。
- 直接使用 MySQL 内置函数简化代码逻辑。
JavaScript 事务 API
MySQL 9.2.0 版本为 MLE 组件带来了一个全新的 JavaScript MySQL 事务 API。这个 API 支持大多数 MySQL 事务性 SQL 语句的功能,比如START TRANSACTION
、COMMIT
、ROLLBACK
以及SET AUTOCOMMIT
。不仅如此,它还支持事务保存点(savepoints)功能,让你在事务管理中更加灵活。
此外,这次更新还引入了一个全新的SqlError
对象,专门用于处理和标记 SQL 语句执行过程中可能出现的错误。这样一来,调试和错误处理变得更加直观和高效。
JavaScript ENUM 和 SET 支持
从 MySQL 9.2.0 开始,JavaScript 存储例程中的参数现在支持 MySQL 的 ENUM 和 SET 数据类型。这意味着你可以直接在 JavaScript 中使用这些数据类型,无论是作为参数传递还是进行处理,都变得更加方便和直观。这一改进为开发者提供了更多的灵活性和控制力,尤其是在处理复杂数据时。
EXPLAIN FORMAT=JSON 的版本信息
MySQL 9.2.0 为EXPLAIN FORMAT=JSON
引入了 JSON 格式版本信息的支持。当你将格式版本设置为 2 时,输出中会包含与版本相关的详细信息,帮助你更全面地了解查询的执行情况。
你可以通过以下命令设置格式版本:
SET explain_json_format_version=2;
设置完成后,执行EXPLAIN FORMAT=JSON
时,输出会显示类似以下的内容:
mysql> EXPLAIN FORMAT=JSON SELECT 1\G
*************************** 1. row ***************************
EXPLAIN: {
"query": "/* select#1 */ select 1 AS `1`",
"query_plan": {
"operation": "Rows fetched before execution",
"access_type": "rows_fetched_before_execution",
"estimated_rows": 1.0,
"estimated_total_cost": 0.0,
"estimated_first_row_cost": 0.0
},
"query_type": "select",
"json_schema_version": "2.0"
}
1 row in set (0.00 sec)
不过,如果将格式版本设置为 1(默认版本),输出中则不会显示版本信息,示例如下:
SET explain_json_format_version=1;
mysql> SET explain_json_format_version=1;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@explain_json_format_version;
+-------------------------------+
| @@explain_json_format_version |
+-------------------------------+
| 1 |
+-------------------------------+
1 row in set (0.00 sec)
mysql> EXPLAIN FORMAT=JSON SELECT 1\G
*************************** 1. row ***************************
EXPLAIN: {
"query_block": {
"select_id": 1,
"message": "No tables used"
}
}
1 row in set, 1 warning (0.00 sec)
通过调整格式版本,你可以灵活定制EXPLAIN FORMAT=JSON
的输出内容,从而更好地调试和分析查询性能。这一功能为开发者提供了更强大的工具,帮助优化数据库查询效率。
MySQL 9.2 中弃用的功能
在 MySQL 9.2 中,部分功能已被标记为弃用,并可能在未来的版本中被移除。如果你正在使用这些功能,建议尽快调整应用程序,采用替代方案以避免潜在问题。
需要注意的是,如果从 MySQL 9.2 主服务器复制数据到运行更高版本的副本服务器,使用这些弃用功能可能会导致语句执行失败,或者主副服务器之间的处理效果不一致。因此,及时更新应用程序,避免使用这些弃用功能,是确保系统稳定性的关键。
FLUSH PRIVILEGES 被弃用
从 MySQL 9.2.0 开始,FLUSH PRIVILEGES
语句已被标记为弃用。执行该语句时,系统会触发警告。预计在未来的 MySQL 版本中,这一功能将被彻底移除,因此建议尽早调整相关应用程序,避免依赖此语句。
与此同时,以下相关功能也在 MySQL 9.2.0 中被弃用:
FLUSH_PRIVILEGES
权限:授予此权限时会触发警告。mysqladmin flush-privileges
命令:执行该命令时会触发警告。mysqladmin reload
命令:执行该命令时会触发警告。
此外,以下功能虽然没有明确触发警告,但也应被视为弃用:
- 使用
SIGHUP
信号刷新权限。 - 通过
FLUSH PRIVILEGES
刷新caching_sha2
缓存。 - 使用
mysqladmin refresh
刷新权限。
版本令牌插件
从 MySQL 9.2.0 开始,版本令牌插件(Version Tokens plugin)已被标记为弃用,并可能在未来的版本中被移除。如果你尝试安装version_tokens
插件,或者启动包含该插件的服务器时,系统会触发弃用警告,提醒你这一功能即将被淘汰。
与此同时,以下与版本令牌插件相关的功能也被弃用,并在调用时触发警告:
被弃用的函数
version_tokens_delete()
version_tokens_edit()
version_tokens_lock_exclusive()
version_tokens_lock_shared()
version_tokens_set()
version_tokens_show()
version_tokens_unlock()
被弃用的权限
VERSION_TOKEN_ADMIN
权限
被弃用的系统变量
version_tokens_session
version_tokens_session_number
MySQL 9.2 中移除的功能
在 MySQL 9.2 版本中,一些功能已被彻底移除,原因是它们被标记为过时功能。如果你仍在使用这些功能,建议尽快更新应用程序,采用替代方案,以避免潜在问题。
对于从 MySQL 9.1 主服务器复制到 MySQL 9.2 副本的场景,如果应用程序依赖这些已移除的功能,可能会导致相关语句执行失败,或者主副服务器之间的结果不一致。因此,及时调整应用程序,停止使用这些被移除的功能,是确保系统稳定性的关键。
BINLOG 关键字的使用限制
从 MySQL 9.2 版本开始,BINLOG
被列为受限制的关键字。这意味着,如果你在存储例程或存储函数中直接使用BINLOG
作为标签而不加引号,代码将无法正常运行。因此,在升级到 MySQL 9.2 之前,务必检查并更新你的应用程序代码,确保BINLOG
关键字被正确使用。例如,可以通过加引号的方式来明确标识它,避免潜在的错误。
更多详细信息,请参考 MySQL 9.2 更新文档和变更文档。
最新评论
不知名软件:怪我咯!😏
在Win11下,第一次安装完后不要急着用,建议先重启一下。(我直接用的时候打开虚拟机报错了,重启后就正常了)
自动维护还是很重要的,我的就被不知名软件关闭了,导致系统时间落后正常时间15秒。用优化软件的一定要注意。
刷不到新版更新