有关升级、降级、平台支持等的一般信息,请访问https://mysql.net.cn/doc/relnotes/mysql/8.0/en/。
-
以前,对于用户没有定义的例程的定义,用户需要具有全局
SELECT
权限,这是非常广泛的。新SHOW_ROUTINE
特权可以作为具有更受限范围的特权来授予,该特权允许访问例程定义。(也就是说,管理员可以SELECT
从不需要全局权限的用户那里 取消全局权限,SHOW_ROUTINE
而是改为授予权限。)这使帐户能够备份存储的例程,而无需广泛的权限。SHOW_ROUTINE
提供访问:对于从旧版本的 MySQL 升级,任何具有全局
SELECT
权限的用户都被授予SHOW_ROUTINE
,如果还没有一些用户具有SHOW_ROUTINE
。
Solaris: Clang 和 GCC 现在可用于在 Solaris 上编译 MySQL,尽管两者都是实验性的,目前不能用于生产代码。(缺陷号 30562248)
在 EL7 和 EL8 上,CMake配置已调整为在 GCC 8 之前查找 GCC 9。由于
libmysqlclient
MySQL 发行版随附, 因此libmysqlclient
在这些平台上构建的客户端应用程序会受到影响,可能需要重新编译。(缺陷号 30722756)在 Windows 上,Visual Studio 的CMake编译器版本检查已更新,以指示 Visual Studio 2019 是当前受支持的版本。(可以通过使用 . 运行CMake来绕过版本检查
-DFORCE_UNSUPPORTED_COMPILER=1
。)(漏洞 #30688403)
JSON: 以前,可以函数时以任意顺序
ON EMPTY
和这与 SQL 标准背道而驰,SQL 标准规定 指定 when 时,它必须始终位于任何子句之前。出于这个原因,指定before现在已被弃用,并且尝试这样做会导致服务器发出警告。在 MySQL 的未来版本中将删除对非标准语法的支持。ON ERROR
JSON_TABLE()
ON EMPTY
ON ERROR
ON ERROR
ON EMPTY
-
max_length_for_sort_data
由于优化器更改使其过时且无效, 因此系统变量现已弃用。参考资料:另请参阅:Bug #30473261。
-
VALUES()
在语句中访问新行值的 使用INSERT ... ON DUPLICATE KEY UPDATE
现已弃用,并且在未来的 MySQL 版本中可能会被删除。相反,您应该为新行及其列使用别名,如 MySQL 8.0.19 及更高版本中所实现的那样。例如,此处显示的语句
VALUES()
用于访问新行值:INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
从今以后,您应该改用类似于以下的语句,该语句使用新行的别名:
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new ON DUPLICATE KEY UPDATE c = new.a+new.b;
或者,您可以为新行及其每一列使用别名,如下所示:
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p) ON DUPLICATE KEY UPDATE c = m+n;
有关详细信息和示例,请参阅 INSERT ... ON DUPLICATE KEY UPDATE 语句。
MySQL 附带的
rapidjson
库已升级到 2020 年 1 月 16 日的 GitHub 快照。添加了针对在 Mac OS X 上从快照构建时遇到的编译器错误的修复程序。(缺陷号 30898701)
-
向服务器发送
SIGHUP
信号不再导致它向错误日志写入状态报告。服务器为响应而执行的其他操作将SIGHUP
继续执行。请参阅 MySQL 中的 Unix 信号处理。同样,mysqladmin debug不再导致写入状态报告。(缺陷号 30578923)
log_sink_json
JSON 格式的错误日志接收器现在在日志消息中包含一个 (ts
时间戳)。该值是一个整数,指示自纪元 ('1970-01-01 00:00:00'
UTC) 以来的毫秒数。请参阅 错误日志输出格式。
-
现在,只要使用嵌套块循环,就可以使用散列连接。这意味着散列连接可用于以下类型的查询:
内部非等连接
半连接
反连接
左外连接
右外连接
这建立在为 MySQL 8.0.18 所做的工作的基础上,并消除了实现中的限制,即哈希连接只能用于具有至少一个等连接条件的查询。此外,内连接和外连接(包括半连接和反连接)现在都可以使用批处理键访问 (BKA),它以增量方式分配连接缓冲区内存,这样单个查询就不必占用大量它们实际上不需要解析的资源. 有关详细信息,请参阅 成批密钥访问联接。
此修复完成了将以前版本的 MySQL 中使用的执行器替换为迭代器执行器的任务,包括替换旧的索引子查询引擎,这些 引擎管理未转换为半连接的查询的形式查询,以及具体化的查询变成相同的形式,这取决于旧执行者的内部结构。
WHERE
value
IN (SELECTcolumn
FROMtable
WHEREcondition
)IN
有关更多信息和示例,请参阅 哈希连接优化。(错误#30528604、错误#30473261、错误#30912972)
-
此版本实现了几个新的索引级优化器提示,其功能与使用 SQL 关键字(如
FORCE INDEX
和 )的现有索引提示非常相似IGNORE INDEX
。这些旨在替换等效的索引提示,这些提示将在未来的 MySQL 版本中弃用(并最终删除)。此处列出了新提示,并附有对每个提示的简要说明:-
JOIN_INDEX
: 强制 MySQL 对任何可用的访问方法使用指定的一个或多个索引,例如ref
、range
、index_merge
等。这相当于FORCE INDEX FOR JOIN
索引提示。NO_JOIN_INDEX
:使服务器忽略任何访问方法的指定索引。等效索引提示是IGNORE INDEX FOR JOIN
. -
GROUP_INDEX
:使服务器使用指定的一个或多个索引进行索引扫描GROUP BY
操作。相当于FORCE INDEX FOR GROUP BY
。NO_GROUP_INDEX
:强制MySQL忽略指定的一个或多个索引进行索引扫描GROUP BY
操作。等效索引提示是IGNORE INDEX FOR GROUP BY
. -
ORDER_INDEX
:使 MySQL 使用指定的索引或索引对行进行排序。它相当于FORCE INDEX FOR ORDER BY
.NO_ORDER_INDEX
:阻止服务器使用指定的一个或多个索引来执行行排序。相当于IGNORE INDEX FOR ORDER BY
。 -
INDEX
:作为、 和 的组合JOIN_INDEX
, 强制服务器对任何和所有范围使用指定的一个或多个索引。相当于。GROUP_INDEX
ORDER_INDEX
FORCE INDEX
NO_INDEX
: 作为NO_JOIN_INDEX
,NO_GROUP_INDEX
, 和 的组合NO_ORDER_INDEX
;也就是说,它强制 MySQL 忽略任何和所有范围的指定索引。它相当于索引提示IGNORE INDEX
。
考虑在具有指定列和索引的表上使用索引提示的以下查询:
SELECT a,b FROM t1 USE INDEX FOR ORDER BY (i_ab) ORDER BY a;
使用此版本中引入的索引级优化器提示,可以重写此查询,如下所示:
SELECT /*+ ORDER_INDEX(t1 i_ab) */ a,b FROM t1 ORDER BY a;
新的索引级优化器提示可以与
SELECT
、UPDATE
和DELETE
语句一起使用。(这与使用FORCE INDEX
or 的索引提示不同IGNORE INDEX
,后者只能与SELECT
and一起使用UPDATE
。)因此,像下面这样的语句是可能的:UPDATE /*+ INDEX(t1 i_ab) */ t1 SET d = 1 WHERE a = 1 AND b = 2 AND c = 3; DELETE /*+ INDEX(t1 i_a,i_c) */ FROM t1 WHERE a = 1 AND b = 2 AND c = 3;
可以在同一评论中指定多个提示,如下所示:
DELETE /*+ INDEX(t1 i_a) JOIN_INDEX(t1 i_c) */ FROM t1 WHERE a = 1 AND b = 2 AND c = 3;
索引级优化器提示可以与其他优化器提示同时使用。当您这样做时,索引级提示首先应用;任何其他优化器提示的效果仅限于索引级提示允许的索引集。
创建视图时也可以使用索引级提示,如下所示:
CREATE VIEW v1 AS SELECT /*+ NO_INDEX(t1 i_a,i_b) */ a FROM t1 WHERE b IN (SELECT /*+ NO_INDEX(t1 i_ab,i_b) */ a FROM t1 WHERE a > 3) ORDER BY a;
如果在与索引提示相同的语句中使用这些索引级优化器提示,则索引提示将被忽略。
新的索引级优化器提示等同于
FORCE INDEX
而不是USE INDEX
;换句话说,使用一个或多个索引级优化器提示意味着只有在无法使用指定索引之一来查找表中的行时才使用表扫描。要使 MySQL 使用与 的给定实例相同的索引或索引集USE INDEX
,您可以使用NO_INDEX
、NO_JOIN_INDEX
、NO_GROUP_INDEX
、NO_ORDER_INDEX
或它们的某种组合。有关更多信息和示例,请参阅 索引级优化器提示。
-
包含
curl
而不是链接到系统curl
库的二进制包已升级为使用curl
7.69.0。(缺陷号 30866333)对于 RPM 包,comp_err实用程序已移至
-test
子包并标记为测试组件。(缺陷号 30716034)捆绑
libedit
库已升级到 3.1 版。(错误#28939380、错误#20770875、错误#22930525、错误#22332089、错误#27433491、错误#27285445)-
捆绑的 LZ4 库已升级到版本 1.9.2。这修复了某些问题,例如产生 mysqlpump运行时错误的 Bug #30369643。
参考资料:另请参阅:Bug #30369643。
Performance Schema 收集了与会话相关的错误统计信息,这些错误信息只能在全局范围内发生,而不是在每个会话中发生。不再这样做,减少了错误检测的内存开销。此外,全局错误行不再包含在按线程、帐户、用户或主机报告的错误摘要中。(缺陷号 30311574)
可以将 LDAP 服务器配置为将 LDAP 搜索委托给另一个 LDAP 服务器,该功能称为 LDAP 推荐。但是,启用 LDAP 引用可能会导致搜索在某些情况下因 LDAP 操作错误而失败。要启用 MySQL Enterprise Edition LDAP 身份验证插件以避免引用错误,可以使用新 变量
authentication_ldap_simple_referral
和authentication_ldap_sasl_referral
系统变量。这些变量使每个插件能够控制 LDAP 服务器在 MySQL 身份验证期间是否应使用引用。请参阅 LDAP 搜索推荐。-
MySQL 企业版 SASL LDAP 身份验证插件现在支持 GSSAPI/Kerberos 作为 Linux 上 MySQL 客户端和服务器的身份验证方法。这在应用程序使用默认启用 Kerberos 的 Microsoft Active Directory 访问 LDAP 的 Linux 环境中很有用。请参阅 LDAP 身份验证方法。
此功能适用于 Linux 的所有 RPM 和 DEB 包,但不适用于 TAR 存档包。
-
以前,语句
INTO
子句SELECT
可以出现在两个位置之一:-
之前
FROM
:SELECT * INTO OUTFILE 'file_name' FROM table_name;
-
在尾随锁定子句之前:
SELECT * FROM table_name INTO OUTFILE 'file_name' FOR UPDATE;
INTO
now 可以出现在第三个位置,在SELECT
语句的末尾:SELECT * FROM table_name FOR UPDATE INTO OUTFILE 'file_name';
放在
INTO
最后是首选位置。锁定子句之前的位置现在已弃用,并且在未来的 MySQL 版本中将删除对它的支持。换句话说,INTO
在FROM
而不是结束时SELECT
会产生警告。此外,还
UNION
针对INTO
. 这些UNION
包含的变体INTO
在语法上是正确的并产生相同的结果:... UNION SELECT * FROM table_name INTO OUTFILE 'file_name'; ... UNION (SELECT * FROM table_name) INTO OUTFILE 'file_name'; ... UNION SELECT * INTO OUTFILE 'file_name' FROM table_name; ... UNION (SELECT * INTO OUTFILE 'file_name' FROM table_name);
但是,最后两个变体令人困惑,好像它们从命名表而不是整个查询表达式 (the
UNION
) 中收集信息。UNION
包含 now 的这两个 变体INTO
已被弃用,并且在未来的 MySQL 版本中将删除对它们的支持。因此:在查询表达式的尾随查询块中,使用
INTO
beforeFROM
会产生警告。在查询表达式的带括号的尾随块中,使用
INTO
(无论其相对于 的位置如何FROM
)会产生警告。
弃用适用于所有
INTO
形式:INTO OUTFILE
、INTO DUMPFILE
和。INTO
var_list
-
perfschema.idx_compare_replication_applier_status
更新测试用例以存储事务重试次数的旧值,并将其与事务重试次数的新值进行比较 。 感谢 Facebook 的贡献。(漏洞 #30810627,漏洞 #98389)
如果在启动 X 插件时达到服务器系统变量指定的 MySQL 服务器实例的客户端连接限制,
max_connections
则 X 插件无法创建会话以获取服务器配置,因此无法启动。X Plugin 现在在启动期间创建管理会话(使用mysql_admin_session
服务),不受客户端连接限制。(缺陷号 30894981)当 X 协议会话由于已经有太多的 X 协议连接而无法初始化时,将返回错误代码 5011 Could not open session。在这种情况下,现在会返回更相关的错误代码 1040 Too many connections 。(缺陷号 30753637)
验证 JSON 引用的问题导致在使用验证架构创建集合时出错。(缺陷号 30733330)
在关闭具有与客户端的 X 协议连接的 MySQL 服务器实例期间,X 插件中的竞争条件可能导致接受无效的客户端连接进行处理。由于在关闭期间客户端超时验证忽略了无效客户端,因此这些客户端会阻止关闭,直到
mysqlx_wait_timeout
达到系统变量设置的超时时间(默认为 8 小时)。为防止出现此问题,客户端超时验证现在包括处于无效状态的客户端。(缺陷号 30702685)连接到 MySQL 8.0 服务器时,X 插件为会话设置了与 mysql客户端使用的不同的排序规则,这可能会导致依赖于排序规则的查询出现问题。X 插件现在使用
utf8mb4_0900_ai_ci
排序规则,这是utf8mb4
字符集的默认设置。(缺陷号 30516849)X 协议连接的工作线程在创建时被标识为系统线程,并分配给
SYS_default
资源组。此标识意味着无法出于资源管理目的将它们分配给用户资源组。它们现在被标识为用户线程并分配给USR_default
资源组。请注意,X 协议目前不支持CREATE
、ALTER
、DROP
和SET RESOURCE GROUP
语句,但这些语句可以在使用经典 MySQL 协议连接的 X 协议连接线程上运行。(缺陷号 30059288)X 插件现在可以在初始化开始后立即访问 MySQL 系统变量,因此插件安装线程可以自行设置所需的连接,而不是启动一个单独的线程。(缺陷号 29127302)
-
重要更改: 以前,在排序操作中包含大于
TINYBLOB
或BLOB
作为有效负载的 blob 类型的任何列会导致服务器恢复为仅对行 ID 进行排序,而不是对完整行进行排序;这导致在排序完成后第二次从磁盘中获取行本身。由于JSON
和GEOMETRY
列在内部实现为LONGBLOB
,这导致这些类型的列出现相同的行为,即使它们几乎总是比 4GB 的最大值LONGBLOB
(甚至 16 MB 的最大值MEDIUMBLOB
)短得多。在这种情况下,服务器现在将这些类型的列转换为打包插件,就像它所做的那样TINYBLOB
和BLOB
列,在测试中显示出显着的性能提升。 和 列在这方面的处理 保持不变MEDIUMBLOB
LONGBLOB
。此增强功能的一个影响是,如果排序缓冲区的大小不足,则在尝试对包含非常大(多兆字节) 或列值的行进行排序时 ,现在可能 会发生内存不足错误;这可以通过增加系统变量的值以通常的方式进行补偿。(错误#30400985,错误#30804356)
JSON
GEOMETRY
sort_buffer_size
-
InnoDB: 改进了竞争感知事务调度 (CATS) 算法,该算法优先考虑等待锁的事务。事务调度权重计算现在完全在一个单独的线程中执行,这提高了计算性能和准确性。
删除了也用于事务调度的先进先出 (FIFO) 算法。CATS 算法增强使 FIFO 算法变得冗余。以前由 FIFO 算法执行的事务调度现在由 CATS 算法执行。
TRX_SCHEDULE_WEIGHT
表中增加了 一列INFORMATION_SCHEMA.INNODB_TRX
,可以查询CATS算法分配的事务调度权重。添加了以下
INNODB_METRICS
计数器用于监视代码级事务调度事件:-
lock_rec_release_attempts
尝试释放记录锁的次数。
-
lock_rec_grant_attempts
尝试授予记录锁的次数。
-
lock_schedule_refreshes
分析等待图以更新事务计划权重的次数。
-
-
InnoDB: 双写缓冲区的存储区域已从系统表空间移动到双写文件。将双写缓冲区存储区域移出系统表空间可减少写入延迟,增加吞吐量,并在双写缓冲区页面的放置方面提供灵活性。为高级双写缓冲区配置引入了以下系统变量:
-
定义双写缓冲区文件目录。
-
定义双写文件的数量。
-
为批量写入定义每个线程的最大双写页数。
-
定义要批量写入的双写页数。
有关详细信息,请参阅 双写缓冲区。
-
EXPLAIN ANALYZE
现在可以在执行期间使用KILL QUERY
或 CTRL-C停止。(缺陷号 30787515)EXPLAIN FORMAT=TREE
现在显示inversion
窗口函数的信息。(缺陷号 30770631)EXPLAIN FORMAT=TREE
输出已得到改进,以提供有关评估窗口函数的更多信息,并匹配为常规聚合提供的信息。(错误#30573446,错误#30582782)现在可以在 macOS 上使用CMake选项进行 配置。(缺陷号 30125902)
-DWITH_LTO=1
-
您现在可以在 MySQL 服务器实例上启用二进制日志事务压缩。当启用二进制日志事务压缩时,事务负载使用 zstd 算法进行压缩,然后作为单个事件 (a
Transaction_payload_event
) 写入服务器的二进制日志文件。压缩事务有效负载在复制流中发送到副本、其他组复制组成员或客户端(如 mysqlbinlog )时保持压缩状态. 它们不被接收线程解压缩,并且仍以压缩状态写入中继日志。因此,二进制日志事务压缩为事务的发起者和接收者(以及他们的备份)节省了存储空间,并在服务器实例之间发送事务时节省了网络带宽。您可以使用系统变量在 MySQL 服务器实例上启用二进制日志事务压缩
binlog_transaction_compression
,默认为OFF
. 您还可以使用binlog_transaction_compression_level_zstd
系统变量来设置用于压缩的 zstd 算法的级别。此值确定压缩效果,从 1(最低效果)到 22(最高效果)。 -
CHANGE MASTER TO
语句 的一个新选项REQUIRE_TABLE_PRIMARY_KEY_CHECK
,使复制从站能够选择自己的主键检查策略。当该选项设置为ON
用于复制通道时,从服务器始终在复制操作中使用系统变量的值ON
,sql_require_primary_key
需要主键。将选项设置为时,从从复制操作中的 系统变量中OFF
始终使用该值,因此即使主需要一个,也永远不需要主键。When the option is set toOFF
sql_require_primary_key
REQUIRE_TABLE_PRIMARY_KEY_CHECK
STREAM
,这是默认值,从服务器使用从主服务器为每个事务复制的任何值。对于多源复制,设置
REQUIRE_TABLE_PRIMARY_KEY_CHECK
或ON
启用OFF
从站以规范不同主站复制通道的行为,并保持sql_require_primary_key
系统变量的一致设置。ON
当多个主节点更新同一组表时,使用保护措施防止意外丢失主键。使用OFF
允许可以操作主键的主控与不能操作主键的主控一起工作。当
PRIVILEGE_CHECKS_USER
设置为对通道应用复制权限检查时,设置REQUIRE_TABLE_PRIMARY_KEY_CHECK
为ON
或OFF
意味着用户帐户不需要会话管理级别权限来设置受限会话变量,这些变量需要更改值sql_require_primary_key
以匹配每个事务的主设置。
-
从 MySQL 8.0.19 开始,支持对通过 X 协议连接发送的消息进行压缩。如果服务器和客户端同意使用压缩算法,则可以压缩连接。默认情况下,服务器允许 Deflate、LZ4 和 zstd 压缩算法,或者您可以将
mysqlx_compression_algorithms
系统变量设置为仅包括您允许的那些。在 MySQL 8.0.19 中,X Protocol 对每个算法使用库默认压缩级别,客户端无法协商。从 MySQL 8.0.20 开始,客户端可以在 X 协议连接的能力协商期间请求特定的压缩级别。X 协议为每个算法设置了一个最大压缩级别,如果客户端请求的高压缩级别会消耗服务器上的太多资源,这将阻止服务器同意客户端请求的高压缩级别。Deflate 的最大压缩级别最初设置为 5,LZ4 为 8,zstd 为 11。
mysqlx_deflate_max_client_compression_level
您可以使用新的mysqlx_lz4_max_client_compression_level
、 和mysqlx_zstd_max_client_compression_level
系统变量 调整这些设置 。X 协议的新默认压缩级别也已通过性能测试选择为压缩时间和网络传输时间之间的良好折衷。这些默认值不一定与每个算法的库默认值相同。如果客户端不请求算法的压缩级别,则应用它们。Deflate 的默认压缩级别最初设置为 3,LZ4 为 2,zstd 为 3。
mysqlx_deflate_default_compression_level
您可以使用新的mysqlx_lz4_default_compression_level
、 和mysqlx_zstd_default_compression_level
系统变量 调整这些设置 。
-
不兼容的更改:除非添加 使用的某些查询
ST_Contains()
不会返回任何结果> 0
笔记对于从早期版本的 MySQL 升级,您应该在具有它们的表中重新创建空间索引。
(缺陷 #30461595,缺陷 #97347)
-
性能: 从 MySQL 5.7 升级到 MySQL 8.0 后,某些针对具有空间索引的表的查询执行效率不高。(缺陷 #94655,缺陷 #29488350)
参考资料:另请参阅:Bug #89551、Bug #27499984。
NDB Cluster: 为每个拥有根表主分区的节点
NDB
定义一个SPJ
如果此表使用从任何片段副本读取,DBTC
则将所有SPJ
工作人员放在同一个DBSPJ
实例中,这有效地消除了一些SPJ
工作人员的使用。(缺陷号 30639165)-
NDB Cluster:使用来自 NDB 8.0.16 或更早版本的ndb_mgm客户端二进制文件 执行
SHOW
命令 以访问运行 NDB 8.0.17 或更高版本的管理节点会产生错误消息Unknown field: is_single_user。(缺陷号 30599413)参考资料:另请参阅:Bug #16275500。
InnoDB:指定撤消数据文件名但未指定路径 的变量
CREATE UNDO TABLESPACE
指定的目录中删除了现有的同名撤消数据文件innodb_undo_directory
文件名冲突检查是在数据目录而不是innodb_undo_directory
变量指定的目录上执行的。(漏洞 #30908328,漏洞 #98628)-
InnoDB: 在调试版本中,MySQL 8.0.19 中引入的回归减慢了 mutex 和 rw-lock 死锁调试检查。(缺陷号 30886393)
参考资料:此问题是 Bug #30628872 的回归。
InnoDB: Valgrind 测试引发了一个错误,表明条件跳转或移动取决于未初始化的值。由于无效的验证逻辑,该错误是误报。(缺陷号 30837136)
InnoDB:(
rw_lock_debug_mutex_enter()
在源文件中 缺少障碍sync0debug.cc
可能会导致线程等待而不会被唤醒。(缺陷号 30819167)InnoDB: 为了提高Linux上的服务器初始化速度,
posix_fallocate()
现在用于为重做日志文件分配空间。(缺陷 #30804431,缺陷 #98342)InnoDB: 数据字典表打开函数是用不正确的锁顺序实现的。(缺陷 #30782103,缺陷 #97825)
InnoDB: MySQL 8.0.17 中引入的并行读取线程功能的更改导致
SELECT COUNT(*)
性能下降。不必要地从磁盘读取页面。(缺陷号 30766089)InnoDB: 对于引导线程使用启动变量执行的 SQL 操作,没有执行 DDL 日志记录
init_file
,导致文件被遗留下来,这些文件应该在 DDL 后阶段被删除。(缺陷 #30721214,缺陷 #98131)InnoDB: 在具有特定记录数的表上,在转换为 JSON 数组的列上添加索引失败,并出现“表的密钥文件不正确”错误。(缺陷 #30709525,缺陷 #98098)
InnoDB: Valgrind 错误报告
lock->writer_thread
在条件跳转中使用了未初始化的值。(缺陷号 30694177)InnoDB: 内部缓冲池统计计数器 (
n_page_gets
) 按页码分区,以避免在多个线程访问时发生争用。(错误#30604841,错误#97822)InnoDB: 由于
.cfg
文件和数据字典都包含使用添加的列的默认值,ALGORITHM=INSTANT
。仅当默认值不同时才会发生错误。(缺陷号 30561144)InnoDB: 缓慢关闭无法刷新某些 GTID,需要从撤消日志中恢复未刷新的 GTID。(缺陷号 30548229)
InnoDB: 为性能模式内存分配分配内存前缀的代码中的对齐要求被破坏,导致针对 macOS 和 FreeBSD 优化的 MySQL 构建失败。(缺陷号 30530857)
InnoDB: 由于为表创建的新数据字典对象中缺少数据,添加虚拟列引发了断言失败。(缺陷号 30524263)
InnoDB: 检查撤消表空间的模式时未采用所需的锁存器。检查撤消表空间是否为空时,也没有获取所需的闩锁。(缺陷号 30509134)
InnoDB: 在事务执行任何数据修改导致失败之前,将更新撤消日志段分配给 XA 事务以保留 GTID 值。(缺陷号 30456328)
InnoDB: 在具有废弃表空间的分区表上执行的查询引发断言失败。(错误#30437407,错误#97271)
InnoDB: 将
row_upd_clust_rec_by_insert
聚集索引记录标记为已删除并将记录的更新版本插入聚集索引的函数将不正确的n_ext
值(外部字段的总数)传递给较低级别的函数,导致断言失败。(缺陷号 30437378)InnoDB: 在克隆操作期间,在关闭时写入数据字典缓冲表为时已晚,导致失败。新生成的脏页没有被刷新。(错误#30427369,错误#30405535,错误#30405535)
InnoDB:
innodb_buffer_pool_evict
使用调试变量设置 执行的操作uncompressed
导致断言失败。(缺陷号 30405531)InnoDB: 读写锁代码 (使用 GCC 内置函数或当内置函数不可用时
rw_lock_t
对布尔标志和编写器线程 ID 的访问顺序 在某些情况下使用 C++。感谢来自 ARM 的 Yibo Cai 做出的贡献。(缺陷 #30401416,缺陷 #97150)recursive
os_mutex
std::atomic
InnoDB: 从 MySQL 5.7 升级到 MySQL 8.0 时发生故障。服务器数据字典对象缺少有关
FTS_DOC_ID
列的信息,并且FTS_DOC_ID_INDEX
在删除FULLTEXT
索引后仍然存在。(缺陷号 30357954)InnoDB: 有关并行扫描的不必要消息已打印到错误日志中。(缺陷号 30330448)
InnoDB: 从MySQL 5.7升级到MySQL 8.0的过程中,聚簇索引named
GEN_CLUST_INDEX
被重命名为PRIMARY
,导致聚簇索引的重复条目被添加到mysql.innodb_index_stats
表中。(缺陷号 30330448)InnoDB: 各种内部函数以不一致的方式计算写入事件槽。(漏洞 #30228108,漏洞 #96519)
InnoDB: 在特定情况下,在崩溃恢复的重做日志应用阶段可能不会应用表空间加密密钥信息。(缺陷号 30209760)
InnoDB: 文件操作失败导致页面跟踪归档器失败,进而导致主线程挂起,导致断言失败。此外,错误地,页面跟踪存档程序在模式下保持启用状态
innodb_read_only
。(缺陷号 30202643)InnoDB: 尝试导入包含使用添加的表列的表空间时报告索引损坏错误
ALGORITHM=INSTANT
。该错误是由于缺少与立即添加的列关联的元数据。(漏洞 #30191523,漏洞 #96477)InnoDB: 尝试获取 LOB 记录的事务遇到空 LOB 引用,导致断言失败。但是,空 LOB 引用在此特定场景中有效,因为 LOB 值尚未完全写入。(缺陷号 30144303)
InnoDB: 在并行读取操作期间,
autocommit
禁用表加载操作的回滚导致服务器由于断言代码而退出,该代码未考虑并行读取期间树结构更改的可能性。(缺陷号 30060690)InnoDB: 发现回滚段内存对象中维护的当前大小值无效,导致函数断言失败
trx_purge_free_segment()
。添加了验证例程 (trx_rseg_t::validateCurrSize()
) 以验证当前大小值。(缺陷号 29947027)InnoDB: 使用无效参数值执行的准备好的语句引发断言失败。(缺陷号 29880907)
-
InnoDB: 添加列操作导致断言失败。失败是由于悬空指针造成的。(漏洞#29866408)
参考:这个问题是 Bug #28491099 的回归。
InnoDB: 更新某些
InnoDB
采用字符串值的系统变量会在 Valgrind 测试期间引发无效读取错误。(缺陷 #29717909,缺陷 #95215)InnoDB: 由于撤销表空间 ID 值的更改,MySQL 8.0 中用于修改撤销表空间的重做日志记录的大小增加,这需要额外的字节。重做日志记录大小的变化导致具有大量写入 I/O 的工作负载的性能下降。为了解决这个问题,修改了重做日志格式以减少重做日志记录大小以修改撤消表空间。(漏洞#29536710)
InnoDB: 关于文件写入的附加信息
InnoDB
,包括进度数据,现在打印到错误日志中。(缺陷 #29472295,缺陷 #94634)InnoDB: 由于元组损坏,具有空间索引的表上的插入语句引发了记录类型不匹配断言。(漏洞#29465567)
InnoDB: 在撤销日志记录损坏的情况下,计算撤销日志记录大小的函数可能会计算出不正确的长度值,从而导致 malloc 失败。添加断言代码以检测不正确的计算。(缺陷 #29448406,缺陷 #82734)
复制: Group Replication 的消息服务使用的线程未被 Performance Schema 工具正确注册,因此线程操作在 Performance Schema 表中不可见。(缺陷号 30824676)
Replication: Group Replication 发起并管理用于分布式恢复的克隆操作,但已设置为支持克隆的组成员也可以参与用户手动发起的克隆操作。在 MySQL 8.0.20 之前的版本中,如果操作涉及正在运行组复制的组成员,则无法手动启动克隆操作。从 MySQL 8.0.20 开始,您可以执行此操作,前提是克隆操作不会删除和替换收件人上的数据。因此,启动克隆操作的语句必须包含
DATA DIRECTORY
if Group Replication is running 子句。(缺陷号 30798640)复制: 对于组复制通道,在组复制运行时发出
CHANGE MASTER TO
带有选项的语句PRIVILEGE_CHECKS_USER
会导致通道的中继日志文件被删除。在这种情况下,已接收并在中继日志中排队但尚未应用的事务可能会丢失。该CHANGE MASTER TO
语句现在只能在组复制未运行时发出。(缺陷号 30655369)-
复制: 如果服务器停止发送消息,组复制的故障检测机制会引起怀疑,并且如果大多数组成员仍在通信,则该成员最终会被驱逐。但是故障检测机制并没有考虑到大多数群中有一个或多个群成员实际上已经被标记为开除,但还没有被移出群的情况。如果网络不稳定,成员之间经常以不同的组合失去联系并重新建立联系,一个群组可能会最终将其所有成员标记为被驱逐,之后该群组将不复存在,必须重新建立.
Group Replication 的群组通信系统 (GCS) 现在会跟踪已标记为驱逐的群组成员,并在决定是否存在多数时将他们视为可疑成员群组中的成员。这样可以确保至少有一个成员留在组中,并且组可以继续存在。当一个被开除的成员实际上已经被从组中移除时,GCS 将删除其已将成员标记为开除的记录,以便该成员可以重新加入组。(缺陷号 30640544)
复制: 虽然正在为二进制日志重写 SQL 语句,以便敏感信息不会以纯文本形式出现,但如果使用
SHOW PROCESSLIST
语句检查查询,则查询在写入二进制文件时可能会损坏日志,导致复制停止。重写查询的过程现在是私有的,只有在重写完成时才会更新查询线程。(错误#30569003、错误#97531、错误#30654405)复制: 当一个
GRANT
或REVOKE
语句只被部分执行时,一个事件事件被记录在二进制日志中,这使得复制从的应用程序线程停止,以便从可以手动与主协调。以前,如果失败GRANT
或REVOKE
语句是会话中执行的第一条语句,则不会将 GTID 应用于事件事件(因为会话的缓存管理器尚不存在),从而导致复制从站出错。此外,在发生以下情况时,没有记录任何事件事件GRANT
语句创建了一个用户,但由于权限指定不正确而失败,再次导致复制从站出错。这两个问题现在都已修复。(错误#30566518,错误#30324661)复制: 现在 在服务器启动后启动线程
mysql.gtid_executed
时会thread/sql/compress_gtid_table
(缺陷号 30541799)复制: 无法在具有在高负载条件下运行的组复制的 MySQL 服务器上访问性能架构表。(错误#30112711,错误#30675790)
复制: 如果它们与组成员的更改同时发生,则从组复制到性能模式的内部查询对本地组成员的统计信息失败。改进了内部查询的锁定以解决此问题。(错误#30049349,错误#30791583,错误#30963553)
复制: 如果复制从站与主站意外断开连接,则可能不会从已注册从站列表中删除对主站转储线程的引用,在这种情况下,访问从站列表的语句将失败。该问题现已解决。(漏洞#29915479)
Replication: 当涉及分区表时,服务器没有正确处理行事件由于缓存空间不足而无法写入二进制日志的情况。在这种情况下,现在会返回一个适当的错误。(缺陷号 29848931)
复制: 在 Group Replication 的分布式恢复过程中,如果加入成员无法与组中的任何捐赠者完成远程克隆操作,它会使用来自捐赠者二进制日志的状态传输来检索所有需要的数据。但是,如果最后一次尝试的远程克隆操作被中断并使加入成员的数据不完整或没有数据,则之后立即进行状态转移的尝试也可能会失败。在远程克隆操作失败后尝试状态转移之前,Group Replication 现在会检查远程克隆操作是否未达到从加入成员中删除本地数据的阶段。如果删除了数据,
group_replication_exit_state_action
系统变量。(错误#29669099,错误#29944828)复制: 在设置
binlog_format=MIXED
、tx_isolation=READ-COMMITTED
和binlog_row_image=FULL
,涉及事务存储引擎的INSERT ... SELECT
查询从写入二进制日志的行映像中省略了任何具有空值的列。发生这种情况是因为在处理INSERT ... SELECT
语句时,在选择二进制日志记录格式之前列被标记为插入。该问题现已解决。(缺陷 #29110804,缺陷 #93423)复制: 在某些情况下,条件注释的复制可能会失败。(缺陷号 28388217)
复制: 在采取某些行动之前,Group Replication 检查服务器上正在运行哪些事务。以前,用于此检查的服务不计算处于提交阶段的事务,这可能导致操作超时。现在,处于提交阶段的事务包含在当前正在进行的事务集中。(缺陷号 28327838)
-
JSON: 当在严格模式下
JSON_TABLE()
用作语句的一部分时子句处理的转换错误都可能导致 被拒绝。由于错误由子句处理实际指定 ,否则不应拒绝该语句INSERT
ON ERROR
INSERT
ON ERROR
ERROR ON ERROR
此问题通过在将值转换为目标类型(如果已指定或隐含)
NULL ON ERROR
时 忽略警告来解决。DEFAULT ... ON ERROR
(缺陷号 30628330) -
JSON:在视图中使用时 ,输出
JSON_TABLE()
并不总是正确的。此修复更正了以下问题:列名未被引用,导致在需要引用时出现语法错误。
某些列类型被误报。
某些列类型属性(例如 UNSIGNED)丢失了。
列字符集和排序规则丢失。
(缺陷号 30263373)
JSON: 函数
JSON_SCHEMA_VALID()
和JSON_SCHEMA_VALIDATION_REPORT()
以前检查以确保JSON
每次执行包含这些的准备好的语句时它们的参数都可以转换,这既不高效也没有必要。现在在这种情况下,检查仅在语句准备好时执行一次。(缺陷 #97878,缺陷 #30622327)DEFINER
对于具有 特权 的存储对象,特权要求检查不正确SYSTEM_USER
。(缺陷号 31077699)Clang 在从 MySQL 源生成的文档中报告的一些错误已得到纠正。(缺陷号 30956093)
在 FreeBSD 上,krb5 包现在是一个依赖项。(缺陷号 30887620)
如果查询包含对同一个公用表表达式 (CTE) 的多个引用,并且伪注释跨越了 CTE 定义的边界,则解析器会失败并显示令人困惑的语法错误消息。(缺陷号 30871301)
对于使用 Debian 软件包的安装,
/var/run/mysqld
没有创建目录。(缺陷 #30855015,缺陷 #98484)当 SQL 语句返回错误时, mysqlslap没有正确关闭它的线程。这可能会导致尝试释放已释放的内存。(缺陷号 30850310)
当 X 插件试图在重复键的情况下将文档作为插入或更新添加到集合中时,如果文档在主键以外的字段中未通过唯一键约束,则返回错误X Plugin 没有说明这是问题的原因。现在返回适当的错误。(缺陷号 30843865)
由解析器中的转换生成的整数值被提供给需要布尔值的测试。(缺陷号 30837240)
使用
IN
表达式访问一个或多个包含大字符串值的列的查询可能会导致内存泄漏。(缺陷号 30814171)DELETE
当 a 的目标是公用表表达式 时,语句无法正常工作 。(漏洞 #30796015,漏洞 #98330)create_admin_listener_thread
启用和不 启用 启动服务器admin_address
导致服务器关闭过程中异常退出。(缺陷号 30785609)当一个表在同一列上同时具有主键和辅助键,但长度不同时,范围优化器会在辅助索引中选择错误的键部分来比较范围值。(缺陷号 30783011)
在某些情况下,当
DISTINCT
与参数类型不正确的聚合函数一起使用时导致的错误未正确传播。(缺陷号 30782687)对于使用压缩的复制,如果主服务器重新启动,从服务器可以提出断言。(缺陷号 30774692)
对于调试版本,服务器可能会退出尝试打印优化器跟踪。(错误#30773218,错误#98258)
C API 函数表现出
mysql_real_connect_nonblocking()
阻塞行为。(缺陷号 30771233)如果处于活动状态,在
LOCK TABLES
处理INFORMATION_SCHEMA
查询时,服务器可能会尝试锁定内部临时表(不需要锁),从而引发断言。(错误#30764651,错误#98221)mysqldump 内部网络超时从 700 秒增加到 86400 秒,以适应连接到繁忙或无响应的服务器。(缺陷 #30755992,缺陷 #98203)
配置时 无意中导致链接到插件中。(缺陷号 30755301)
-DWITH_SASL=
path/to/custom/installation
libsasl
daemon_memcached
删除与窗口函数的帧缓冲区关联的临时表后,帧缓冲区的临时表参数未被清理,导致与复制字段关联的字符串缓冲区无法正常释放。(缺陷号 30752366)
-libs-compat
RPM 包现在是用系统构建的, 以zlib
避免在libmysqlclient.so.18
. (缺陷 #30722389,缺陷 #98130)服务器过早退出直方图采样,导致断言失败。删除了标记采样操作完成的不必要的布尔变量。(缺陷号 30717778)
由于其中一个参与条件始终为假而删除
WHERE
条件时,未正确清理物化派生表,从而导致内存泄漏。(缺陷号 30712243)-
具有相同
GEOMETRY
值的多重比较并不总是能正确处理。(缺陷号 30697042)参考资料:另请参阅:Bug #30306306。
MIN()
如果添加了包含子查询的子句,则MAX()
可能会为某些查询返回不正确的值。(漏洞 #30691682,漏洞 #98047)WHERE
IN ()
如果在启动时启用了 MySQL Enterprise Firewall 但缺少白名单和用户表,则服务器启动失败。(缺陷号 30690181)
对于准备好的语句,如果仍在引用已清理的具体化临时表,则重新执行可能会导致服务器退出。(缺陷号 30674598)
ER_WARN_DEPRECATED_SQL_CALC_FOUND_ROWS
和ER_WARN_DEPRECATED_FOUND_ROWS
错误消息被错误地归类在要写入错误日志的消息范围内 。 它们现在被正确归类为要发送给客户端的消息。旧错误现在被指定为 错误日志消息OBSOLETE_ER_WARN_DEPRECATED_SQL_CALC_FOUND_ROWS
的OBSOLETE_ER_WARN_DEPRECATED_FOUND_ROWS
范围。(缺陷号 30673043)子查询中的某些连接使用了外部查询
EXISTS
或未NOT EXISTS
始终正确处理。(缺陷号 30671329)允许 使用查询,但此类子句不应对结果产生任何影响;此类查询并不总是得到正确处理。(缺陷号 30669493)
ORDER BY
constant
ORDER BY
缺少越界签入
wild_case_match()
导致指针读取越界。(缺陷号 30668886)该函数对于和 字符串
strconvert()
之间的转换不安全。(缺陷号 30668847)filename
utf8_general_ci
某些使用固定长度键的文件排序并不总能得到正确处理。(缺陷号 30665034)
当对两个可能非常大的字符串列(特别是
BLOB
具有PAD SPACE
排序规则的列)执行散列连接时,MySQL 将整个排序键存储在行中,这会因需要大量内存而影响性能。现在只存储排序规则感知哈希,添加的相等性比较可防止错误答案,即使在 64 位哈希冲突的情况下也是如此。(缺陷号 30664831)当至少两个表使用半连接连接到至少两个其他表,并且连接优化器选择使用松散扫描时,可能会将左侧的两个表都放在重复数据删除嵌套循环迭代器下方,从而导致过度重复数据删除。我们通过将跨多个表的松散扫描视为单独的内部结构来解决此问题。(缺陷号 30659810)
在一个
const
表和零个或多个已知零表达式的联合中,只有一行的派生表可能会被错误地读取为零行。(错误#30655712,错误#97967)-
MySQL 8.0.19 补丁设置了无效的
INFORMATION_SCHEMA
数据字典版本号。添加了断言代码以防止将来的版本信息错误。(错误#30645158,错误#97948)参考:这个问题是 Bug #29871530 的回归。
在设置迭代器树时,优化器现在会过滤掉并随后忽略已知是微不足道的条件。(缺陷号 30644591)
-
在某些情况下,
SHOW COLUMNS
临时MERGE
表可能会引发断言或导致服务器退出。(缺陷号 30640463)参考资料:此问题是 Bug #28811287、Bug #92834 的回归。
事件调度程序有内存泄漏。(缺陷号 30628268)
使用异步 C API 函数可能导致释放已释放的内存。(错误#30596999,错误#97805)
在包含
CHECK
约束的表上,由于过多的内存分配和性能模式调用,某些简单查询效率低下。(缺陷号 30594613)在某些情况下,memcached 命令可能会导致读取未初始化的内存缓冲区,从而导致失败。(缺陷号 30592346)
InnoDB
在填充时发出对架构和表元数据的请求与 删除架构 之间可能会发生竞争条件INFORMATION_SCHEMA.INNODB_TABLES
,从而导致用户查询INNODB_TABLES
报告错误。(缺陷号 30591967)客户端库可能会被恶意服务器引入无限循环。(缺陷号 30581726)
在所有当前帐户连接终止(如果有)之前,用于重置
ALTER USER
帐户MAX_USER_CONNECTIONS
值不会生效。(错误#30578217,错误#97735)当优化器设置一个 weedout 时,它会通知属于 weedout 一部分的所有表它们应该提供行 ID。对于融合的 weedouts(weedouts 最多返回一行),优化器期望执行器处理没有行 ID 的 weedout。在迭代器执行器中,使用
LIMIT 1
; 正常的 weedout 迭代器不处理汇合的 weedouts,因此总是需要行 ID。如果在外部连接的右侧出现融合清除,则融合清除被作为正常清除处理,导致迭代器执行程序在表未提供行 ID 的情况下请求行 ID。现在在这种情况下,LIMIT 1
优化也被应用。(错误#30566549,错误#30282693)SET PERSIST
可能会因为试图将变量持久化到错误的目录而失败。(缺陷号 30561982)在为访问不存在的表的错误条件定义错误处理程序的存储程序中,如果表不存在则不会调用处理程序,因为它是在不存在的数据库中命名的。(漏洞 #30561920,漏洞 #97682)
MySQL 采用的重复清除优化策略(请参阅使用半连接转换优化 IN 和 EXISTS 子查询谓词)使用它已经看到的行 ID 的内部表,并在包含这些 ID 的列上使用唯一索引。当唯一索引的键变得太大时(这可能发生在非常大的行 ID 上),服务器恢复为通过散列键进行重复数据删除,与其他临时表一样,仅在散列字段上使用单独的索引(不是唯一的)。由于后一个索引未正确初始化,受影响的查询未正确执行并可能导致过早退出。(缺陷号 30556257)
对于调试版本,在 下
LOCK TABLES
,服务器可能会错误处理物化临时表并引发断言。(错误#30476213,错误#97404)物化查询块的内部数组
SELECT_LEX_UNIT::m_query_blocks_to_materialize
在执行之间没有重置,这意味着它指向的对象在第二次执行准备好的语句时不再有效,导致第二次执行失败。(缺陷号 30438038)在服务器重新启动之前,更改列排序规则不会影响唯一索引。(漏洞 #30386119,漏洞 #97103)
使用角色时,
EXECUTE
存储函数的特权被视为存储过程的特权。因此,无法EXECUTE
用作函数的角色特权。(缺陷号 30376231)包含列值用作非确定性函数的输入的条件的具体化子查询产生了不正确的结果。(缺陷号 30368937)
InnoDB
对memcached 插件 进行了多项修复。这些修复解决了潜在的死锁问题、与连接列表闩锁相关的问题以及删除过时的刷新互斥体。(缺陷号 30354225)使用
utf8mb4_0900_bin
排序规则的字符串无法与utf8mb4
使用不同排序规则的字符串进行比较。现在比较是通过utf8mb4_0900_bin
对两个字符串使用来完成的。(缺陷号 30350111)在优化过程中,MySQL 删除了所有参数都被认为相等的条件;例如,
1 <> 1
被删除并替换为false
。在这样做的过程中,包含非确定性参数的条件也被删除,这导致了一个RAND() < RAND()
被认为是不可能的条件。现在,优化器不再删除包含不确定参数的条件。(缺陷号 30311271)删除事件可能会扰乱事件的安排。(漏洞 #30301356,漏洞 #96849)
Event Scheduler 报告了 Valgrind 构建的警告。(缺陷号 30301340)
在使用克隆插件时关闭服务器引发了 Valgrind 错误。(缺陷号 30248419)
如果
mysqld-auto.cnf
文件格式错误,则服务器不会启动(预期),但不会报告任何错误(意外)。(漏洞 #30169731,漏洞 #96501)UPDATE
在并非所有匹配行都更新的情况下,语句可能会给出不一致的匹配行数(找到的行),具体取决于未更新行的原因。例如,由于通过带有WITH CHECK OPTION
子句的视图更新而未更新的行不计为匹配行,而由于失败而未更新的行CHECK CONSTRAINT
被计入。为了保持一致性,不符合WITH CHECK OPTION
子句的行现在被计为匹配行。(缺陷号 30158954)在克隆的目录上重新启动 MySQL 服务器时,
InnoDB
报错指出它找不到先前被服务器删除的统计表的表空间文件。(缺陷号 30093799)服务器未正确处理
UNION
其中一个查询包含使用 的子查询ORDER BY
。(漏洞#29952565)对于
INFORMATION_SCHEMA
查询,竞争条件可能导致在更新动态统计表时多次尝试插入键,从而产生重复键错误。(缺陷 #29948755,缺陷 #95929)SHOW CREATE VIEW
对于在返回字符串的函数上定义的视图,可能会因非法混合排序规则而失败。(漏洞#29904087)删除线程时,性能模式可能无法删除线程检测。(漏洞 #29859605)
-
WHERE
未正确处理带有其谓词包含科学记数法数值 的子句的查询。此外,当字符串到整数的转换不成功时,尝试插入指定为字符串的特定整数会导致服务器退出。(错误#29723340,错误#30441969)
添加了一个内部接口,用于检索和解析在捐赠者 MySQL 服务器实例上发生的错误(
ER_CLONE_DONOR
错误),并用于检查接收者的数据是否已被删除。(漏洞#29682642)值时无法从表中删除任何列
DEFAULT
。(漏洞#29661106)对于
CONNECTION_CONTROL
插件,性能模式检测使用的键是性能模式无法发现的,除非相关代码实际执行。(漏洞#29539976)对于可为 null 的列
c
,优化器现在可以识别条件c < c
、c > c
和c <> c
始终为 false 并且不需要对每一行进行评估。感谢 Daniel Black 的贡献。(对于不可为空的列,优化器已经识别出始终为假的条件。)(缺陷 #29115386,缺陷 #93642)从中重新初始化字符集
Index.xml
可能会导致释放后使用错误。(缺陷 #28956360,缺陷 #93276)-
为减少性能架构内存检测开销而进行的早期更改具有导致组复制性能下降的意外效果。(漏洞#28719976)
参考:这个问题是 Bug #27500610 的回归。
sys
模式ps_setup_reset_to_default()
过程使用 MySQL 5.7 默认值,而不是 MySQL 8.0 默认值 。(缺陷号 27636611)某些连接加密密码不起作用。(漏洞 #27045306)
-
以前,mysqlpump 从选项文件中读取
[mysql_dump]
和组。mysqlpump现在另外读取该组。该 组仍被接受但已弃用。(漏洞 #24733245,漏洞 #83144)[client]
[mysqlpump]
[mysql_dump]
对于 形式的查询
SELECT DISTINCT ... ORDER BY ...
,当ORDER BY
被下推到连接中的第一个表时,结果并不总是按正确的顺序排序。(缺陷 #98217,缺陷 #30760534)-
NULL
对于用作可变长度键的项目, 该指示符未正确编写,因此所有此类项目都被假定为 notNULL
,这在使用某些排序规则时被视为等于空字符串。此问题的一个明显影响是,有时无法正确执行使用可空字符串的表达式排序。此处显示了此类查询的示例,其中列c1
包含两个NULL
字符串值和空字符串值:SELECT c1, SUBSTR(c1, 1) AS c2 FROM t ORDER BY c2;
(缺陷 #98035,缺陷 #30687020)
-
当
GROUP BY
子句中的表达式使用的列名与创建包含此列的表时用于列名的大小写不同时,查询返回不准确的结果。这方面的一个例子是,尽管原始语句中GROUP BY id
显示的列名是,但查询使用了。CREATE TABLE
ID
这是因为,服务器对表达式中的列名与表中的列名进行了区分大小写的比较。此问题已通过确保按预期以不区分大小写的方式执行此类比较来解决。(错误#97628、错误#98222、错误#30541701、错误#30761372)
更新连接到连接两个其他表的派生表的表的多表
UPDATE
语句没有像在 MySQL 5.6 中那样正确优化,而是被视为好像STRAIGHT_JOIN
已与创建派生表的子查询一起使用。(缺陷 #97418,缺陷 #30488700)EXPLAIN
现在使用hash join
instead ofblock nested loop
,因为后者不再存在并且在几乎所有情况下都被散列连接取代。(缺陷 #97299,缺陷 #30444550)在复合哈希索引的第一列上过滤的查询的执行计划错误地使用了该索引,从而产生了错误的结果。(缺陷 #94737,缺陷 #29527115)
-
ON
在 a 的条件下 对外部查询块表中的列的引用JOIN
不起作用,并且只能在 a 中使用WHERE
。此问题的修复意味着像这样的查询现在可以正常工作:SELECT o.order_date FROM orders o WHERE o.order_date IN ( SELECT c.contact_name FROM customers c INNER JOIN order_details od ON o.order_id = od.discount );
以前这必须重写,如下所示:
SELECT o.order_date FROM orders o WHERE o.order_date IN ( SELECT c.contact_name FROM customers c INNER JOIN order_details od ON 1 WHERE o.order_id = od.discount );
FROM
对与 相同子句的 其他表的引用JOIN
,如在查询SELECT * FROM t1 CROSS JOIN (t2 LEFT JOIN t3 ON t1.c=3)
中,不是外部引用并且仍然被禁止。在这种情况下,需要横向连接,如下所示SELECT * FROM t1 JOIN LATERAL (SELECT * FROM t2 LEFT JOIN t3 ON t1.c=3)
:(错误#35242、错误#96946、错误#11748138、错误#30350696) 用于构建服务器的 OpenSSL 版本与用于 MySQL 其他部分(例如库或插件)的版本之间可能存在不匹配。这可能会导致某些功能无法工作,例如 LDAP 身份验证插件。现在,相同版本的 OpenSSL 用于构建所有内容。
-
MySQL 8.0 中以前的工作是优化不可能的表达式,例如当此类表达式
a=b AND FALSE
作为FALSE
外部连接条件出现时可能会降低执行效率,因为连接被解释为笛卡尔积后跟过滤器。(错误#8202、错误#89739、错误#97552、错误#11745046、错误#27581277、错误#30520749)参考资料:另请参阅:Bug #98206、Bug #30756135。