系统极客一直在努力
专注操作系统及软件使用技能

MySQL 9.2:新功能、弃用和重要更新

MySQL

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 LIBRARYDROP LIBRARY语句,用于创建和删除 JavaScript 库。
  • 在创建库时,MySQL 会自动解析并检查 JavaScript 代码的有效性。如果代码有错误CREATE LIBRARY会直接失败,确保库的可靠性。

函数调用与别名

  • 在其他 JavaScript 存储程序中,可以通过library_name.function_name的格式调用库中的函数。
  • 使用CREATE FUNCTIONCREATE 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参数,直接传递即可。
  • 对于OUTINOUT参数,需要使用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 TRANSACTIONCOMMITROLLBACK以及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 更新文档变更文档

赞(0)

评论 抢沙发