MySQL 9.0.0 变更(2024-07-01,创新版本)
审核日志说明
MySQL现在使用有效的插件结构作为参数进行调用
plugin->deinit(),而不管插件的类型如何。我们感谢 Martin Alderete 的贡献。
C API 说明
C API 应用程序在接收服务器端预准备语句的结果时停止。
字符集支持
解析对
REPLACE()函数的调用时,将从第一个参数复制函数结果的字符集和排序规则。其余两个参数(如果它们是文本值)应转换为此字符集,但仅转换了第二个参数。此修复可确保第三个参数也转换为第一个参数的字符集和排序规则。(错误 #114769、错误 #36562972)
内部函数
my_instr_mb()在几个地方错误地假设输入字符串的字节长度可用于缩短某些决策。对于多字节字符集和排序规则,无法执行此操作,因为在某些排序规则下,具有不同字节长度的字符可以被视为相等。此外,Item_func_locate()使用了不正确的字节长度。我们感谢 Dirkjan Bussink 的贡献。(错误 #113933、错误 #36277823)
内部函数
Item_func::eq()错误地将两个表达式CONVERT(a USING latin1)和CONVERT(a USING utf8mb4)视为相等。
编纂说明
macOS:CMake 不再尝试在 MacOS 上使用原生
ctags版本,现在需要在构建 MySQL 时在系统上安装它的 Homebrew 版本。(错误 #36590594)macOS:在 MacOS 上构建 MySQL 时启用了 gRPC。(错误 #36537726)
已将捆绑
googletest和googlemock源代码升级到版本 1.14.0。(错误 #36562482)添加了对
GenError的缺失依赖项。(错误 #36551721)用于编译MySQL的Boost版本从1.84.0升级到1.85.0。有关更多信息,请参阅 Boost 1.85.0 发行说明。(错误 #36495694)
Enterprise Linux 8 和 9 的二进制文件现在是使用 GCC 13 构建的。(错误 #36331855)
删除了编译使用 RapidJSON 的代码时引发的链接器警告。(错误 #36322583)
现在可以在 Linux 系统上使用捆绑
tcmalloc库来构建 MySQL,该库通过指定-DWITH_TCMALLOC=BUNDLED.这仅在 Linux 上受支持。(错误 #36313839)删除了在 Ubuntu 23.04 上构建时
sql/statement/ed_connection.cc引发的警告。(错误 #114436、错误 #36428465)Linux
aarch64平台二进制文件现在是使用 patchelf--page-size=65536构建的,以便与使用 4k 或 64k 作为页面大小的系统兼容。(错误 #114233、错误 #36393794)
组件说明
安装组件时,未读取使用前缀设置的
--loose组件选项的值。(错误 #28341329)
配置说明
Microsoft Windows:在Windows上,MySQL配置器已更新为支持根据升级路径的就地升级。(错误 #36685422)
Microsoft Windows:在Windows上,如果向导正忙于执行操作,则单击MySQL Configurator向导页面上的[X]关闭按钮会生成确认弹出窗口。(错误 #36671317)
Microsoft Windows:在Windows上,MySQL Configurator不再在生成的MySQL服务器配置文件中定义自定义
server_type变量。此信息现在存储在configurator_settings.xml文件中。(错误 #36670309)Microsoft Windows:在Windows上,如果
my.ini文件缺少mysqlx_port定义,MySQL Configurator中的Removing Windows Firewall步骤将失败。(错误 #36666260)Microsoft Windows:在Windows上,如果MySQL Configurator无法从MySQL服务器安装页面中找到有效的
my.ini文件my.cnf,则单击“浏览”按钮将禁用“下一步”按钮,即使所选文件有效。(错误 #36395569)Microsoft Windows:在Windows上,MySQL Configurator现在仅显示先前配置了关联MySQL服务器的删除步骤。(错误 #36395417)
Microsoft Windows:在Windows上,MySQL Configurator现在检测现有root用户是否正在使用
mysql_native_password身份验证插件(该插件已在MySQL 9.0.0中删除),并在执行MySQL Server升级之前提示将root转换为使用caching_sha2_password身份验证插件。(WL #16139)Microsoft Windows:对于Windows上的MSI安装,MySQL Configurator现在无需用户干预即可自动升级MySQL 8.4 LTS安装。(WL #16274)
数据字典注释
尝试将包含常规列和生成列的混合的
MyISAM表从 MySQL 5.7 升级到 8.0 或更高版本会导致表损坏。(错误 #105301、错误 #33503328)
数据类型说明
当字符串转换为数值时,任何尾随数值的非数值数据都应导致严格模式下的错误和任何其他 SQL 模式下的警告,但在某些情况下,根据字符串的长度和字符集,无效字符串不会引发任何预期的错误或警告。(错误 #36457756)
在某些情况下,将双精度转换为整数值使用舍入,而在其他情况下,使用截断,这会导致结果不一致。现在,在所有这些情况下都使用四舍五入。(错误 #114549、错误 #36481397)
在某些情况下,
DECIMAL0 被视为小于 0 和 -1 之间的FLOAT值。(错误 #114196、错误 #36361165)
弃用和删除说明
MySQL 8.0 中已弃用
mysql_native_password的身份验证插件已被删除,服务器现在拒绝来自没有CLIENT_PLUGIN_AUTH功能的旧客户端程序的mysql_native身份验证请求。为了向后兼容,mysql_native_password在客户端上仍然可用;客户端内置身份验证插件已转换为可动态加载的插件。注意
在 MySQL 8.0 中,默认的 MySQL 身份验证插件已更改为
caching_sha2_password(请参阅缓存 SHA-2 可插入身份验证)。这些更改还需要删除以下服务器选项和变量:
--mysql-native-password服务器选项--mysql-native-password-proxy-users服务器选项default_authentication_plugin服务器系统变量
有关详细信息,请参阅身份验证插件。(WL #15930)
Performance Schema
variables_info表的MIN_VALUE和MAX_VALUE列现已弃用,并且可能会在 MySQL 的未来版本中删除。相反,您应该使用variables_metadata表的MIN_VALUE和MAX_VALUE列,它们提供相同的信息。(WL #15585)
事件调度程序说明
重要更改:现在可以准备以下与事件相关的 SQL 语句:
这些语句不支持位置参数(
?占位符);必须从字符串文本、系统变量和用户变量的某种组合中组装要准备的语句文本。有关更多信息,请参见 PREPARE、EXECUTE 和 DEALLOCATE PREPARE 语句,以及预准备语句中允许的 SQL 语法。CREATE EVENT 语句,提供了一个基本示例。(错误 #109309、错误 #34875573、WL #16298)
优化器说明
重要更改:
ER_SUBQUERY_NO_1_ROW已从包含IGNORE关键字的语句忽略的错误列表中删除。这样做的原因如下:忽略此类错误有时会导致将 NULL 插入到不可为 null 的列中(对于未转换的子查询),或者根本不插入任何行(使用
subquery_to_derived的子查询)。当子查询被转换为与派生表联接时,其行为与未转换的查询不同。
升级到此版本后,如果此更改包含生成多行标量子查询的
SELECT语句UPDATE,则此更改可能会生成包含IGNORE关键字引发错误的语INSERT句。DELETE有关更多信息,请参阅 IGNORE 对语句执行的影响。(错误 #110961、错误 #35373406)
性能架构说明
此版本向 MySQL 性能架构添加了两个表,如下所示:
该
variables_metadata表提供了有关系统变量的一般信息。此信息包括 MySQL 服务器识别的每个系统变量的名称、范围、类型、范围(如果适用)和描述。此表的
MIN_VALUE和MAX_VALUE列旨在替换variables_info该表的已MIN_VALUE弃用的 和MAX_VALUE列。该
global_variable_attributes表提供有关服务器分配给全局系统变量的属性值对的信息。
有关更多信息,请参见性能架构系统变量表。(WL #15855)
SQL 语法说明
JSON:您现在可以使用此处所示的语法将
JSON输出保存EXPLAIN ANALYZE到用户变量中:EXPLAIN ANALYZE FORMAT=JSON INTO @variable select_stmt该变量随后可以用作任何MySQL的JSON函数的JSON参数(请参阅JSON函数)。该
INTO子句仅受 支持FORMAT=JSON,必须显式包含该子句。这种形式EXPLAIN ANALYZE还支持在要分析SELECT的语句之前使用可选的FOR SCHEMAorFOR DATABASE子句。不支持其他SELECT语句。注意
仅当
explain_json_format_version服务器系统变量设置为2时,此功能才可用;否则,尝试使用它会引发ER_EXPLAIN_ANALYZE_JSON_FORMAT_VERSION_NOT_SUPPORTED.更多信息和示例,请参见获取执行计划信息。(WL #16216)
sys 架构说明
在此版本中,
innodb_lock_waits视图的性能得到了改进。(错误 #36337708)
X 插件说明
caching_sha2_password_digest_rounds无法使用 X 协议将系统变量设置为非默认值。(错误 #36402455)mysql_function_names单元测试源文件中指向 MySQL 文档的过时链接已更新。我们感谢 Minha Jeong 的贡献。(错误 #113500、错误 #36137217)
Bug 修复
InnoDB:MySQL
UPDATE在ALTER TABLE操作后意外停止。(错误 #36571091)参考资料:此问题是 Bug #35183686 的回归。
InnoDB:改进了恢复逻辑,
InnoDB以减少恢复操作之间的暂停。(错误 #36332645)InnoDB:在执行目录更改任务时,现在始终
InnoDBfsync如一地在父目录下执行文件系统操作。(错误 #36174938)InnoDB:在调试版本中,设置
innodb_interpreter_output调试变量将导致服务器意外停止。这现在是一个只读变量。(错误 #36041032)InnoDB:改进
os_innodb_umask了处理,并使其成为只读。(错误 #35932118)参考资料:此问题是 Bug #29472125 的回归。
InnoDB:删除了特定于 Fusion IO 原子写入功能的功能,该产品最后一次发布是在 2014 年。(错误 #35072139)
InnoDB:当列索引有效时,触发了引用无效列索引的
InnoDB断言错误。(错误 #34800754)InnoDB:对于空
XA事务,在 anXA START之后关闭服务器会导致服务器意外停止。(错误 #32416819)InnoDB:在处理空 XA 事务时关闭复制应用程序或二进制日志应用程序会导致系统意外停止。(错误 #32416819)
InnoDB:删除了
Validate_files::check()函数中不必要的堆使用。感谢宋华雄的贡献。(错误 #115041、错误 #36626203)
InnoDB:改进了
notify_about_advanced_write_lsn()逻辑以防止潜在的日志通知延迟。感谢陈宗志的贡献。(错误 #114660、错误 #36528707)
InnoDB:如果使用
innodb_parallel_read_threads=1读取分区表,则在 256 次读取后,任何表的读取性能都会大大降低。尽管没有使用任何并行读取线程,但 InnoDB 的行为就好像它达到了并行读取线程的最大容量。我们感谢柯宇的贡献。(错误 #114154、错误 #36347408)
InnoDB:从
get_next_redo_rseg_from_undo_spaces()中删除了不必要的条件检查。我们感谢Alex Xing的贡献。(错误 #113640、错误 #36185805)
InnoDB:包含具有空间参考标识符 (SRID) 属性的列的空间索引的结果为空。此外,使用
FORCE INDEX强制覆盖索引扫描空间索引会导致断言。(错误 #112676、错误 #114200、错误 #35894664、错误 #36361834)InnoDB:
SELECT ... GROUP BY使用 TempTable 引擎的查询速度至少是 Memory 引擎的两倍。(错误 #107700、错误 #34338001)复制:如果源包含由 JSON 函数填充的已存储、生成的列,并且
binlog_row_image设置为MINIMAL,则对基础列的任何后续更新或删除都将失败,并显示以下错误:Invalid JSON text in argument 1 to function json_extract: 'The document is empty.'副本尝试重新评估生成的列,但失败并出现该错误,因为基础列不可用。从此版本开始,当基础列不可用时,不会重新评估存储的生成列。(错误 #36515172)
复制:错误
ER_SERVER_REPLICA_CONVERSION_FAILED中返回的列号不正确。它比实际价值少一个。(错误 #36246205)组复制:删除了 中的
/xcom/gcs_xcom_networking.cc内存泄漏。(错误 #36532199)组复制:在某些情况下,在成功设置新的主数据库后,
group_replication_set_as_primary()无限期地等待操作完成。从此版本开始,将执行定期检查以确保该功能不会不必要地等待。(错误 #36348650)
组复制:表的
MEMBER_IDREPLICATION_GROUP_MEMBERS、MEMBER_HOST和MEMBER_PORT列并不总是为脱机成员填充。(错误 #36290046)组复制:下表不包含未配置主机名的复制通道(如组复制恢复通道)上的数据:
从此版本开始,这些表包含部分配置的组复制通道的数据。(错误 #36018242)
JSON:添加了对
NULLIF()、COALESCE()和 shift (>>) 运算符的错误处理缺失检查。(错误 #113668、错误 #35513196、错误 #36198403)参考资料:另请参阅:错误 #31358416。
MySQL NDB ClusterJ:运行 ClusterJ 测试套件导致一条错误消息,指出不存在多个线程。这是由于对线程和连接的一些错误处理,此补丁已纠正。(错误 #36086735)
添加了评估
<=>运算符时所需的缺失错误检查。(错误 #36570474)添加了评估
CASE运算符所需的缺失错误检查。(错误 #36570439)某些数字的平均值并不总是正确计算的。(错误 #36563773)
删除了导致无效结果和其他错误的冗余分配
Item::m_table_reffind_field_in_tables()。GROUP BY(错误 #36556725、错误 #36557029)参考资料:此问题是 Bug #36533080 的回归。
以下
strings文件包含不正确的许可证信息:mb_wc.hctype-uca.ccctype-ucs2.ccctype-utf8.ccdtoa.ccstrxmov.ccstrxnmov.cc
(错误 #36506181)
在某些异常情况下,该
UpdateXML()函数未正确处理其所有参数。(错误 #36479091)在某些情况下
subquery_to_derived=ON,在转换为派生表后,不会替换外部引用。(错误 #36475633)参考资料:另请参阅:Bug #36314993。
缺少对与
TIME值相关的错误的检查有时会导致 中的sql/item.cc断言。(错误 #36421511)解释在包含具有 SRID 属性的列的空间索引上使用的
FORCE INDEX查询会导致计划外退出。(错误 #36418426)在存储的程序中创建的事件并不总是得到正确处理。(错误 #36402968、错误 #35395333)
参考资料:此问题是 Bug #17809、Bug #11745618 的回归。
InnoDBOpenTelemetry 指标 (mysql.inno) 未自动更新。(错误 #36399090)此修复解决了两个问题:
在搜索
GROUP BY列表中放置的项时尚未修复的项导致 中的include/sql_string.h断言。该
TIME_FORMAT()函数并非在所有情况下都正确处理NULL参数。
(错误 #36367313、错误 #36367776)
更新
BuildRequire了规则,以与 CMake 和 Bison 现在所需的版本保持一致。(错误 #36343254)从内部函数
MY_COLLATION_HANDLER::strstr()中删除了未使用的参数。(错误 #36342997)包含
EXCEPT ALL集合运算的IN谓词产生了错误的结果。(错误 #36332697)查询 using
WHERE返回不同的行数,具体取决于primary_keyIN(SELECTconstant1EXCEPT SELECTconstant2)ORDER BY子句的存在与否。(错误 #36307622)递增表达式的引用计数时,不会查看此表达式中的基础表达式。在删除表达式时,在减少引用计数后,甚至检查了基础表达式,这会导致无意中删除基础表达式。此问题在
Item_ref::real_item()中以及 中的sql/item.h断言中都表现出来。我们通过不查看基础表达式来解决此问题,除非当前表达式包含唯一剩余的引用。(错误 #36204344、错误 #36356279)在某些条件下,
EXPLAIN FORMAT=JSON FOR CONNECTION有时会导致计划外的退出。(错误 #36189820)在某些情况下,争用条件可能会导致使用的 RAM 量
TABLE_HANDLES增加到最大 9GB。(错误 #36170903)某些
CREATE USER语句未正确处理。(错误 #36022885)对于
SELECTwithORDER BY和LIMIT,优化器首先选择了成本非常高的全表扫描,然后执行了另一次检查并使用路径perform_order_index类型,但这并没有反映在优化器计划中的成本中。(错误 #35930969)在副本上执行 mysqldump 将插入
FLUSH TABLES该操作,该操作写入二进制日志。现在FLUSH LOCAL TABLES入,以防止在复制过程中由于这些二进制日志更改而导致的 GTID 相关问题。解决方法是将
--source-data选项设置为 1 或 2。(错误 #35665076)参考资料:此问题是 Bug #33630199 的回归。
所有内部 ACL 位掩码变量现在都显式为 32 位 (
uint32_t)。(错误 #35507223)无法在 上
FIND_IN_SET()添加功能索引。(错误 #35352161)在某些情况下,在视图中使用
ORDER BY COUNT(*)的空表中的 aSELECT不返回任何行。(错误 #115035、错误 #36625752)constant在某些情况下,例如在对大量表执行 DDL 操作时,错误日志中充斥着来自后台直方图更新的警告;违规警告涉及未能获取表上的元数据锁。
为了解决这个问题,我们现在限制从后台直方图更新操作写入错误日志的消息,速率上限为每分钟一条消息,这应该足以让用户识别后台直方图更新的潜在问题。此外,我们将后台直方图更新期间发生的所有错误事件从错误降级为警告。(错误 #114845、错误 #36574298)
MySQL 9 中新错误的错误号范围已指定为 6400 开头。(错误 #114414、错误 #36421351)
当使用组件服务指定了 UDF 参数的字符集,并且传递的参数值未完全转换为所需的字符集时,UDF 将停止执行并返回 SQL
NULL。(错误 #114409、错误 #36420251)当
return在语句JOIN ON中使用函数时,确定性存储函数可能会返回不正确的结果。如果由于表元数据(例如,FLUSH TABLES在两次执行之间)导致需要重新准备查询,则子ON句有时会丢失。(错误 #114235、错误 #36379879)服务器拒绝了包含引用父表列的子查询的查询。(错误 #113887、错误 #36262779)
SUM(SUBSTRING())按预期返回警告,但SUM(DISTINCT SUBSTRING())未返回。 (错误 #113171、错误 #36035064)添加了 EL8 和 EL9 平台缺少
mysql-community-libs-compat的软件包。(错误 #112949、错误 #35975348)SHOW PARSE_TREE CREATE SCHEMA导致调试版本中的服务器退出。注意
该
SHOW PARSE_TREE语句仅在调试版本中可用。(错误 #112883、错误 #35964157)
执行预准备语句时未更新 的
PROCESSLIST_INFOTHREADS列。(错误 #104121、错误 #33057164)
官方文档下载:《MySQL 9.0 版本说明》_2024年7月_英文版.pdf




