此版本增加了对 macOS 11 (Big Sur) 的支持。
-
授予
RELOAD
特权使用户能够执行各种操作。在某些情况下,用户可能希望能够仅执行这些操作中的一部分。为了使 DBA 能够避免授予RELOAD
和定制用户权限,使其更接近允许的操作,可以使用这些范围更有限的新权限:新特权仅适用于全球级别。有关详细信息,请参阅MySQL 提供的权限和 FLUSH 语句。
mysql_refresh()
C API 函数执行类似于各种 语句 的操作FLUSH
,但不受此更改的影响。RELOAD
无论调用它的操作是什么, 它仍然需要 特权。
-
对于某些应用程序,在每个查询的基础上定义元数据可能很有用。示例包括生成查询的页面的 URL,或与查询一起传递以供插件(例如审计插件或查询重写插件)使用的额外处理信息。MySQL 现在支持此功能,无需使用变通方法,例如在查询字符串中包含特殊格式的注释:
在客户端,
mysql_bind_param()
C API 函数支持定义查询属性。这些属性适用于发送到服务器执行的下一条 SQL 语句。此外,mysql和 mysqltest客户端有一个query_attributes
命令可以定义查询属性。在服务器端,组件服务提供对查询属性的访问。名为的组件
query_attributes
使用此服务来实现mysql_query_attribute_string()
可加载功能,该功能可以在 SQL 语句中获取属性值。该query_attributes
组件是可选的,但必须安装才能使用该功能。
有关详细信息,请参阅查询属性。
感谢 Facebook 提出这个想法(并贡献代码,尽管没有使用)。(错误#27855905,错误#28686334)
选择与传入 TCP 客户端连接匹配的帐户可能会受到帐户创建顺序的影响。为了使匹配算法更具确定性,匹配帐户的主机名部分现在会在尝试匹配使用主机名指定的帐户之前,以特定顺序检查使用主机 IP 地址指定的帐户。主机名匹配保持不变。请参阅访问控制,第 1 阶段:连接验证。
-
从 MySQL 8.0.23 开始,该语句
CHANGE MASTER TO
已弃用。CHANGE REPLICATION SOURCE TO
应该改用别名 。该语句的参数还有用 term 替换 termMASTER
的别名SOURCE
。例如,MASTER_HOST
andMASTER_PORT
现在可以输入为SOURCE_HOST
andSOURCE_PORT
。该START REPLICA | SLAVE
语句的参数 现在有了别名MASTER_LOG_POS
和 SOURCE_LOG_FILE。这些语句的工作方式与以前相同,只是每条语句使用的术语发生了变化。如果使用旧版本,则会发出弃用警告。MASTER_LOG_FILE
SOURCE_LOG_POS
添加了一个新的状态变量,
Com_change_replication_source
作为Com_change_master
状态变量的别名。语句的旧版本和新版本都更新状态变量的旧版本和新版本。CHANGE MASTER TO
服务器将所有语句 重写为CHANGE REPLICATION SOURCE TO
查询日志中的语句。语句START SLAVE
、STOP SLAVE
、SHOW SLAVE STATUS
和SHOW SLAVE HOSTS
也是 如此RESET SLAVE
。语句的事件名称 在语句历史表中CHANGE MASTER TO
设置为。statement/sql/change_replication_source
(缺陷号 32145023) 用户定义的
gen_blacklist()
函数已弃用。使用gen_blocklist()
instead,它执行相同的术语替换操作。系统变量的使用
master_info_repository
现已relay_log_info_repository
弃用,如果您尝试设置它们或读取它们的值,则会发出警告消息。系统变量将在未来的 MySQL 版本中删除。这些系统变量用于指定副本的连接元数据存储库和应用程序元数据存储库是写入InnoDB
mysql系统数据库中的表,还是写入数据目录中的文件。该FILE
设置在以前的版本中已被弃用,表是 MySQL 8.0 中复制元数据存储库的默认设置。-
可以使用以下任何方法刷新主机缓存:
执行截断性能模式表的
TRUNCATE TABLE
语句 。host_cache
这需要DROP
表的特权。执行
FLUSH HOSTS
语句。这需要RELOAD
特权。执行mysqladmin flush-hosts命令。这需要
RELOAD
特权。
尽管这些方法在效果上是等同的,但授予
RELOAD
特权可以启用除主机缓存刷新之外的许多其他操作,这从安全角度来看是不可取的。最好为表授予DROP
权限,host_cache
因为它的范围更有限。因此,该FLUSH HOSTS
语句已弃用,并将在未来的 MySQL 版本中删除。相反,截断host_cache
表。mysqladmin flush-hosts先前执行了一条
FLUSH HOSTS
语句。现在它尝试截断仅在截断操作失败host_cache
时回退FLUSH HOSTS
-
管理员通过注册配置文件来执行 MySQL Enterprise Firewall 管理,这些配置文件为允许的语句(白名单)指定规则集。以前,配置文件只能与单个帐户相关联,因此,要将给定的白名单应用到多个帐户配置文件,必须为每个配置文件复制规则集。为了更轻松地管理和更大的灵活性,防火墙现在提供组配置文件功能:
可以创建命名组配置文件。一个组配置文件可以包含多个帐户作为成员,一个帐户可以是多个组配置文件的成员。
每个组配置文件都有自己的白名单。配置文件白名单适用于所有成员账户,无需在多个账户配置文件中重复。
有关详细信息,请参阅MySQL 企业防火墙。
-
将用于哈希连接的哈希表从无序多图切换为使用多图适配器实现的无序平面图。此更改产生以下改进:
更快的哈希表
由于更少的哈希表开销,更少的内存使用,用于对齐和键/值长度的空间更少,以及更多相同键的更好的内存使用;这也应该减少需要溢出到磁盘的频率
通过更接近允许的连接缓冲区大小而不是有效地限制为大约 2/3 的大小
join_buffer_size
,以及通过在哈希表增长时可以释放旧内存来 更好地控制内存
(缺陷 #99933,缺陷 #31516149)
以前扩展为动态调用的性能架构宏现在尽可能扩展为静态调用以减少处理开销。(缺陷号 32028160)
计时器代码的性能开销减少了。这对于使用 Performance Schema 的高并发工作负载应该是最有利的。感谢 Georgy Kirichenko 的贡献。(漏洞 #31960377,漏洞 #101018)
MySQL 企业版 SASL LDAP 身份验证插件现在支持
SCRAM-SHA-256
作为 MySQL 客户端和服务器的身份验证方法。SCRAM-SHA-256
类似SCRAM-SHA-1
但更安全。使用SCRAM-SHA-256
需要使用 Cyrus SASL 2.1.27 或更高版本构建的 OpenLDAP 服务器。请参阅 LDAP 身份验证方法。
对于捆绑了 OpenSSL 库的平台,用于 MySQL Server 的链接 OpenSSL 库已更新到版本 1.1.1i。在https://www.openssl.org/news/cl111.txt和 https://www.openssl.org/news/vulnerabilities.html中描述了新 OpenSSL 版本中修复的问题 。(缺陷号 32260610)
新的
ST_HausdorffDistance()
和ST_FrechetDistance()
函数返回两个几何之间的离散 Fréchet 和 Hausdorff 距离,反映了几何的相似程度。请参阅 使用对象形状的空间关系函数。
MySQL 现在支持不可见的列,这些列通常对查询是隐藏的,但如果明确引用则可以访问。请参阅 不可见的列。
对于使用身份验证方法的 X Protocol 连接
MYSQL41
,如果服务器发送的 nonce 小于 20 字节,则连接逻辑无法正确处理。(缺陷号 32036194)如果构建结果集的查询被终止,X Plugin 将这解释为服务器会话已被终止,并断开连接。查询的状态现在与服务器会话的状态分开检查。(缺陷号 31954296)
如果 X 协议会话试图在释放和重置另一个 X 协议会话的同时显示 X 插件状态变量或设置,则可能会发生死锁。目前情况已得到妥善处理。(缺陷号 31931873)
-
如果连接到服务器的 X 协议客户端保持空闲(不发送到服务器)的时间超过相关的 X 插件超时设置(读取、写入或等待超时),X 插件将关闭连接。在读取超时的情况下,插件会向客户端应用程序返回错误代码为 ER_IO_READ_ERROR的警告通知。
从 MySQL 8.0.23 开始,如果连接由于服务器关闭或连接被另一个客户端会话终止而主动关闭,X 插件现在也会发送警告通知。在服务器关闭的情况下,警告通知将发送到所有具有打开连接的经过身份验证的 X 协议客户端,并带有ER_SERVER_SHUTDOWN错误代码。在连接终止的情况下,将向相关客户端发送带有 ER_SESSION_WAS_KILLED错误代码的警告通知,除非连接在 SQL 执行期间被终止,在这种情况下会返回带有 ER_QUERY_INTERRUPTED错误代码的致命错误。
客户端应用程序可以使用警告通知向用户显示,或分析断开连接的原因并决定是尝试重新连接到同一服务器还是不同的服务器。
对于经典的 MySQL 协议,如果 SQL 查询使用元数据锁定或休眠功能,则会定期检查与服务器的连接以验证它是否仍然存在。如果不是,可以停止查询,这样它就不会继续消耗资源。以前,X Protocol 不执行这些检查,并假设连接仍然存在。现在已为 X 协议添加了检查。
-
InnoDB: 以下操作的性能得到改进:
在具有大型缓冲池 (>32GB) 的 MySQL 实例上删除大型表空间。
删除具有从自适应哈希索引引用的大量页面的表空间。
截断临时表空间。
当在正常操作期间遇到页面时,删除或截断表空间的页面和关联的 AHI 条目现在从缓冲池中被动删除。以前,删除或截断表空间会启动完整列表扫描以立即从缓冲池中删除页面,这会对性能产生负面影响。(缺陷 #31008942,缺陷 #98869)
-
InnoDB: 新
AUTOEXTEND_SIZE
选项定义了InnoDB
当表空间变满时扩展表空间大小的量,从而可以以更大的增量扩展表空间大小。以更大的增量分配空间有助于避免碎片并促进大量数据的摄取。、 、 和 语句AUTOEXTEND_SIZE
支持 该 有关详细信息,请参阅 表空间 AUTOEXTEND_SIZE 配置。CREATE TABLE
ALTER TABLE
CREATE TABLESPACE
ALTER TABLESPACE
表中添加了
AUTOEXTEND_SIZE
尺寸列INFORMATION_SCHEMA.INNODB_TABLESPACES
。 InnoDB:
InnoDB
现在支持对属于加密表空间的双写文件页进行加密。使用关联表空间的加密密钥对页面进行加密。有关更多信息,请参阅 InnoDB 静态数据加密。InnoDB:
InnoDB
修改了原子代码以使用 C++std::atomic
。--all-databases
当使用该选项 调用时 , mysqldump现在首先转储 mysql数据库,因此当重新加载转储文件时DEFINER
,其他对象的子句中命名的任何帐户都已经创建。(缺陷号 32141046)识别并消除了禁用性能模式和
LOCK_ORDER
工具检测的一些开销。(缺陷号 32105698)对于具有默认值表达式的
BLOB
和列,表和语句现在显示该表达式。(缺陷号 31856459)TEXT
INFORMATION_SCHEMA.COLUMNS
SHOW COLUMNS
-
对于多线程副本(其中
slave_parallel_workers
大于 0),设置slave_preserve_commit_order=1
确保事务在副本上按照它们在副本的中继日志中出现的相同顺序执行和提交。每个正在执行的工作线程在提交之前等待,直到所有先前的事务都已提交。如果工作线程由于检测到可能的死锁或因为事务的执行时间超过了相关的等待超时而未能执行事务,它会自动重试指定的次数slave_transaction_retries
before stopped with error。不会重试具有非临时错误的事务。多线程副本上的复制应用程序始终处理由相关存储引擎识别的数据访问死锁。但是,复制应用程序未检测到其他一些类型的锁,例如涉及访问控制列表 (ACL) 或元数据锁定的锁(例如,
FLUSH TABLES WITH READ LOCK
陈述)。这可能导致提交顺序锁定的三角色死锁,复制应用程序无法解决,并导致复制无限期挂起。从 MySQL 8.0.23 开始,对保留提交顺序的多线程副本的死锁处理得到了增强,以减轻这些类型的死锁。死锁不是由复制应用程序专门解决的,但应用程序知道它们并启动事务的自动重试,而不是挂起。如果重试次数用尽,复制将以受控方式停止,以便可以手动解决死锁。(错误#107574,错误#34291887) 二进制日志校验和的 CRC 计算在 ARM 平台上更快。感谢 Krunal Bauskar 的贡献。(错误#99118、错误#31101633、错误#32163391)
-
MySQL Server 的异步连接故障转移机制现在支持 Group Replication 拓扑,通过自动监控组成员的变化并区分主服务器和辅助服务器。当您将组成员添加到源列表并将其定义为托管组的一部分时,异步连接故障转移机制会更新源列表以使其与成员更改保持一致,并在组成员加入或离开时自动添加和删除组成员。新的
asynchronous_connection_failover_add_managed()
和asynchronous_connection_failover_delete_managed()
功能用于添加和删除托管源。在以下情况下,连接会故障转移到另一个组成员:
当前连接的源离线或离开组。
当前连接的源不再占多数。
当前连接的源在组中没有最高的加权优先级。
对于托管组,源的权重根据它是主服务器还是辅助服务器来分配。因此,假设您将托管组设置为为主节点赋予更高的权重并为辅助节点赋予更低的权重,那么当主节点发生变化时,更高的权重将分配给新的主节点,因此副本会通过与它的连接进行更改。这也适用于单个(非托管)服务器,因此如果另一个具有更高加权优先级的源服务器可用,则单个服务器的连接现在也会进行故障转移。
-
现在可以使用 语句的
ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
选项将复制通道设置为将 GTID 分配给还没有 GTID 的复制事务。CHANGE REPLICATION SOURCE TO
此功能支持从不使用基于 GTID 的复制的源复制到使用的副本。对于多源副本,您可以混合使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
和不使用 的通道。GTID 可以包括副本自己的服务器 UUID 或您分配的服务器 UUID,用于识别来自不同来源的事务。请注意,在需要故障转移的情况下,无法提升在任何通道上设置的副本
ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
以替换复制源服务器,并且无法使用从副本获取的备份来恢复复制源服务器。ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
同样的限制适用于替换或恢复在任何通道上使用的其他副本 。来自副本设置的 GTID 集 (gtid_executed)ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
是非标准的,不应传输到另一台服务器,或与另一台服务器的gtid_executed
集进行比较。 新变量定义了 TempTable 存储引擎在开始将数据存储到磁盘上的内部临时表
temptable_max_mmap
之前允许从内存映射临时文件分配的最大内存量 。InnoDB
设置为 0 将禁用从内存映射临时文件分配内存。有关详细信息,请参阅 MySQL 中的内部临时表使用。
InnoDB:在不支持打孔的系统上允许
CREATE TABLE
指定 的COMPRESSION
该操作现在失败并出现错误。(缺陷号 32174200)InnoDB: 在数据加载操作正在进行时启动的升级后 MySQL 数据库系统重新启动引发了断言失败。(缺陷号 32173596)
InnoDB: 有关检查点之间同一撤消表空间上的截断操作数的错误消息错误地指示了 64 的限制。在 MySQL 8.0.22 中,该限制从 64 提高到 50,000。(错误#32151601,错误#101601)
InnoDB:
rw_lock_t
减少了buf_block_t
源代码结构的大小。(缺陷号 32084500)InnoDB: 在对表进行操作的查询表达式
InnoDB
创建表后,事务变得不一致。(缺陷号 32079103)InnoDB
InnoDB
-
InnoDB: 在某些情况下,例如当现有间隙锁从已删除记录继承锁时,
INFORMATION_SCHEMA.INNODB_TRX
表中出现的锁数可能与实际记录锁数不同。感谢阿里巴巴的 Fungo Wang 提供补丁。(错误#32068538,错误#101305)
InnoDB:
Fil_system
更正了分片代码中 一错误,MAX_SHARDS
) 更改为 69。(错误 #32052821,错误 #101260)InnoDB: TempTable 存储引擎内存分配器不必要地分配了额外的内存块。(缺陷号 32018553)
-
InnoDB:
SELECT COUNT(*)
由于不必要的 I/O,对包含未提交数据的表的操作执行不佳 。感谢 Brian Yue 的贡献。(错误#31997733,错误#100966)
InnoDB: 关闭日志编写器时的竞争条件引发了断言失败。(缺陷号 31997362)
InnoDB: 页面清理器线程在同步刷新模式下未得到最佳利用,这可能导致页面刷新操作在某些情况下变慢或停止。
InnoDB
当重做日志中的可用空间接近用完时,会出现同步刷新模式 (缺陷号 31994031)InnoDB: 启用撤消日志截断时的高频率更新导致清除滞后。滞后是由于
innodb_purge_rseg_truncate_frequency
选择撤消表空间进行截断时,设置从 128 临时更改为 1。修改设置的代码已被删除。(缺陷号 31991688)-
InnoDB: 撤消表空间的自动截断导致性能下降。为解决此问题,撤消表空间文件现在初始化为 16MB,并至少扩展 16MB。为应对急剧增长,如果前一个文件扩展名发生时间小于 0.1 秒,则文件扩展名大小会加倍。扩展大小加倍可能会发生多次,最大为 256MB。如果前一个文件扩展名早于 0.1 秒出现,则扩展名大小将减少一半,这也可能出现多次,最小为 16MB。以前,撤消表空间的初始大小取决于
InnoDB
页面大小,撤消表空间一次扩展四个区。如果
AUTOEXTEND_SIZE
为撤消表空间定义了该选项,则撤消表空间将AUTOEXTEND_SIZE
根据上述逻辑确定的设置和扩展大小中的较大者进行扩展。undo表空间被截断后,一般会以16MB的大小重新创建,但如果当前文件扩展大小大于16MB,且之前的文件扩展发生在最后一秒内,则新的undo表空间会在四分之一处创建大小由
innodb_max_undo_log_size
变量定义。在下一个检查点不再删除陈旧的撤消表空间页面。相反,页面由
InnoDB
主线程在后台删除。(错误#31965404、错误#32020900、错误#101194) InnoDB:为临时表空间 预
posix_fallocate()
分配空间失败引发错误并导致初始化失败。现在改为发出警告,并InnoDB
回退到posix_fallocate()
预分配空间的非方法。(缺陷号 31965379)InnoDB: 无效指针导致在
DISABLE_PSI_MEMORY
启用源配置选项编译的 MySQL 服务器上关闭失败。(缺陷号 31963333)InnoDB: 由计算给定索引的新统计信息的内部函数持有的长 SX 锁导致失败。(缺陷号 31889883)
InnoDB: 该
INFORMATION_SCHEMA.INNODB_TABLESPACES
表报告FILE_SIZE
某些表和模式的 a 为 0。当关联的表空间不在内存缓存中时,表空间名称用于确定表空间文件名,这并不总是一种可靠的方法。现在改用表空间 ID。使用表空间名称仍然是一种后备方法。(缺陷号 31841617)InnoDB: 删除
FULLTEXT
索引并重命名表以将其移动到新模式后,FULLTEXT
辅助表未相应重命名并保留在旧模式目录中。(错误#31773368,错误#100570)InnoDB: 升级到 MySQL 8.0 后,尝试对之前定义了全文搜索索引的表执行 DML 操作失败。(缺陷号 31749490)
InnoDB: 导入带有页面压缩表的表空间不会报告使用不同
COMPRESSION
设置定义的源表和目标表的架构不匹配错误。导出表的COMPRESSION
设置现在在操作期间保存到.cfg
元数据文件中FLUSH TABLES ... FOR EXPORT
,并且在导入时检查该信息以确保两个表都使用相同的COMPRESSION
设置定义。(缺陷号 31744694)InnoDB: 用于检查 MySQL Keyring 插件是否正常运行的虚拟密钥处于非活动状态,并且非活动虚拟密钥的数量随着时间的推移而增加。现在使用实际的主密钥(如果存在)。如果没有可用的主密钥,则会生成一个虚拟主密钥。(缺陷号 31737924)
InnoDB:
INFORMATION_SCHEMA.FILES
在将系统表空间移出数据目录后 查询InnoDB
会发出警告,指出innodb_system
文件名未知。(缺陷号 31603047)-
InnoDB: 在涉及具有二进制日志记录或
log_slave_updates
禁用的副本的复制场景中,由于表中的间隙过多,服务器无法启动mysql.gtid_executed
。差距出现在同时包含InnoDB
和非InnoDB
事务的工作负载上。事务的 GTID 由定期运行的 GTID 持久线程InnoDB
刷新到而非由副本服务器线程直接写入GTID 持久化线程在循环合并条目和压缩mysql.gtid_executed
InnoDB
mysql.gtid_executed
mysql.gtid_executed
桌子。结果,InnoDB
随着时间的推移,事务的 GTID 刷新列表的大小随着mysql.gtid_executed
表中间隙的数量而增加,最终导致服务器故障和随后的启动失败。为了解决这个问题,GTID 持久线程现在为 事务InnoDB
和非InnoDB
事务写入 GTID,如果 GTID 持久线程落后,前台提交将被迫等待。此外,gtid_executed_compression_period
默认设置从 1000 更改为 0,以mysql.gtid_executed
默认禁用表的显式压缩。感谢 Venkatesh Prasad 的贡献。(错误#31599938,错误#100118)
InnoDB: 为 XA 事务保留 GTID 值会影响 XA 事务性能。为 XA 事务生成两个 GTID 值,一个用于准备阶段,另一个用于提交阶段。第一个 GTID 值被写入撤消日志,随后被第二个 GTID 值覆盖。写入第二个 GTID 值只能在将第一个 GTID 值刷新到
gtid_executed
表后发生。现在在撤消日志中为两个 XA 事务 GTID 值保留了空间。(错误#31467953,错误#99638)InnoDB:
InnoDB
更新了源文件以解决构建 Doxygen 源代码文档时产生的警告。(缺陷号 31354760)InnoDB: 全文搜索同步线程试图从索引缓存中读取先前释放的单词。(缺陷号 31310404)
-
InnoDB:
buf_wait_for_read()
在 MySQL 8.0.17 中引入并行读取功能 的函数中的 20µs 睡眠在此外,还发现 AIO 线程等待操作系统 IO 请求的数量不均匀。(缺陷号 31095274)参考资料:此问题是 Bug #31123564 的回归。
InnoDB: 某些复制的 XA 事务中的清理无法重新附加事务对象 (
trx_t
),这引发了断言失败。(缺陷号 31006095)InnoDB: 由于
ALTER TABLESPACE ENCRYPTION
服务器故障后恢复操作期间出现故障,表空间加密类型设置未正确更新。(错误#30883833,错误#98537)InnoDB: 中断的表空间加密操作在服务器重启后恢复处理时没有更新
encrypt_type
数据字典中的表选项信息。(错误#30883833、错误#98537、错误#30888919、错误#98564)InnoDB:修改了 与线程睡眠延迟和线程进入离开相关的内部计数器变量
InnoDB
以使用 C++std::atomic
。删除了内置的原子操作。感谢来自 ARM 的 Yibo Cai 做出的贡献。(漏洞 #30567060,漏洞 #97704)-
InnoDB: 为字典内存变量 fetch-add(
dict_temp_file_num.fetch_add
) 和 store(dict_temp_file_num.store
) 操作实现了宽松的内存顺序。感谢蔡一波的贡献。(漏洞 #30567054,漏洞 #97703)
InnoDB: 在服务器启动后恢复表空间加密操作的后台线程无法对表空间进行元数据锁定,这允许并发 DDL 操作并导致与启动线程的竞争条件。启动线程现在等待,直到获取表空间元数据锁。(漏洞 #28531637)
InnoDB: 调用
numa_all_nodes_ptr
被numa_get_mems_allowed()
函数取代。感谢 Daniel Black 的贡献。(漏洞 #24693086,漏洞 #83044)-
分区: 当不是分区表
ALTER TABLE t1 EXCHANGE PARTITION ... WITH TABLE t2
时导致断言t1
(错误#100971,错误#31941543)参考:这个问题是 Bug #29706669 的回归。
复制: 不再使用 and 的
network_namespace
参数 这些函数在异步连接故障转移机制的复制通道的源列表中添加和删除复制源服务器。复制通道的网络命名空间是使用 语句管理的,对Group Replication源服务器有特殊要求,因此不再在函数中指定。(缺陷号 32078189)asynchronous_connection_failover_add_source()
asynchronous_connection_failover_delete_source()
CHANGE REPLICATION SOURCE
Replication:设置 系统变量时
transaction_write_set_extraction=XXHASH64
,这是 MySQL 8.0 中的默认设置,也是 Group Replication 的要求,事务的写入集合以前没有大小上限。现在,对于标准源到副本的复制,写入集的数字限制由binlog_transaction_dependency_history_size
被应用,之后写集信息被丢弃但事务继续执行。因为写集信息随后无法用于依赖计算,事务被标记为非并发,并在副本上顺序处理。对于Group Replication,从事务中提取写入的过程需要对所有组成员进行冲突检测和认证,因此如果要完成事务,则不能丢弃写入集信息。应用设置的字节限制group_replication_transaction_size_limit
而不是数字限制,如果超过限制,事务将无法执行。(缺陷号 32019842)复制: 当使用mysqlbinlog的
--print-table-metadata
选项时, mysqlbinlog使用与服务器写入二进制日志时使用的方法不同的方法来评估数字字段,导致与这些字段相关的元数据输出不正确。mysqlbinlog 现在使用与服务器相同的方法。(缺陷号 31956206)复制: 在复制通道中使用网络命名空间时,从副本到主服务器的初始连接中断,后续连接尝试无法使用正确的命名空间信息。(缺陷号 31954087)
复制: 如果 Group Replication applier channel (
group_replication_applier
) 持有表上的锁,例如因为正在进行备份,并且成员被逐出组并尝试自动重新加入,则自动重新加入尝试失败并且没有不重试。现在,Group Replication 在启动和重新加入尝试期间检查group_replication_applier
通道是否已经在运行。如果启动时出现这种情况,则会返回一条错误消息。group_replication_autorejoin_tries
如果在自动重新加入尝试期间出现这种情况,则该尝试失败,但会按照系统变量的指定进行进一步尝试 (缺陷号 31648211)复制: 如果组成员被驱逐并在实例上的某些表被锁定时(例如,在备份运行时)尝试自动重新加入,则尝试失败并且不再进行进一步尝试。现在可以正确处理这种情况。(缺陷号 31460690)
-
复制: 随着从半同步源服务器复制的副本数量增加,锁定争用可能导致性能下降。插件使用的锁定机制已更改为尽可能使用共享锁,避免不必要的锁获取并限制回调。可以通过启用以下系统变量来实现新行为:
replication_sender_observe_commit_only=1
限制回调。replication_optimize_for_static_plugin_config=1
添加共享锁并避免不必要的锁获取。如果要卸载插件,必须禁用此系统变量。
这两个系统变量都可以在安装半同步复制插件之前或之后启用,并且可以在复制运行时启用。半同步复制源服务器也可以从启用这些系统变量中获得性能优势,因为它们使用与副本相同的锁定机制。(缺陷号 30519928)
复制: 在保留提交顺序的多线程副本上,工作线程必须等待中继日志中较早发生的所有事务在提交自己的事务之前提交。如果由于等待提交顺序较晚的事务的线程锁定了提交顺序较早的事务所需的行而发生死锁,则死锁检测算法会向等待线程发出信号以回滚其事务。以前,如果事务重试不可用,则回滚其事务的工作线程将立即退出,而不会向提交顺序中的其他工作线程发出信号,这可能会停止复制。这种情况下的工作线程现在等待轮到它调用回滚函数,这意味着它正确地向其他线程发出信号。(漏洞 #26883680,漏洞 #87796)
复制: GTID 仅在服务器实例上可用,最多为带符号的 64 位整数的非负值数(2 的 63 次方减 1)。如果将 的值设置为
gtid_purged
接近此限制的数字,则后续提交可能会导致服务器用完 GTID 并采取 指定的操作binlog_error_action
。从 MySQL 8.0.23 开始,当服务器实例接近限制时会发出警告消息。(缺陷号 26035544)Microsoft Windows: 在 Windows 上,将 MySQL 服务器作为服务运行会导致共享内存连接失败。(缺陷号 32009251)
JSON:
JSON_ARRAYAGG()
并不总是执行正确的错误处理。(错误#31856260、错误#32012559、错误#32181438)-
JSON:使用、 或 更新
JSON
值 有时可以就地更新目标列。只有当更新操作的目标表是基表时才会发生这种情况,但是当目标表是可更新视图时,更新总是通过写入完整值来执行的。JSON_SET()
JSON_REPLACE()
JSON_REMOVE()
JSON
现在在这种情况下,当目标表是可更新视图时,也会执行就地更新(即部分更新)。(缺陷号 25840784)
-
JSON: 在 MySQL 8.0.22 中完成的工作使准备好的语句只准备一次,这在处理 JSON 函数的动态参数方面引入了回归。所有
JSON
的参数都被归类为数据类型MYSQL_TYPE_JSON
,这忽略了一个事实,即 JSON 函数采用两种 JSON 参数——JSON 值和 JSON 文档——并且这种区分不能只用数据类型来区分。对于错误 #31667405,此问题已针对比较运算符和IN()
运算符解决,方法是可以将 JSON 参数标记为标量值,同时让其他 JSON 函数的参数被视为 JSON 文档。目前的修复为一些 JSON 函数恢复了它们对某些参数作为 JSON 值的处理,如下所列:
第一个论点
MEMBER OF()
JSON_INSERT()
函数、JSON_REPLACE()
、JSON_SET()
、JSON_ARRAY_APPEND()
和 的第三个、第五个、第七个和后续的奇数参数JSON_ARRAY_INSERT()
。(错误#101284,错误#32063203)参考资料:另请参阅:Bug #31667405。
JSON: 当使用运行mysqld时
--debug
,尝试执行使用多值索引的查询会引发错误。(缺陷 #99833,缺陷 #31474182)使用该
thread_pool
插件可能会导致 Address Sanitizer 警告。(缺陷号 32213294)在将条件下推到物化派生表并且条件被部分下推时,在某些情况下,查询转换已将新条件添加到条件中,优化器可能会为保留在条件中的
WHERE
条件调用内部函数fix_fields()
外部查询块。此函数调用的成功返回被误解为错误,导致原始语句静默失败。(缺陷号 32150145)多次调用包含
ALTER TABLE
包含子句的语句的存储过程ORDER BY
可能会导致服务器退出。(缺陷号 32147402)涉及存储程序的准备好的语句可能会导致释放后堆使用内存问题。(错误#32131022、错误#32045681、错误#32051928)
INFORMATION_SCHEMA
对涉及物化派生表 的表的查询可能会失败。(缺陷 #32127562,缺陷 #101504)一个潜在的缓冲区溢出是固定的。感谢 Sifang Zhao 指出问题并提出修复建议(虽然没有使用)。(错误#32113015,错误#101448)
FLOAT
将值 转换为类型值INT
可能会生成未定义的行为消毒剂警告。(错误#32099994,错误#32100033)在多行查询中,
LOAD_FILE()
函数对每一行计算出相同的值。(错误#32096341,错误#101401)通用 Linux tar文件分发版在解包后的文件权限过于严格,需要手动chmod来更正。(缺陷号 32080900)
-
对于调试版本,
SET
在存储过程中包含子查询的准备好的语句可以引发断言。(缺陷号 32078387)参考资料:另请参阅:Bug #32100210。
对于准备好的语句,合法归类混合可能会出现非法归类混合错误。(错误#32077842、错误#101346、错误#32145078、错误#101575)
-
函数
REGEXP_LIKE()
、REGEXP_INSTR()
和REGEXP_REPLACE()
为格式错误的正则表达式模式引发错误,但也可能NULL
针对此类情况返回,从而导致后续调试断言。现在我们确保这些函数不会返回NULL
,除非在某些特定情况下。该函数
REGEXP_SUBSTR()
总是可以返回NULL
,所以不需要这样的检查,对于这个函数,我们确保不执行任何检查。(缺陷号 32053093) 测试聚合函数
IS NULL
或IS NOT NULL
在HAVING
条件中使用WITH ROLLUP
导致错误的结果。(缺陷号 32049313)当一个新的聚合函数被添加到当前查询块时,因为内部查询块有一个聚合函数需要在当前查询块中进行评估,服务器没有根据需要向它添加汇总包装器。(缺陷号 32034914)
对于调试版本,某些
CREATE TABLE
带有约束的语句CHECK
可能会引发断言。(漏洞 #32018406,漏洞 #101180)InnoDB
在辅助引擎加载操作期间 传递了不正确的 BLOB 字段值 。(缺陷号 32014483)LOCK_ORDER 工具没有正确表示
InnoDB
共享独占锁。(错误号 31994052)服务器未正确处理在尝试使用具有无效列类型的聚合函数作为散列连接的一部分时引发的错误。(缺陷号 31989333)
WORD
表格列的 长度INFORMATION_SCHEMA.KEYWORDS
可能会根据表格内容而变化。(缺陷号 31982157)如果性能模式被禁用,性能模式
host_cache
表是空的并且没有暴露主机缓存的内容。该表现在显示缓存内容,无论是否启用性能模式。(缺陷号 31978763)当
HANDLER READ
先前的语句未恢复THD::mark_used_columns
使用后的原始值时,语句有时会命中断言。(缺陷号 31977414)如果表包含在未压缩时非常大的值,则导入压缩表可能会导致服务器意外退出。(缺陷号 31943021)
LIMIT
删除了使用散列连接的子查询重复执行 时可能发生的内存泄漏。(缺陷号 31940549)Ubuntu 上的编译失败已得到纠正。(错误#31930934,错误#100938)
对于执行大量语句的会话,用于存储部分撤销信息的内存可能会过度增长。(缺陷号 31919448)
服务器没有
WHERE_CONDITION
正确处理优化的所有情况。(缺陷号 31905199)FLUSH TABLES WITH READ LOCK
可以阻止其他会话执行SHOW TABLE STATUS
。(缺陷号 31894662)在某些情况下,
MIN()
当 用作以时间或值作为参数的窗口函数时会MAX()
错误返回 。(缺陷号 31882291)NULL
JSON
GRANT ... GRANT OPTION ... TO
有时GRANT ... TO .. WITH GRANT OPTION
没有正确写入服务器日志。(错误#31869146,错误#100793)对于调试版本,
CREATE TABLE
使用超过 256 个条目的分区列表会引发断言。(缺陷号 31867653)系统变量命名的文件中的查询可能
init_file
导致服务器启动失败。(缺陷号 31835782)执行散列连接时,优化器可能会在负整数值和非常大的无符号整数值之间注册错误匹配。(错误#31832001,错误#31940639,错误#100967)
SHOW VARIABLES
partial_revokes
可能会报告系统变量的错误值 。(错误#31819558,错误#100677)在 Performance Schema
user_defined_functions
表中,该UDF_LIBRARY
列的值应该NULL
用于通过服务 API 注册的可加载函数。该值被错误地设置为空字符串。(缺陷号 31791754)服务器自动升级过程无法升级使用该
latin1
字符集的旧帮助表。(缺陷号 31789964)当执行以可序列化或可重复读取事务隔离级别读取授权表的 SQL 语句时,可能会出现重复警告。(缺陷号 31769242)
在某些具有
DISTINCT
聚合的查询中(通常通过聚合前排序来解决),由于错误地假设处理临时表的逻辑执行重复数据删除,服务器使用临时表而不是流式处理。现在服务器改为检查隐含的唯一索引,它更健壮并且允许删除不必要的逻辑。(缺陷号 31762806)Event Scheduler 事件定义中的某些
lower_case_table_names
值和架构名称组合可能会导致服务器停止。(缺陷号 31733090)从另一个存储函数中调用一个存储函数可能会在字段解析中产生冲突,从而导致服务器退出。(缺陷号 31731334)
未定义方法的可加载函数
udf_init()
可能会导致服务器意外退出。(缺陷号 31701219)将
secure_file_priv
系统变量设置为NULL
应该会禁用它的操作,但会导致服务器创建一个名为NULL
. (错误#31700734,错误#100384)由于不正确地同时访问共享结构, mysqlpump可能会意外退出。(缺陷号 31696241)
卸载组件和注销组件安装的可加载功能未与当前是否正在使用的功能正确同步。(缺陷号 31646698)
-
执行多表
UPDATE
或未DELETE
始终正确完成的准备语句后的清理,这意味着,在首次执行此类准备语句后,服务器报告更新的行数非零,即使实际上没有行变了。(缺陷号 31640267)参考资料:另请参阅:Bug #32100210。
-
对于支持主键扩展的引擎,当总键长度超过
MAX_KEY_LENGTH
或键部分数量超过MAX_REF_PARTS
时,主键中不符合这些限制的关键部分不会添加到副键中,但主键中的关键部分会被添加到副键中。无条件地标记为辅助键的一部分。这导致了二级键被视为覆盖索引的情况,这意味着有时会选择错误的访问方法。
这是通过修改将主键的关键部分添加到辅助键的方式来解决的,以便清除那些不符合前面提到的限制的内容。(缺陷号 31617858)
当 MySQL 配置为 时
-DWITH_ICU=system
, CMake现在会检查 ICU 库版本是否足够新。(缺陷号 31600044)-
--binary-as-hex
当使用该选项 调用时 , mysql将值显示NULL
为空二进制字符串 (0x
)。选择未定义的变量返回空二进制字符串 (
0x
) 而不是NULL
. (错误#31549724,错误#31638968,错误#100251) 启用 Performance Schema 相关的CMake选项导致构建失败。(缺陷号 31549724)
DISABLE_PSI_
xxx
-
一些查询根据 的值返回不同的结果
internal_tmp_mem_storage_engine
。这个问题的根本原因在于,当为窗口函数缓冲行时,如果保存这些缓冲行的内存中临时表的大小超过指定的限制,则会在磁盘上创建一个新的临时表;帧缓冲区分区偏移量在新分区的开头设置为到目前为止已读取的总行数,并专门更新以供临时表移动到磁盘时使用(这用于计算所需的提示处理窗口函数)。出现此问题是因为在磁盘上创建临时表时启动新分区时未针对特定情况更新帧缓冲区分区偏移量,这导致读取了错误的行。
通过在将临时表移动到磁盘时确保在新分区启动时正确更新帧缓冲区分区偏移量来解决此问题。(缺陷号 31546816)
-
在为窗口函数缓冲行时,如果保存这些缓冲行的内存中临时表的大小超过 指定的限制
temptable_max_ram
,则会在磁盘上创建一个新的临时表。创建临时表后,用于处理窗口函数的提示需要重置,因为临时表现在已移动到磁盘,使得现有提示无法使用。当处理帧缓冲区中的第一行时在磁盘上创建临时表时,提示尚未初始化,尝试重置这些未初始化的提示会导致服务器意外退出。此问题已通过添加检查来解决,以验证帧缓冲区提示是否已初始化,然后再重置它们。(缺陷号 31544404)
CHANNEL_NAME
当 的索引CHANNEL_NAME
被禁用时 ,性能模式可能会为列上的连接产生不正确的结果USE INDEX ()
。(缺陷 #31544023,缺陷 #99989)删除未使用的窗口定义时,未删除属于 的子查询
ORDER BY
。(缺陷号 31518806)在某些情况下,服务器没有正确处理多重嵌套子查询。(缺陷号 31472704)
已识别的
VALUES
语句语法包括一个ORDER BY
子句,但该子句未解析,因此执行引擎可能会遇到无效数据。(缺陷号 31387510)服务器试图在启动时访问一个不存在的临时目录,导致失败。添加了检查以确保临时目录存在,并且文件已在
tmpdir
目录中成功创建。(缺陷号 31377118)-
在删除冗余排序时,一个窗口的排序被删除,因为由于另一个窗口的排序,行应该按顺序排列。当另一个窗口因未使用而随后被删除时,这会导致行无序,这在评估期间是意料之外的。
现在在这种情况下,直到删除所有未使用的窗口后才会执行删除冗余排序。此外,任何汇总的解决方案都已移至准备阶段。(缺陷号 31361393)
半同步复制错误被错误地写入错误日志,其子系统标记为
Server
。它们现在用 标记写入,与Repl
其他复制错误相同。(缺陷号 31327337)用户可以将自己授予自己的角色。(缺陷号 31222230)
服务器并不总是正确处理多个
WHERE
条件(其中之一始终为 FALSE)引用同一子查询的情况。(缺陷号 31216115)通过
lower_case_table_names=2
设置,InnoDB
后台线程有时会使用锁键的模式名称部分的错误字符大小写来获取表元数据锁,从而导致元数据不受保护和竞争条件。现在应用了正确的字符大小写。还实施了更改以防止元数据锁在相应的数据字典对象之前被释放,并改进了在获取数据字典对象时检查锁保护的断言代码。(缺陷号 31165802)如果要将 a
CR_UNKNOWN_ERROR
发送给客户端,则会发生异常。(缺陷号 31123643)DOUBLE
将值 转换为BIT
、ENUM
或 类型的值SET
可能会生成 Undefined Behavior Sanitizer 警告。(缺陷号 31019130)skip_name_resolve
如果启用了系统变量, 某些帐户可能会导致服务器启动失败 。(缺陷号 31018510)如果通信数据包包含错误数据,客户端程序可能会意外退出。(缺陷号 30890850)
客户端库中的缓冲区溢出已修复。(缺陷号 30885987)
-
创建多值索引或其他功能索引时,在对定义索引的表执行查询时会出现性能下降,即使实际上并未使用索引本身。发生这种情况是因为为查询中的每一行不必要地评估了支持此类索引的隐藏虚拟列。(缺陷号 30838749)
参考:这个问题是 Bug #28069731 的回归。
改进了CMake
libcurl
对 依赖项的检查(缺陷号 30268245)mysql_config_editor在密码值中被错误地视为
#
注释字符。(缺陷 #29861961,缺陷 #95597)在某些情况下,优化器会尝试计算空字符串的哈希值。现在总是使用固定值。(缺陷号 22588319)
和函数没有正确设置结果的字符集
INSERT()
。RPAD()
(错误#22523946、错误#79909、错误#31887870、错误#100841)修复了一些极端情况,例如 返回 true 的情况。(缺陷 #22515857,缺陷 #79878)
val1
BETWEEENval2
ANDval3
-1 BETWEEN 9223372036854775808 AND 1
对于 Performance Schema
memory_summary_global_by_event_name
表,低水印列可能具有负值,而高水印列具有不断增加的值,即使服务器内存使用量没有增加。(缺陷 #22246001,缺陷 #79285)将字符串转换为数字的几个问题已得到修复。(缺陷 #19186271,缺陷 #73248)
添加时正确执行的某些分组依据查询未返回预期结果
WITH ROLLUP
。这是因为十进制信息并不总是正确地通过汇总组项传输,导致函数返回十进制值,例如TRUNCATE()
接收错误类型的数据。(错误#101684,错误#32179240)-
在为具体化临时表创建字段时(即需要对连接进行排序时),优化器会检查该项目是否需要复制或只是一个常量。在一个特定案例中,这没有正确完成;对包含常量的视图或派生表执行外部联接时,该项目未正确具体化到表中,这可能会
NULL
在结果中产生虚假的出现。(错误#101622,错误#32162862)参考资料:另请参阅:Bug #31790217。
-
在
REGEXP_REPLACE()
SQL 语句中使用时,内部函数Regexp_engine::Replace()
在处理一条记录后没有重置错误代码值,这可能会影响下一条记录的处理,从而导致问题。感谢 Hope Lee 的贡献。(缺陷 #101256,缺陷 #32050219)
-
对于如下形式的查询,创建临时表后列列表有时会呈现不一致的状态,导致后面越界索引:
SELECT * FROM ( SELECT PI() FROM t1 AS table1, t1 AS table2 ORDER BY PI(), table1.a ) AS d1;
(错误#101012、错误#31955761、错误#31978439)
参考资料:此问题是 Bug #31790217 的回归。
-
当聚合已经排序的数据时(称为执行流式聚合,因为没有使用临时表),在处理下一组中的第一行之前无法确定组何时结束,此时组表达式到输出通常已经被覆盖。
这是通过用更简单的方法替换以前使用的复杂逻辑来解决的,该方法在第一次遇到组时为组保存代表行,以便在需要时可以轻松检索输出行的列。(错误#100791、错误#27272052、错误#31073167、错误#31790217、错误#31868610)
使用全文匹配的子查询在
subquery_to_derived
启用时可能无法正常执行,并可能导致调试版本中出现断言。(错误#100749,错误#31851600)-
执行语句时,表中每个、 和 列
ALTER TABLE ... CONVERT TO CHARACTER SET
的字符集都会更新为新值。此更改也适用于多值索引 的列所使用的隐藏列;由于隐藏列的字符集必须是或 之一,这导致在服务器的调试版本中出现断言。CHAR
VARCHAR
TEXT
CHARACTER SET
CHAR
ARRAY
my_charset_utf8mb4_0900_bin
binary
ALTER TABLE
通过在执行前面引用的语句 时不再将隐藏列的字符集设置为表的字符集来解决此问题 ;BLOB
这类似于在类似情况下对列所做的操作 。(缺陷 #99403,缺陷 #31301101) -
在某些情况下,服务器的内部字符串转换例程在处理使用长度说明符并触发使用科学记数法的浮点值时会出现问题。(错误#92537、错误#101570、错误#28691605、错误#32144265)
参考资料:另请参阅:Bug #88256、Bug #27041543。