账户管理
此版本新增了 "CREATE_SPATIAL_REFERENCE_SYSTEM" 权限,该权限允许用户执行 "CREATE SPATIAL REFERENCE SYSTEM|、"CREATE OR REPLACE SPATIAL REFERENCE SYSTEM" 以及 "DROP SPATIAL REFERENCE SYSTEM" 中的任何语句。因此,将SUPER 权限进行降级处理。
C API
当 “libmysqlclient” API 用户尝试缓存和重用预编译语句时,进程内存使用量会增加,即对语句进行一次预编译,然后多次调用 “mysql_stmt_bind_param ()” 或 “mysql_stmt_bind_named_param ()”,接着调用 mysql_stmt_execute (),但不调用相应的 “mysql_stmt_close ()”,或者在很久之后(例如应用程序退出时)才调用它。在此版本中,通过引入一个单独的“MEM_ROOT”对象来存储绑定参数数组来解决这个问题,该对象可以在每次调用 “mysql_stmt_bind_param ()” 或 “mysql_stmt_bind_named_param ()” 时被清除(释放内存)。
“OK_Packet” 的 Doxygen 注释未涵盖所有可能的情况,此版本现已更新,使其现在能准确反映服务器实际发送的数据。
字符集支持
当从一个客户端字符集设置为 “latin1”连接到视图中执行“Select”时,结果为零行(预期为一行),而如果查询使用 “utf8” 作为其连接和客户端字符集时,该视图包含带有非 ASCII 字符的文本值,并且该查询会将条件下推到视图的查询块的 “UNION” 中。
这个问题与之前解决一个类似问题的问题有关,该问题是在将视图中包含的条件下推到内部查询块时,正确考虑了视图定义的字符集,但当时实现的修复未考虑到视图可能包含非 ASCII 字符的可能性。
这意味着要下推的条件被写入了具有错误字符集的文本字符串。此版本通过确保使用正确的字符集来纠正这个疏忽。
编译说明
macOS:在使用 Xcode 编译时,使用 OBJECT 库代替 “routing_guidelines”。
从 MacOS 构建中移除了过时的 CMake 代码。
现在可以使用 “Homebrew” 版本的 Clang 来构建 MySQL。
移除了表单ld: “warning: ignoring duplicate libraries”和特定于 xcodebuild 的警告。
Microsoft Windows:Windows 构建现在使用 - DWITH_ASAN 进行配置。
在 “cmake/msvc_cppcheck.cmake” 中禁用了 Windows 编译警告 C26445 和 C26821。这两个警告都与 MSVC 将 “gsl::span” 替换为 “std::span” 有关,而 MySQL 不使用 “std::span”。
移除了使用 Visual Studio 2022 构建 MySQL 时发出的编译器警告。
CMake 选项 “- DWITH_SASL” 不支持在 Windows 上构建 MySQL。尝试使用该选项时,构建将因错误而终止。
Solaris:在 Solaris 上构建 MySQL 所需的 GCC 最低版本已提高到 11.4。
从 CMake 3.26 开始,CMake 会编写文件 “CMakeFiles/CMakeConfigureLog.yaml”,它取代了 “CMakeError.log”,因此已移除对 “CMakeError.log” 的引用。
实现了符合标准的 “my_char_traits<unsigned char>”,作为 “std::char_traits<unsigned char>”的替代,“std::char_traits<unsigned char>”在 Clang 18 中已弃用,在 Clang 19 中已移除。
“mysys/” 使用的文件 “stream_ciperh.h” 和 “stream_cipher.cc” 位于 “sql/” 中,但不依赖于此目录中的任何其他服务器代码,现在这些文件已移到 “mysys/” 中。
移除或修复了一些版权头文件中的问题。
移除了使用 GCC 14 构建 MySQL 时在 “sql/item.cc” 中发现的一个可能未初始化的错误。
禁用了几个在编译 MySQL 时产生不必要警告的 “clang-tidy” 检查。
构建 “component_mle” 的 CMake 代码假设 GraalVM 二进制文件存在于 “/usr/global/share” ,或在命令行提供的位置。现在,当这两个条件都不满足时,可以从远程服务器下载 GraalVM。
用于编译 MySQL 的 “libedit” 版本已升级到 20240808-3.1。
使用 Clang 13 无法在 Ubuntu 22.04 上构建服务器。
移除了使用 XCode 16 编译 MySQL 时在 “mysql_prepare_create_table ()”(在文件 ”sql/sql_table.cc“ 中)发现的一个错误。
当使用 “-FTLS-MODEL=initial-exec” 构建 MySQL 时,一些插件无法加载。通过移除该编译器标志并回退到默认(“global-dynamic”)来修复。
无法使用 Clang 19 编译 MySQL。
文件 “plugin/group_replication/libmysqlgcs/src/bindings/xcom/xcom/task.cc” 中引用了 “std::chrono::duration_cast ()”,但该文件中缺少 “#include <chrono>”。
由于 TIRPC 的问题,使用 cmake 3.11 无法在 Fedora 40(可能还有其他 Linux 平台)上构建服务器。
组件
对于 MLE 组件,“mysql_option.option_usage” 表的 “USAGE_DATA” 列将使用的值显示为字符串,而非布尔值。
“mysql_option.option_usage” 表中的条目取决于选项跟踪器是在审计日志之前还是之后安装。
在一个会话中安装选项跟踪器组件,而在另一个会话中执行 “UNINSTALL COMPONENT”,会导致服务器挂起。
密钥环组件配置文件中的错误没有正确记录。
与使用子查询的 “SET PERSIST” 同时执行 “INSTALL COMPONENT”,有时可能导致服务器意外退出。
配置
Microsoft Windows:在 Windows 上,MySQL 配置器不再执行已弃用的 “FLUSH PRIVILEGES” 语句。
弃用与移除
“FLUSH PRIVILEGES” 语句现已弃用,执行时会发出警告。预计在未来的 MySQL 版本中该语句将被移除。
以下相关也已弃用,使用时会发出警告:
“FLUSH_PRIVILEGES” 权限,以及授予此权限的操作
“mysqladmin flush - privileges” 命令
“mysqladmin reload” 命令
此处列出的功能虽不会引发任何警告,但也应视为已弃用:
通过 “SIGHUP” 信号刷新权限
使用 “FLUSH PRIVILEGES” 刷新 “caching_sha2” 缓存
使用 “mysqladmin refresh” 刷新权限
“Version Tokens” 插件现已弃用,预计在未来的 MySQL 版本中会被移除。以下相关功能同样已弃用,调用时会发出弃用警告:
“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” 服务器系统变量
尝试安装 “version_tokens” 插件,或在安装此插件的情况下启动服务器,也会发出弃用警告。
Doxygen 注释说明
在 MySQL 数据包示例之一中,“COM_QUERY” 数据包的有效载荷长度计算有误。现在,有效载荷长度将根据查询的实际长度准确计算。
感谢 Konno Satoshi 的贡献。
防火墙
在某些情况下,执行升级后,与 MySQL 企业防火墙相关的存储过程未得到正确处理。
INFORMATION_SCHEMA
修复了 “PROCESSLIST” 表中的一个性能问题。
安装
从 MySQL 5.7 升级到更高版本的 MySQL 系列时,系统创建的 “mysql.sys” 和 “mysql.session” 账户现在将修改为使用 “caching_sha2_password” 身份验证插件,而不是 “mysql_native_password” 插件。
MySQL 企业版
复制:用于复制应用程序指标表的处理程序接口的 “rnd_pos ()” 函数实现有误,在使用该函数的情况下,这些表少了一行数据。
复制:对于大多数等待操作,MySQL会记录等待开始时间和结束时间,并将两者的差值累加到总等待时间中。但在跟踪等待提交顺序所花费的时间时并非如此,当时MySQL使用了一个每秒唤醒一次的函数,导致等待时间每次增加 1 秒。对于大多数实际应用场景来说,这种 1 秒的精度太低,还导致代码不必要的复杂化。为解决这些问题,MySQL现在对等待提交顺序的时间跟踪方式与其他等待操作的跟踪方式保持一致。
优化器
JSON:为基于迭代器的“EXPLAIN FORMAT=JSON”添加了索引查找的查找引用。JSON v2 格式的EXPLAIN中的“lookup_references”字段与 JSON v1 格式的EXPLAIN中的“ref”字段相对应。
一些哈希连接在“pack_rows::RequestRowId()”中花费了过高的时间,尽管它们并未使用行 ID。通过在“RequestRowId()中,当不存在可请求行 ID 的表时,跳过”TableCollection::tables()“的循环来解决此问题。
EXPLAIN FORMAT=TREE现在会显示针对行 ID 有序检索(ROR)交集计划的聚簇主键扫描。
在 WHERE 子句中有聚合函数的情况下,错误地将聚合函数下推求值,而实际上不应如此。
Performance Schema
如果非 “root” 用户运行 “START REPLICA”,“PERFORMANCE_SCHEMA”的 “PROCESSLIST” 表会将该用户的名称分配给新产生的前台复制线程,而非系统用户。从此版本起,系统用户会被分配给所有前台系统线程。
“PERFORMANCE_SCHEMA”的 “PROCESSLIST” 表会过滤掉没有用户名的前台线程。从此版本起,没有用户名的前台线程会被分配系统用户。
在某些情况下,元数据锁可以升级或降级为不同的 “LOCK_TYPE”。这一变化未在“PERFORMANCE_SCHEMA”的 “METADATA_LOCKS” 表中体现。
感谢 George Ma 和阿里巴巴团队的贡献。
可插拔身份验证
以下与 “AUTHENTICATION_POLICY_ADMIN” 权限相关的问题现已解决:
对于拥有该权限的用户,无法创建省略默认身份验证插件的用户,因为无论是否指定,在创建用户时都会包含 “authentication_policy” 全局值中指定的默认设置。MySQL通过在执行账户创建的用户拥有 “AUTHENTICATION_POLICY_ADMIN” 权限时忽略全局身份验证策略来解决此问题。
对于没有该权限的用户,尝试在不指定任何身份验证因素的情况下创建用户会因错误而被拒绝,因为在未指定时,默认全局身份验证策略中的强制因素不会被包含在内。MySQL通过在执行账户创建的用户没有 “AUTHENTICATION_POLICY_ADMIN” 权限时,包含全局身份验证策略中的任何强制因素来解决此问题。
“authentication_openid_connect” 插件现在已在选项跟踪器组件中注册。
SQL 语法
重要更改:在 MySQL 存储程序中,“BINLOG” 关键字不能再作为未加引号的标签名称使用。在升级到此版本之前,您应相应地更新任何受影响的应用程序。
新增或变更的功能
Microsoft Windows:在 Windows 系统上,MySQL 配置器新增了命令行界面(CLI),可用于配置、重新配置、移除或升级 MySQL 服务器安装。
包含 curl(而非链接到系统 curl 库)的二进制软件包已升级,开始使用 curl 8.11.1。
新增了一款源代码静态分析工具。使用详情请参阅源代码中的 “scripts/static_analysis.md”,或执行 “python3./scripts/static_analysis.py --help” 获取更多帮助。该工具可用于检查单个提交或整个源代码存储库。
对代码进行重构,以利用 “OpenSSL 3.x” 的功能,提升加密操作的性能。
已修复的错误
不兼容的更改:当对最小边界矩形(MBR)进行微小更改的几何图形更新后接着执行删除操作时,空间索引会出现损坏。
在升级到此版本时,建议用户事先删除空间索引,然后在升级完成后重新创建它们。或者,用户可以在升级之后,但在使用包含这些索引的任何表之前立即删除并重新创建它们。用户还应该知道,降级到任何先前的版本会重新引入之前描述的原始问题。
InnoDB:某些 I/O 缓冲区序列化操作会在调试构建中触发断言,导致系统挂起。(错误编号 #37139618)
InnoDB:在具有大于 4294967295 的 “FTS_DOC_ID” 值的表上创建 “FULLTEXT” 索引时会引发断言失败。(错误编号 #36879147)
InnoDB:改进了 “can_older_trx_be_still_active ()”,使其不再使用 “trx_sys->rw_trx_list”。(错误编号 #36729529)
InnoDB:先删除主键,然后使用 “INPLACE” 算法以降序添加新的 “AUTO_INCREMENT” 列作为主键会失败。
感谢 Shaohua Wang 和阿里巴巴团队对此修复的贡献。(错误编号 #36658450)
InnoDB:修复了 “mysqladmin” 客户端中的内存泄漏问题。(错误编号 #36537941)
InnoDB:扩展用户表空间会生成文件扩展重做日志记录(“MLOG_FILE_EXTEND”),但在扩展系统表空间时不会生成。现在会生成,因为在系统表空间中创建表或更改缓冲区索引较大时会扩展系统表空间。现在在这些情况下恢复可以成功。(错误编号 #36511673)
InnoDB:在 Windows 上,修复了导致文件访问变慢的双写缓冲区回退问题,并重构了打开文件时 “FILE_FLAG_OVERLAPPED” 标志的使用。(错误编号 #36259487)
InnoDB:移除了处理过时重做日志格式的代码。(错误编号 #35020216)
InnoDB:重做日志插入的公共前缀压缩(“MLOG_REC_INSERT”)曾被禁用,但在版本匹配时现在已启用。(错误编号 #34946626)
参考:此问题是以下问题的回退:错误编号 #13899。
InnoDB:使用包含辅助索引的生成列进行 “ON DELETE CASCADE” 操作有时会失败,因为在删除之前虚拟列模板未初始化。
感谢 Rahul Malik 的贡献。(错误编号 #33691659)
InnoDB:在为子表构建更新节点时,更新操作试图更新一个虚拟列,但不应该这样做,因为外键约束不能引用虚拟列。(错误编号 #33327093)
InnoDB:如果二进制日志记录被禁用,在服务器崩溃后全文搜索查询可能会不正确。
感谢 Yin Peng 和腾讯团队的贡献。(错误编号 #116212,错误编号 #37095383)
InnoDB:移除了 dd_set_autoinc () 方法的重复声明。(错误编号 #116175,错误编号 #37089340)
InnoDB:CPU 使用统计未考虑超过 128 的处理器数量,这可能会降低这些较大系统的性能。(错误编号 #115399,错误编号 #36765223)
InnoDB:具有降序主键和 index_merge 优化的查询有时会产生错误结果,例如丢失行。(错误编号 #106207,错误编号 #33767814)
复制:在 InnoDB ClusterSet 配置中,当集群中的所有节点上的自动提交都设置为关闭时,使用 MySQL Shell 进行的受控切换会因错误 1105(未知错误)而被拒绝。为解决此问题,现在每当 “autocommit = OFF” 时,MySQL会在 “channel_change_source_connection_auto_failover ()” 中强制开启一个新事务,以防止在更改 “SOURCE_CONNECTION_AUTO_FAILOVER” 后执行信息存储库事务时出现表访问死锁。(错误编号 #37173907)
复制:当正在接收和应用大事务,并且使用 “STOP REPLICA” 发出停止复制通道的请求时,MySQL 未能正确执行,随后也不会处理任何通道命令。此外,服务器关闭过程未能正常完成,需要终止 MySQL 进程或重新启动主机系统。(错误编号 #115966,错误编号 #37008345)
复制:当副本重新连接到源时(例如,通过先发出 “STOP REPLICA” 再发出 “START REPLICA” 来停止和重新启动它)所写的日志消息 “为具有 UUID 的副本初始化转储线程时,发现具有相同 UUID 的僵尸转储线程。源正在杀死僵尸转储线程(thread_id)”已改进为 “在与副本重新连接时,为 UUID 初始化转储线程时,检测到具有相同 UUID 的现有转储线程。源正在终止先前的转储线程(thread_id),这是正常且预期的”。(错误编号 #84358,错误编号 #25330090)
组复制:移除了内部函数“cs::apply::Commit_order_queue::front ()” 和 “cs::apply::Commit_order_queue::remove ()” 之间的潜在竞争条件。(错误编号 #37223451)
组复制:当主节点意外离开组并迅速尝试重新加入时,被选出来移除其他故障节点的成员试图驱逐或移除故障节点,但由于缺乏多数节点而无法做到。当被驱逐或移除的节点是主节点时,这会使集群没有主节点,从而导致不可用状态。(错误编号 #36991859)参考:另请参阅:错误编号 #37181867。
组复制:在某些情况下,添加新的从节点会导致现有的从节点出现延迟,从而导致死锁,在主节点重新启动之前无法再进行任何写入操作。
这种死锁发生在票务管理器和入站复制通道上的提交顺序管理器之间,票务管理器确保事务在视图更改的正确一侧(视图更改之前或之后)提交,而提交顺序管理器确保事务按接收顺序提交,当这两个管理器要求不同的顺序时就会出现此问题。这意味着,在某些情况下,添加新的从节点会导致组主节点无法进行写入操作。
MySQL通过在发生这种死锁时忽略提交顺序管理器的顺序,并对无冲突的事务强制执行票务管理器的顺序来解决此问题。这样做的一个结果是,在视图更改日志事件附近,“replica_preserve_commit_order” 可能不会严格遵循。换句话说,“replica_preserve_commit_order” 不再对组复制主节点上的入站通道提供严格保证。“replica_preserve_commit_order” 仍然确保事务正确排序,唯一的例外是视图更改日志事件周围的无冲突事务。(错误编号 #35206392)参考:另请参阅:错误编号 #37223451。
组复制:通过消除对“is_subset_not_equals ()” 的非必要调用,改进了组复制中的垃圾回收。(错误编号 #110673,错误编号 #35286974)
组复制:从一个所有成员都运行相同版本 MySQL 的组中移除一个组成员,将其升级到更高版本(来自更高的发行版系列),然后请求它重新加入组时,会导致升级后的组成员卡在恢复状态。
某些嵌套的 “SELECT” 语句在临时表上产生 “ER_DUP_KEY” 错误。(错误编号 #37309915)参考:此问题是以下问题的回退:错误编号 #115597,错误编号 #36846564。
一个包含不使用任何表且具有非零 “OFFSET” 子句的子查询的查询未返回正确结果。例如,“SELECT (SELECT 1 LIMIT 1 OFFSET 10)” 返回 1,而不是预期的 NULL。(错误编号 #37293822)
错误 “ER_DD_UPDATE_DATADIR_FLAG_FAIL”、“ER_IB_MSG_FIL_STATE_MOVED_PREV_OR_HAS_DATADIR”、“ER_RPL_KILL_OLD_DUMP_THREAD_ENCOUNTERED” 和 “ER_RPL_MTA_ALLOW_COMMIT_OUT_OF_ORDER” 最初在 MySQL 8.0 中定义,但随后在 MySQL 8.4 中被分配了不同的错误代码编号(但名称相同)。MySQL 8.0 中分配的编号现在仅适用于 MySQL 8.0;在 MySQL 8.4 及更高的发行版系列中,仅使用 MySQL 8.4 中分配的编号。(错误编号 #37284176)
在 “mle::validate ()” 和 “validate_session_options ()” 中添加了对 NULL 输入参数的缺失检查。(错误编号 #37267887)
对于哈希连接,即使在哈希连接无法完全在内存中执行并随后溢出到磁盘的情况下,时间和资源也会花费在从未使用的 “HashJoinChunk” 对象的不必要的构建和销毁上。(错误编号 #37235166)
在升级期间向 sys 模式添加事件会导致服务器意外关闭。(错误编号 #37162611)
在 “sql/item_cmpfunc.cc” 中,“Item_bool_func2::resolve_type ()” 对 “Item_bool_func::resolve_type ()” 进行了未检查的调用;对 “Item_bool_func::resolve_type ()” 的调用忽略了其返回值,即使发生错误,执行也会继续。(错误编号 #37143289)
当评估诸如 “value BETWEEN 'a' AND 'b'” 这样的表达式时,服务器现在会检查字符串字面量,并确保它们使用与要与之比较的值相同的字符集和排序规则。(错误编号 #37086818)
移除了在 “option_tracker/udfs.cc” 中发现的内存泄漏。(错误编号 #37075241)
AppArmor 拒绝访问 “/proc/thread_id/mem”,这是生成堆栈跟踪所需的文件。(错误编号 #37063288)参考:另请参阅:错误编号 #37387034。
在 “sql/sql_resolver.cc” 的 “WalkAndReplace ()” 中添加了对空指针的缺失检查。(错误编号 #36987582)参考:此问题是以下问题的回退:错误编号 #112557,错误编号 #35855294。
MySQL 允许在窗口 “PARTITION BY” 和 “ORDER BY” 表达式中使用外部引用,这不符合 SQL 标准。(错误编号 #36921175)
当查询使用 “index_subquery” 连接类型执行子查询,且子查询表在执行计划中使用实例化时,子查询中的过滤条件有时会被忽略。派生表访问路径取代了过滤条件,导致最终计划中没有过滤层。为解决此问题,在这种情况下,MySQL现在将派生表访问路径与过滤访问路径一起添加,而不是取代后者。(错误编号 #36918913)
某些标量子查询到派生表的转换并不总是正确执行。(错误编号 #36902116)
一些类似于 “a UNION b UNION c...” 的 UNION 操作消耗过多内存。为避免这种情况,MySQL现在在上下文处理之前的解析级别将相等的集合操作扁平化,这将减少此类操作的资源使用。(错误编号 #36652610)
改进了内部函数 “my_print_help ()”。(错误编号 #36615714)
参考:另请参阅:错误编号 #37387224。
从 Acl_cache 中移除了错误代码。(错误编号 #36608160)
包含作为行值比较器一部分的带有“ ROLLUP” 的聚合函数的子查询并不总是能正确处理。(错误编号 #36593235)参考:另请参阅:错误编号 #37387180。此问题是以下问题的回退:错误编号 #30969045,错误编号 #30921780,错误编号 #26227613,错误编号 #29134467,错误编号 #30967158。
在持久化变量时引发的错误可能无法正确报告。(错误编号 #36574732)
一些使用 “WITH ROLLUP” 的子查询并不总是能正确处理。(错误编号 #36421704)
MyISAM 块长度的计算并不总是正确执行。(错误编号 #36347992)
移除了一个潜在的竞争条件。(错误编号 #35981769)参考:另请参阅:错误编号 #36608160。
“mysqldump” 的 “--column-statistics” 选项现在默认禁用。(错误编号 #35209008)
修复了一个与全文搜索(FTS)和并发 DDL 或 DML 相关的问题。(错误编号 #34633727)
如果存在同名的表,“DROP VIEW name” 会因 “ER_BAD_TABLE_ERROR” 而被拒绝。(错误编号 #33200087)
现在,当 “explain_json_format_version” 设置为 2 时,“EXPLAIN FORMAT=JSON” 的输出以主版本号。此版本号的格式包含 JSON 模式版本;在 MySQL 9.2 中始终显示为 2.0。当 “explain_json_format_version = 1” 时,“EXPLAIN FORMAT=JSON” 的输出不包含任何格式版本信息,在这方面与以前的版本相同。(错误编号 #116915,错误编号 #37372130)
参考:另请参阅:错误编号 #35239659。
当传递 “--ssl-mode=disable” 选项时,mysqlslap 实用程序不会禁用 SSL。(错误编号 #116844,错误编号 #37353662)
当对 “YEAR” 列和 “BOOL"(TINYINT)列进行 "UNION" 操作时,由于内部 "field_types_merge_rules" 数组的一个缺陷,结果的数据类型是 "TINYINT"。MySQL通过在这种情况下将结果数据类型调整为 ”SMALLINT“ 来解决此问题。(错误编号 #116415,错误编号 #37192491)
当哈希表不适合连接缓冲区并溢出到磁盘时,一些使用哈希反连接的查询会返回错误结果。(触发该问题的查询实际上指定了 ”LEFT JOIN“,但在内部从左外连接转换为反连接。)
问题在于将探测行写入块文件时跳过了探测表中的一些行,被跳过的行是连接键中部分为 NULL 的那些行。对于内连接和半连接,可以跳过这样的行,因为已知它们在构建表中没有匹配项,但对于外连接和反连接,探测表中在构建表中没有匹配行的行应该是连接结果的一部分,所以它们必须包含在块文件中。
MySQL已经为外连接在块文件中保留了这些行。此修复扩展了用于此目的的逻辑,使其也适用于反连接。(错误编号 #116334,错误编号 #37161583)
当服务器 “sql_mode”“ 包含 “ANSI_QUOTES” 时,“SHOW GRANTS” 会用反引号(`)将存储函数和存储过程名称括起来,而对其他对象的名称使用双引号(")。现在在这种情况下总是使用双引号。(错误编号 #115953,错误编号 #37003502)
以 BIT 值作为参数的窗口函数未返回 BIT。(错误编号 #115597,错误编号 #36846564)
如果指定了 “--auto-generate-sql-execute-number” 和 “--concurrency” 但未指定 “--auto-generate-sql” 或“--query,mysqlslap” 实用程序将无响应。(错误编号 #113215,错误编号 #36048754)
在 MySQL 8.0 及更高版本中,形式为 “SELECT DISTINCT... FROM t1 WHERE NOT IN (SELECT...)” 的查询如果可能会被转换为反连接,导致优化器不会为表 t1 选择组跳过扫描,而在 MySQL 5.7 中会选择组跳过扫描。这会导致此类查询的性能下降。不会选择组跳过扫描,因为在反连接转换后,查询不再是单表查询,并且此访问方法仅对单表查询启用。对于转换为半连接的查询也可以看到相同的行为。在这种情况下,只要查询中不包含聚合函数,只要原始查询中只有一个表,无论内部转换后存在多少个半连接表,仍然可以使用组跳过扫描访问方法。(错误编号 #112632,错误编号 #35842414)
mysql 客户端不允许在优化器提示注释中使用 '#' 或 '--'。
感谢 Kaiwang Chen 的贡献。(错误编号 #98521,错误编号 #30875669)
mysqldump 的 “--compact” 选项现在禁用 “--tz-utc”。
以前,在启用 “--tz-utc”(默认启用)时,“--compact” 会在读取数据之前执行 “SET TIME_ZONE='+00:00'”,但不会将此语句写入转储文件。这会导致不一致,因为数据是使用 UTC 提取的,但转储文件的读取者不知道数据使用了该时区。(错误编号 #58491,错误编号 #11765514)
在比较 “VECTOR” 列的内部表示时,未考虑它们的长度属性。
MySQL Router 9.2.0 的变更
已修复的漏洞
重要变更:MySQL Router 不再支持更新系列的 MySQL 服务器版本。在引导过程以及定期元数据刷新操作期间,会对服务器元数据进行检查,若服务器来自更新系列,则会丢弃相关元数据。但同一系列的较新版本仍受支持。例如,MySQL Router 8.4.4 支持 MySQL Server 8.4.5,但不支持 MySQL Server 9.0.0。(错误编号 #36041256)
由于使用 “CMAKE_BUILD_TYPE=Debug” 进行构建会禁用优化,“std::vector.resize ()” 在每次从加密套接字读取之前,都会尝试初始化每个字节。针对此情况,对内存使用进行了优化。(错误编号 #37385923)
通过路由器进行查询基准测试的同时,访问 “/routes/{name}/connections” REST API 端点,可能会导致路由器意外停止运行。(错误编号 #37251508)
在以下场景中,“OpenID Connect” 身份验证会停止对连接起作用:默认身份验证插件设置为 “openid_connect”,启用了 MySQL Router 连接池,且连接已在池中准备好可重复使用。(错误编号 #37190332)
当 “stats_updates_frequency” 设置为意外值时,MySQL Router 在每次元数据刷新时都会记录一条警告,从而堵塞日志。现在,除非该值发生变化,否则只会记录一次警告。(错误编号 #116951,错误编号 #37391164)
MySQL Shell 9.2.0 的变更
AdminAPI 已修复的错误
如果复制处于空闲状态,“ReplicaSet.status ()” 的 “replicationLag” 会返回 null。
在本版本中,进行了以下更改:
如果复制连接或 SQL 线程未运行,“replicationLag” 会被设置为 null。当最后一个排队的事务与最后一个已应用的事务相匹配,或者正在应用的事务计数为 0 时,“replicationLag” 会被设置为 “applier_queue_applied。(错误编号 #35914505)
如果一个成员处于 ”ERROR“ 状态,使用启用了 ”force“ 选项的 ”ReplicaSet.removeInstance ()“ 无法将其从 ReplicaSet 中移除。(错误编号 #35282392)
将元数据模式升级到 2.2.0 版本时,ReplicaSet 元数据模式表 ”INSTANCES“ 未正确填充。结果,MySQL Router 无法识别拓扑结构并拒绝与之建立连接。(错误编号 #116231,错误编号 #37101286)
本版本引入了路由指南(Routing Guidelines),这是一个灵活统一的配置接口,使用户能够自定义路由行为。路由指南被定义为存储在元数据模式中的 JSON 文档。
路由指南文档对拓扑结构中的所有目标进行分类,并允许你定义关于何种类型的连接去往拓扑结构中的哪个成员的严格规则。
在 AdminAPI 中添加了一个新类 “RoutingGuideline”。请参阅 MySQL Shell JavaScript API 或 MySQL Shell Python API 的 AdminAPI 部分。
在 Cluster、ClusterSet 和 ReplicaSet 类中添加了以下方法:
“create_routing_guideline (name [, json [, options]])”
“get_routing_guideline ([name])”
“routing_guidelines ()”
“remove_routing_guideline (name)”
“import_routing_guideline (file, [options])”
以下方法已更新:
“set_routing_option ()”
“routing_options ()”
“router_options ()”
“list_routers ()”
(工作项编号 #14022,工作项编号 #14023)
实用工具新增或更改的功能
在本版本中,MySQL Shell 不再支持实例元数据服务(“Instance Metadata Service,IMDS)v1”。(错误编号 #37380810)
在 “ocimds:true” 的转储和加载操作中,会排除模式 “MYSQL_AUTOPILOT”。(错误编号 #37278169)
在本版本中,升级检查器实用工具会将所有兼容性问题和修复信息写入日志文件,而不是仅写入控制台。(错误编号 #37154456)
“util.checkForServerUpgrade” 检查中的 “routineSyntax” 已重命名为 “syntax”,现在会使用目标服务器的 SQL 版本进行语法检查。
请参阅实用工具检查。(错误编号 #36589651,错误编号 #35640118,工作项编号 #16236)
现在可以使用以下新实用工具转储和加载二进制日志:
“util.dumpBinlogs (outputUrl, {options})”:将自特定时间点以来生成的二进制日志转储到指定的本地或远程目录。
“util.loadBinlogs (outputUrl, {options})”:从本地或远程目录加载由 MySQL Shell 创建的二进制日志转储。
请参阅 MySQL Shell 实用工具。(工作项编号 #15977)
实用工具已修复的错误
如果启用了 “convertBsonTypes”,在导入负的 BSON 值时,JSON 导入实用工具会失败。
会返回类似以下的错误:
“ValueError: Unexpected data, expected to find an integer string processing extended JSON for $numberInt at offset 25”
(错误编号 #37243264)
Amazon RDS 在 8.0.36 中进行了以下更改:
不再可以授予 “BACKUP_ADMIN” 权限。
不再可以锁定 MySQL 系统表。
结果,无法从 Amazon RDS 进行一致的转储。
在本版本中,如果锁定 MySQL 系统表时因访问被拒错误而失败,会打印一条警告,并且转储会继续。
此外,对于非 Amazon RDS 实例,如果用户具有 “BACKUP_ADMIN” 权限且 “LOCK INSTANCE FOR BACKUP” 成功,MySQL 系统表不会被锁定。(错误编号 #37226153)
在某些情况下,例如大量数据分块时,由于转储开始和数据转储开始之间的间隙,“maxRate” 转储选项无法正确限制吞吐量。在本版本中,仅在转储数据时使用 “maxRate”。(错误编号 #37216767)
在没有执行 “FLUSH TABLES WITH READ LOCK” 权限的账户下运行一致性转储时,MySQL Shell 可能会挂起。
在本版本中,仅当查询事件包含数据时才会对其进行检查,并且 “GRANT” 和 “REVOKE” 语句被标记为不安全。(错误编号 #37158908)
升级检查器实用工具对 Cluster 元数据模式中表上定义的外键会误报。(错误编号 #36975599)
如果通过 X 协议连接运行 “importTable” 实用工具,会产生以下错误:
“Util.importTable: A classic protocol session is required to perform
this operation. (RuntimeError)”
在此版本中,与其他转储、导出、加载和复制实用工具类似,“importTable” 会为该操作创建一个经典连接。(错误编号 #34582616)
新增或更改的功能
在此版本中,Google V8 JavaScript 引擎被 Oracle GraalVM 取代。(错误编号 #34370637)
在本版本中,“history.autoSave” 的默认值更改为“true”,默认启用命令历史记录。(错误编号 #31746532)
已修复的错误
如果 Windows 账户名包含非 ASCII 字符,MySQL Shell 无法加载 Python 插件,因为文件路径未正确编码。会返回 “没有此文件或目录” 错误。(错误编号 #37105233)
在某些情况下,Ctrl + c 组合键可能导致死锁。(错误编号 #35998250)
以上内容是关于MySQL服务器,MySQL Router及MySQL Shell9.2的新功能和改进。
整理作者介绍
徐轶韬,MySQL解决方案首席工程师。为中国金融、政府、航空运输等行业的MySQL用户提供相关产品的售前咨询,企业级产品介绍服务以及推广和普及MySQL数据库在社区的使用。公众号“MySQL解决方案工程师”运营者和内容作者。
如果字段的最大可能长度超过255字节,那么长度值可能…
只能说作者太用心了,优秀
感谢详解
一般干个7-8年(即30岁左右),能做到年入40w-50w;有…
230721