MySQL 8.0版本说明/ MySQL 8.0.23的更改(21-01-18,一般可用性)

MySQL 8.0.23的更改(21-01-18,一般可用性)

该版本增加了对macOS 11 (Big Sur)的支持。

账户管理笔记

C API的笔记

  • 对于某些应用程序,在每个查询的基础上定义元数据可能很有用。例子包括产生查询的页面的URL,或者附加的处理信息要与查询一起传递给一个插件,例如审计插件或查询重写插件。MySQL现在支持这种功能,而不需要使用诸如在查询字符串中包含特殊格式的注释之类的变通方法:

    • 在客户端mysql_bind_param ()C API函数允许定义查询属性。这些属性应用于发送到服务器执行的下一条SQL语句。此外,mysql而且mysqltest客户有一个query_attributes允许定义查询属性的命令。

    • 在服务器端,组件服务提供对查询属性的访问。一个组件命名query_attributes使用此服务实现一个mysql_query_attribute_string ()用户定义函数(UDF),它支持在SQL语句中获取属性值。的query_attributes组件是可选的,但要使UDF可用,必须安装它。

    有关更多信息,请参见查询属性

    感谢Facebook提出了这个想法(并贡献了代码,尽管它没有被使用)。(Bug #27855905, Bug #28686334)

编译的笔记

  • 感谢Tzachi Zidenberg,他为在aarch64 (ARM64)上编译MySQL提供了一个补丁。(Bug #31815236, Bug #100664)

连接管理笔记

  • 帐户创建顺序可能会影响匹配传入TCP客户机连接的帐户的选择。为了使匹配算法更加确定,在尝试匹配使用主机名指定的帐户之前,匹配帐户的主机名部分现在以特定的顺序检查使用主机IP地址指定的帐户。主机名匹配保持不变。看到访问控制,第1阶段:连接验证

弃用和删除说明

  • 从MySQL 8.0.23,语句改变主弃用。别名将复制源更改为应该使用。语句的参数也有替换术语的别名与这个词.例如,MASTER_HOST而且MASTER_PORT现在可以输入为SOURCE_HOST而且SOURCE_PORT.的启动|副本slave声明的参数MASTER_LOG_POS而且MASTER_LOG_FILE现在有别名SOURCE_LOG_POS和SOURCE_LOG_FILE。这些语句的工作方式和以前一样,只是每个语句使用的术语发生了变化。如果使用旧版本,则会发出弃用警告。

    一个新的状态变量,Com_change_replication_source的别名已添加Com_change_master状态变量。语句的旧版本和新版本都会更新状态变量的旧版本和新版本。

    服务器会重写所有内容改变主语句是将复制源更改为查询日志中的语句。对语句也执行相同的操作开始的奴隶停止奴隶显示奴隶状态显示奴隶主人而且重置的奴隶.的事件名称改变主语句设置为声明/ sql / change_replication_source在语句历史表中。(错误# 32145023)

  • gen_blacklist ()自定义函数不支持。使用gen_blocklist ()相反,它执行相同的术语替换操作。

  • 系统变量的使用master_info_repository而且relay_log_info_repository已弃用,如果试图设置或读取它们的值,则会发出警告消息。系统变量将在未来的MySQL版本中删除。这些系统变量用于指定是否将副本的连接元数据存储库和应用程序元数据存储库写入InnoDB表在mysql系统数据库中,或者到一个文件的data目录中。的文件设置在以前的版本中已经弃用,在MySQL 8.0中,表是复制元数据存储库的默认设置。

  • 可以使用以下任何一种方法来刷新主机缓存:

    虽然这些方法在效果上是等效的,但授予重新加载除了主机缓存刷新之外,特权还支持许多其他操作,从安全角度来看,这是不可取的。发放下降特权的host_cacheTable更可取,因为它的作用域更有限。因此,冲洗主机语句已弃用,将在未来的MySQL版本中删除。相反,截断host_cache表格

    mysqladmin flush hosts之前执行冲洗主机声明。现在它试图截断host_cacheTable, fall back to冲洗主机只有当截断操作失败时。

MySQL企业笔记

  • 管理员通过注册为允许的语句(allowlist)指定规则集的配置文件来执行MySQL Enterprise Firewall管理。以前,概要文件只能与单个帐户相关联,因此,要将给定的allowlist应用到多个帐户概要文件,就必须为每个概要文件复制规则集。为了更方便的管理和更大的灵活性,防火墙现在提供了组配置文件功能:

    • 可以创建命名的组配置文件。一个组配置文件可以包含多个帐户作为成员,一个帐户可以是多个组配置文件的成员。

    • 每个组配置文件都有自己的允许列表。配置文件allowlist适用于所有成员帐户,消除了跨多个帐户配置文件复制它的需要。

    有关更多信息,请参见MySQL企业防火墙

优化器的笔记

  • 将用于哈希连接的哈希表从无序multimap切换到使用multimap适配器实现的无序平面映射。这一改变带来了以下改进:

    • 更快的哈希表

    • 由于哈希表开销更少,用于对齐和键/值长度的空间更少,对于许多相同的键,内存使用更好;这还应该减少需要溢出到磁盘的频率

    • 更好的内存控制,更接近允许的连接缓冲区大小,而不是有效地限制在大约2/3join_buffer_size,并且当哈希表增长时释放旧内存成为可能

    (Bug #99933, Bug #31516149)

性能模式笔记

  • 以前扩展为动态调用的性能模式宏现在在可能的情况下扩展为静态调用,以减少处理开销。(错误# 32028160)

  • 降低了计时器代码的性能开销。这对于使用Performance Schema的高并发性工作负载来说是最有好处的。感谢Georgy Kirichenko的贡献。(Bug #31960377, Bug #101018)

可插入身份验证

  • MySQL企业版SASL LDAP认证插件现在支持安全- sha - 256作为MySQL客户端和服务器的认证方法。安全- sha - 256类似于SCRAM-SHA-1但更安全。使用安全- sha - 256需要使用Cyrus SASL 2.1.27或更高版本构建的OpenLDAP服务器。看到LDAP身份验证方法

安全记录

空间数据的支持

SQL语法笔记

  • MySQL现在支持不可见列,这些列通常对查询是隐藏的,但如果显式引用,则可以访问。看到看不见的列

X插件笔记

  • 的X协议连接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协议不执行这些检查,并假设连接仍然存在。现在已经为X协议添加了检查。

增加或更改的功能

  • InnoDB:以下操作提高了性能:

    • 在一个有大缓冲池(> 32gb)的MySQL实例上删除一个大的表空间。

    • 删除一个从自适应散列索引引用大量页面的表空间。

    • 删除临时表空间。

    当正常操作期间遇到页面时,删除或截断的表空间的页面和相关的AHI条目将被被动地从缓冲池中删除。以前,删除或截断表空间会启动一个完整的列表扫描,以立即从缓冲池中删除页面,这会对性能产生负面影响。(Bug #31008942, Bug #98869)

  • InnoDB:AUTOEXTEND_SIZE选项定义使用的数量InnoDB当表空间满时扩展表空间的大小,从而可以以较大的增量扩展表空间的大小。以较大增量分配空间有助于避免碎片化,并促进大量数据的摄入。的AUTOEXTEND_SIZE选项支持创建表ALTER TABLE创建表空间,修改表空间语句。有关更多信息,请参见表空间AUTOEXTEND_SIZE配置

    一个AUTOEXTEND_SIZE将大小列添加到INFORMATION_SCHEMA。INNODB_TABLESPACES表格

  • InnoDB:InnoDB现在支持对属于加密表空间的doublewrite文件页进行加密。使用关联表空间的加密密钥对页面进行加密。有关更多信息,请参见InnoDB静止数据加密

  • InnoDB:InnoDBatomics代码被修改为使用c++std::原子

  • 的方法调用时——所有数据库选项,, mysqldump现在转储mysql数据库,以便在重新加载转储文件时,在定义者子句的其他对象将已经创建。(错误# 32141046)

  • 禁用的性能模式和LOCK_ORDER确认并排除工具仪表。(错误# 32105698)

  • 而且文本具有默认值表达式的列INFORMATION_SCHEMA。列表和显示列语句现在显示表达式。(错误# 31856459)

  • 在ARM平台上,binlog校验和的CRC计算速度更快。感谢Krunal Bauskar的贡献。(Bug #99118, Bug #31101633, Bug #32163391)

  • MySQL Server的异步连接故障转移机制现在支持Group Replication拓扑,通过自动监视组成员关系的变化并区分主服务器和备用服务器。在向源列表中添加组成员并将其定义为托管组的一部分时,异步连接故障转移机制将更新源列表以使其与成员关系更改保持一致,并在组成员加入或离开时自动添加和删除组成员。新asynchronous_connection_failover_add_managed ()而且asynchronous_connection_failover_delete_managed ()udf用于添加和删除托管源。

    如果当前连接的源脱机、离开组或不再占多数,或者当前连接的源在组中没有最高的加权优先级,则连接将失败地转移到另一个组成员。对于托管组,源的权重取决于它是主服务器还是辅助服务器。因此,假设您将托管组设置为将较高的权重分配给主节点,将较低的权重分配给次要节点,当主节点发生变化时,将较高的权重分配给新的主节点,因此副本在连接到它的过程中发生变化。此功能也适用于单个(非托管)服务器,因此如果有另一个具有更高权重优先级的源服务器可用,则连接将发生故障转移。

  • 方法将GTID分配给还没有GTID的复制事务,可以设置复制通道ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS选择的将复制源更改为声明。该特性支持从不使用基于gtid的复制的源复制到使用基于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集。

  • 对于多线程副本(其中slave_parallel_workers大于0),设置slave_preserve_commit_order = 1确保事务在副本上执行和提交的顺序与它们在副本的中继日志中出现的顺序相同。每个正在执行的工作线程都要等到所有之前的事务都提交后才提交。如果由于检测到可能的死锁,或由于事务的执行时间超过了相关的等待超时,工作线程无法执行事务,则它会自动重试slave_transaction_retries在出现错误而停止之前。具有非临时错误的事务不会被重试。

    多线程副本上的复制应用程序总是处理由相关存储引擎识别的数据访问死锁。但是,复制应用程序没有检测到其他一些类型的锁,例如涉及访问控制列表(acl)的锁或元数据锁(例如,用读锁刷新表语句)。这可能导致使用提交顺序锁定的三参与者死锁,复制应用程序无法解决这一问题,并导致复制无限期挂起。从MySQL 8.0.23开始,保留提交顺序的多线程副本上的死锁处理得到了增强,以减轻这些类型的死锁。死锁不是由复制应用程序专门解决的,但是应用程序知道它们,并为事务启动自动重试,而不是挂起。如果重试耗尽,复制将以受控的方式停止,以便手动解决死锁。

  • temptable_max_mmap变量定义了TempTable存储引擎在开始存储数据之前,允许从内存映射的临时文件中分配的最大内存量InnoDB磁盘上的内部临时表。设置为0禁止从内存映射的临时文件分配内存。有关更多信息,请参见内部临时表在MySQL中的使用

错误修复

  • InnoDB:一个创建表的操作。压缩选项被允许,并在系统不支持打孔时发出警告。操作现在失败,并出现错误。(错误# 32174200)

  • InnoDB:在进行数据加载操作时启动的升级之后,MySQL DB系统重新启动引发断言失败。(错误# 32173596)

  • InnoDB:关于检查点之间同一undo表空间的截断操作数量的错误消息错误地指示限制为64。在MySQL 8.0.22中,限制从64提高到50,000。(Bug #32151601, Bug #101601)

  • InnoDB:rw_lock_t而且buf_block_t源代码结构的大小减少了。(错误# 32084500)

  • InnoDB:一个InnoDB使用其他存储引擎创建表后,事务不一致InnoDB的查询表达式InnoDB表。(错误# 32079103)

  • InnoDB:在某些情况下,例如当一个现有的间隙锁从一个已删除的记录继承了一个锁时,出现在INFORMATION_SCHEMA。INNODB_TRX表可能偏离记录锁的实际数量。

    感谢阿里巴巴的Fungo Wang提供的补丁。(Bug #32068538, Bug #101305)

  • InnoDB:一个差一的错误Fil_systemSharding代码已被修正,最大分片数(MAX_SHARDS)改为69。(Bug #32052821, Bug #101260)

  • InnoDB:TempTable存储引擎内存分配器不必要地分配了额外的内存块。(错误# 32018553)

  • InnoDB:一个SELECT COUNT (*)由于不必要的I/O,对包含未提交数据的表的操作执行得很差。

    感谢Brian Yue的贡献。(Bug #31997733, Bug #100966)

  • InnoDB:关闭日志写入器时的竞态条件引发断言失败。(错误# 31997362)

  • InnoDB:在同步刷新模式下,页面清理器线程没有得到最佳利用,这可能导致页面刷新操作在某些情况下变慢或停滞。发生同步刷新模式时InnoDB接近耗尽重做日志中的可用空间,导致页清理器协调器启动积极的页刷新。(错误# 31994031)

  • InnoDB:在启用了撤销日志截断的情况下,频繁更新会导致清除延迟。延迟是由于innodb_purge_rseg_truncate_frequency当选择undo表空间截断时,将设置从128临时更改为1。修改设置的代码已被删除。(错误# 31991688)

  • InnoDB:自动截断undo表空间会导致性能下降。为了解决这个问题,undo表空间文件现在初始化为16MB,并扩展了至少16MB。为了处理快速增长,如果前一个文件扩展名发生的时间少于0.1秒,则文件扩展名大小将增加一倍。扩展大小可以翻倍多次,最大可以达到256MB。如果前面的文件扩展名比前面的文件扩展名早0.1秒以上,则扩展名大小将减少一半,这也可以多次发生,最小为16MB。以前,撤消表空间的初始大小取决于InnoDB页面大小和undo表空间每次扩展四个区段。

    如果AUTOEXTEND_SIZE选项为undo表空间定义时,则undo表空间按中的大者扩展AUTOEXTEND_SIZE设置和由上面描述的逻辑确定的扩展大小。

    当undo表空间被截断时,通常以16MB的大小重新创建它,但是如果当前文件扩展名大小大于16MB,并且上一个文件扩展名发生在最后一秒内,则新的undo表空间将以定义的四分之一大小创建innodb_max_undo_log_size变量。

    过期的撤销表空间页在下一个检查点不再删除。控件在后台删除这些页面InnoDB掌握线程。(Bug #31965404, Bug #32020900, Bug #101194)

  • InnoDB:一个posix_fallocate ()为临时表空间预分配空间时失败,引发错误并导致初始化失败。现在却发出了警告InnoDB回到非-posix_fallocate ()预分配空间的方法。(错误# 31965379)

  • InnoDB:类编译的MySQL服务器上的无效指针导致关机失败DISABLE_PSI_MEMORY已启用源配置选项。(错误# 31963333)

  • InnoDB:由计算给定索引的新统计信息的内部函数持有的长SX锁导致了失败。(错误# 31889883)

  • InnoDB:INFORMATION_SCHEMA。INNODB_TABLESPACES表报告FILE_SIZE对于某些表和模式,为0。当关联的表空间不在内存缓存中时,使用表空间名称来确定表空间文件名,这种方法并不总是可靠的。现在改为使用表空间ID。使用表空间名称仍然是一种备用方法。(错误# 31841617)

  • InnoDB:在下降全文索引并重命名表以将其移动到一个新的模式全文辅助表没有相应地重命名,保留在旧模式目录中。(Bug #31773368, Bug #100570)

  • InnoDB:在升级到MySQL 8.0之后,当试图对先前用全文搜索索引定义的表执行DML操作时,发生了失败。(错误# 31749490)

  • InnoDB:使用页压缩表导入表空间时,对于用不同的压缩设置。的压缩导出表的设置现在保存到. cfg元数据文件刷新表……用于出口操作,并在导入时检查该信息,以确保两个表的定义相同压缩设置。(错误# 31744694)

  • InnoDB:用于检查MySQL Keyring插件是否正常工作的虚拟密钥处于不活动状态,不活动虚拟密钥的数量随着时间的推移而增加。现在使用实际的主密钥(如果存在的话)。如果没有可用的主密钥,则生成一个虚拟的主密钥。(错误# 31737924)

  • InnoDB:查询INFORMATION_SCHEMA。文件桌子移动后InnoDB数据目录外的系统表空间引发警告,指出innodb_system文件名是未知的。(错误# 31603047)

  • InnoDB:在包含带有二进制日志记录的副本的复制场景中log_slave_updates控件中有过多的空白,导致服务器无法启动mysql.gtid_executed表格包含这两种情况的工作负载会出现空白InnoDB和非InnoDB事务。GTIDs为InnoDB将事务刷新到mysql.gtid_executed表由GTID持久线程执行,它周期性地运行,而GTID为非InnoDB事务被写入mysql.gtid_executed表直接由复制服务器线程。当GTID持续线程在合并条目和压缩mysql.gtid_executed表格的GTID刷新列表的大小InnoDB事务随着时间的推移而增长,空隙的数量也随之增加mysql.gtid_executed表,最终导致服务器故障和后续启动失败。为了解决这个问题,GTID持久线程现在为这两个线程编写GTIDInnoDB和非InnoDB如果GTID持久线程落后,则事务和前台提交将被迫等待。此外,gtid_executed_compression_period参数的显式压缩被默认设置从1000更改为0mysql.gtid_executed默认表。

    感谢Venkatesh Prasad的贡献。(Bug #31599938, Bug #100118)

  • InnoDB:为XA事务持久化GTID值会影响XA事务的性能。为XA事务生成两个GTID值,一个用于准备阶段,另一个用于提交阶段。第一个GTID值被写入undo日志,然后被第二个GTID值覆盖。文件中刷新第一个GTID值后,才能写入第二个GTID值gtid_executed表格现在在撤消日志中为两个XA事务GTID值保留了空间。(Bug #31467953, Bug #99638)

  • InnoDB:InnoDB源文件进行了更新,以解决构建Doxygen源代码文档时产生的警告。10bet官方网站(错误# 31354760)

  • InnoDB:全文搜索同步线程试图从索引缓存中读取先前释放的单词。(错误# 31310404)

  • InnoDB:一个人在床上睡觉buf_wait_for_read ()MySQL 8.0.17中并行读功能引入的函数在Windows上耗时1ms,导致运行某些测试时出现意外超时。此外,AIO线程的等待操作系统IO请求数量不均匀。(错误# 31095274)

    这个问题是:Bug #31123564的回归。

  • InnoDB:某些复制XA事务中的清理工作未能重新附加事务对象(trx_t),这会引发断言失败。(错误# 31006095)

  • InnoDB:数据库的恢复过程中失败,没有正确更新表空间加密类型设置改变表空间加密服务器故障后的操作。(Bug #30883833, Bug #98537)

  • InnoDB:表空间加密操作中断,没有更新encrypt_type当服务器重新启动后操作恢复处理时,表数据字典中的选项信息。(Bug #30883833, Bug #98537, Bug #30888919, Bug #98564)

  • InnoDB:与线程睡眠延迟和线程进入离开相关的内部计数器变量InnoDB修改为使用c++std::原子.内置原子操作被删除。感谢来自ARM的Yibo Cai的贡献。(Bug #30567060, Bug #97704)

  • InnoDB:为字典内存变量fetch-add (dict_temp_file_num.fetch_add)和储存(dict_temp_file_num.store)操作。

    感谢Yibo Cai的贡献。(Bug #30567054, Bug #97703)

  • InnoDB:在服务器启动后恢复表空间加密操作的后台线程在表空间上获取元数据锁失败,这允许并发DDL操作,并导致启动线程出现竞争条件。启动线程现在等待表空间元数据锁定。(错误# 28531637)

  • InnoDB:调用numa_all_nodes_ptrnuma_get_mems_allowed ()函数。感谢Daniel Black的贡献。(Bug #24693086, Bug #83044)

  • 分区:ALTER TABLE t1 EXCHANGE PARTITION…t2与表时导致断言t1不是一个分区表。(Bug #100971, Bug #31941543)

    这个问题是一个Bug #29706669的回归。

  • 复制:network_namespace参数的asynchronous_connection_failover_add_source ()而且asynchronous_connection_failover_delete_source ()从MySQL 8.0.23开始不再使用udf。这些udf从异步连接故障转移机制的复制区域通道的源列表中添加和删除复制区域源服务器。复制区域通道的网络命名空间使用改变复制源语句,并且对Group Replication源服务器有特殊要求,因此不应该再在udf中指定它。(错误# 32078189)

  • 复制:当系统变量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)持有表上的锁,例如,由于正在进行备份,该成员被逐出组并试图自动重新加入,自动重新加入尝试不成功,没有重试。现在,组复制在启动和重新连接尝试期间检查是否group_replication_applier频道已经在运行。如果在启动时出现这种情况,则返回一条错误消息。方法指定的进一步尝试将被执行group_replication_autorejoin_tries系统变量。(错误# 31648211)

  • 复制:如果某个组成员被驱逐,并在实例上的某些表被锁定时(例如在运行备份时)尝试自动重新加入,则尝试失败,不再进行进一步的尝试。这个场景现在得到了正确处理。(错误# 31460690)

  • 复制:随着从半异步源服务器复制的副本数量的增加,锁定争用可能会导致性能下降。插件使用的锁定机制已经更改为尽可能使用共享锁,避免不必要的锁获取,并限制回调。新的行为可以通过启用以下系统变量来实现:

    • replication_sender_observe_commit_only = 1限制了回调。

    • replication_optimize_for_static_plugin_config = 1添加共享锁并避免不必要的锁获取。如果要卸载插件,必须禁用此系统变量。

    这两个系统变量都可以在安装半同步复制插件之前或之后启用,并且可以在复制运行时启用。半同步复制源服务器还可以通过启用这些系统变量获得性能优势,因为它们使用与副本相同的锁定机制。(错误# 30519928)

  • 复制:在保留提交顺序的多线程副本上,工作线程必须等待在中继日志中较早发生的所有事务提交后,才能提交自己的事务。如果死锁发生是因为在提交顺序中稍后等待提交事务的线程锁定了提交顺序中较早的事务所需的行,则死锁检测算法向等待的线程发出信号回滚其事务。以前,如果事务重试不可用,回滚事务的工作线程将立即退出,而不会向提交顺序中的其他工作线程发出信号,这可能会导致复制中断。在这种情况下的工作线程现在等待轮到它调用回滚函数,这意味着它向其他线程发出正确的信号。(Bug #26883680, Bug #87796)

  • 复制:gtid仅在服务器实例上可用,其数量不超过有符号64位整数的非负值(2的63次方减1)gtid_purged到接近此限制的数量时,后续的提交可能导致服务器耗尽gtid并采取binlog_error_action.在MySQL 8.0.23中,当服务器实例接近极限时会发出警告消息。(错误# 26035544)

  • 微软的Windows操作系统:在Windows上,将MySQL服务器作为服务运行会导致共享内存连接失败。(错误# 32009251)

  • JSON:JSON_ARRAYAGG ()不总是执行正确的错误处理。(Bug #31856260, Bug #32012559, Bug #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文档——这种区分不能仅通过数据类型来实现。对于Bug #31667405,比较运算符和在()操作符可以将JSON参数标记为标量值,而将其他JSON函数的参数视为JSON文档。

    当前的修复恢复了一些JSON函数对某些参数作为JSON值的处理,如下所示:

    第一个论证成员()

    函数的第三、第五、第七和随后的奇数参数JSON_INSERT ()JSON_REPLACE ()JSON_SET ()JSON_ARRAY_APPEND (),JSON_ARRAY_INSERT ().(Bug #101284, Bug #32063203)

    参考文献:参见Bug #31667405。

  • JSON:mysqld运行了——调试时,试图执行使用多值索引的查询会抛出错误。(Bug #99833, Bug #31474182)

  • 的使用thread_pool插件可能导致地址杀毒警告。(错误# 32213294)

  • 当将条件下推到物化派生表,条件部分下推时,优化器可能在某些情况下,查询转换向在哪里条件,呼叫内部fix_fields ()函数获取保留在外部查询块中的条件。这个函数调用的成功返回被错误地解释为一个错误,导致原始语句的无声失败。(错误# 32150145)

  • 类存储过程的多个调用ALTER TABLE包含命令子句可能导致服务器退出。(错误# 32147402)

  • 涉及存储程序的准备语句可能会导致释放内存后使用堆的问题。(Bug #32131022, Bug #32045681, Bug #32051928)

  • 查询INFORMATION_SCHEMA涉及物化派生表的表可能会失败。(Bug #32127562, Bug #101504)

  • 修复了潜在的缓冲区溢出。感谢Sifang Zhao指出了这个问题,并提出了一个修复建议(尽管它没有被使用)。(Bug #32113015, Bug #101448)

  • 转换浮动值到类型的值INT可能会产生未定义的行为消毒剂警告。(Bug #32099994, Bug #32100033)

  • 在多行查询中,LOAD_FILE ()函数对每一行求值都相同。(Bug #32096341, Bug #101401)

  • 通用Linux焦油文件发行版在解包后的文件权限限制太大,需要手动操作修改文件权限正确。(错误# 32080900)

  • 用于调试版本,已准备好在存储过程中包含子查询的语句可以引发断言。(错误# 32078387)

    参考文献:参见Bug #32100210。

  • 对于准备好的语句,非法混合整理合法的整理混合可能会出现错误。(Bug #32077842, Bug #101346, Bug #32145078, Bug #101575)

  • 的函数REGEXP_LIKE ()REGEXP_INSTR (),REGEXP_REPLACE ()为畸形的正则表达式模式引发错误,但也可能返回对于这种情况,将导致后续的调试断言。现在我们确保这些函数不返回除非在某些特定的情况下。

    这个函数REGEXP_SUBSTR ()可以返回,所以不需要这样的检查,对于这个函数,我们确保不执行。(错误# 32053093)

  • 测试聚合函数为空不是零在一个使用条件与汇总导致了错误的结果。(错误# 32049313)

  • 当一个新的聚合函数被添加到当前查询块中,因为一个内部查询块中有一个需要在当前查询块中求值的聚合函数时,服务器不会根据需要向它添加汇总包装器。(错误# 32034914)

  • 对于调试版本,这是肯定的创建表语句与检查约束可以引发断言。(Bug #32018406, Bug #101180)

  • 传递错误的BLOB字段值InnoDB在二次发动机加载操作期间。(错误# 32014483)

  • LOCK_ORDER工具没有正确表示InnoDB共享专用锁。(错误# 31994052)

  • 当试图使用具有无效列类型的聚合函数作为散列连接的一部分时,服务器没有正确处理引发的错误。(错误# 31989333)

  • 的长度列的INFORMATION_SCHEMA。关键字表可能根据表内容而更改。(错误# 31982157)

  • 性能模式host_cache表为空,如果禁用了性能模式,则不会暴露主机缓存的内容。无论Performance Schema是否启用,该表现在都显示缓存内容。(错误# 31978763)

  • 一个处理程序读的原始值时,语句有时会命中断言:: mark_used_columns后使用。(错误# 31977414)

  • 如果表在未压缩时包含非常大的值,则导入压缩表可能导致意外的服务器退出。(错误# 31943021)

  • 删除了在使用散列连接和的子查询时可能发生的内存泄漏限制重复执行。(错误# 31940549)

  • 修正了Ubuntu上的编译失败。(Bug #31930934, Bug #100938)

  • 对于执行大量语句的会话,用于存储部分撤销信息的内存可能会过度增长。(错误# 31919448)

  • 的所有情况下,服务器没有处理WHERE_CONDITION正确地优化。(错误# 31905199)

  • 用读锁刷新表是否可以阻止其他会话的执行显示表状态.(错误# 31894662)

  • 在某些情况下,MIN ()而且MAX ()错误的返回当使用窗函数与时态或JSON值作为参数。(错误# 31882291)

  • 授予……GRANT选项…来而且授予……对. .使用GRANT选项有时没有正确地写入服务器日志。(Bug #31869146, Bug #100793)

  • 为调试构建,创建表使用超过256项的分区列表会引发断言。(错误# 31867653)

  • 控件命名的文件中可以进行查询init_file系统变量导致服务器启动失败。(错误# 31835782)

  • 在执行散列连接时,优化器可能会在负整数值和非常大的无符号整数值之间注册一个假匹配。(Bug #31832001, Bug #31940639, Bug #100967)

  • 显示变量可以报告错误的值partial_revokes系统变量。(Bug #31819558, Bug #100677)

  • 性能模式user_defined_functions表的值UDF_LIBRARY专栏应该是通过服务API注册的udf。值被错误地设置为空字符串。(错误# 31791754)

  • 属性的旧帮助表升级失败latin1字符集。(错误# 31789964)

  • 在执行以可序列化或可重复读取事务隔离级别读取授权表的SQL语句时,可能会出现重复警告。(错误# 31769242)

  • 在某些查询中截然不同的聚合(通常在聚合之前通过排序来解决),由于错误地假定处理临时表的逻辑执行重复数据删除,服务器使用临时表而不是流。现在,服务器检查隐含的惟一索引,这更健壮,并允许删除不必要的逻辑。(错误# 31762806)

  • 特定的组合lower_case_table_names事件调度器事件定义中的值和模式名称可能导致服务器停止。(错误# 31733090)

  • 从一个存储函数中调用另一个存储函数可能会在字段解析中产生冲突,导致服务器退出。(错误# 31731334)

  • 定义的用户定义函数udf_init ()方法可能导致意外的服务器退出。(错误# 31701219)

  • 设置secure_file_priv系统变量应该禁用其操作,而不是导致服务器创建一个名为.(Bug #31700734, Bug #100384)

  • mysqlpump可能由于对共享结构的不恰当的同时访问而意外退出。(错误# 31696241)

  • 卸载组件和注销组件安装的用户定义函数(udf)没有正确地与udf当前是否在使用同步。(错误# 31646698)

  • 执行执行多表的准备语句后的清理更新删除并不总是正确的,这意味着,在第一次执行这样一个准备好的语句之后,服务器报告的更新行数为非零,即使实际上没有行被更改。(错误# 31640267)

    参考文献:参见Bug #32100210。

  • 对于支持主键扩展的引擎,当总密钥长度超过MAX_KEY_LENGTH或关键部件数量超标MAX_REF_PARTS,如果主键的关键部分不符合这些限制,则不添加到从键中,而将主键的关键部分无条件标记为从键的一部分。

    这导致二级键被视为覆盖索引的情况,这意味着有时会选择错误的访问方法。

    这可以通过修改将主键的键部分添加到辅助键的方式来解决,这样就可以清除那些不符合前面提到的限制的键部分。(错误# 31617858)

  • 当MySQL配置-DWITH_ICU =系统CMake现在检查ICU库版本是否足够最新。(错误# 31600044)

  • 的方法调用时——binary-as-hex选项,mysql显示值为空二进制字符串(0 x).

    选择未定义的变量返回空二进制字符串(0 x),而不是.(Bug #31549724, Bug #31638968, Bug #100251)

  • 启用DISABLE_PSI_xxx性能Schema-relatedCMake选项导致构建失败。(错误# 31549724)

  • 的值不同,有些查询返回不同的结果internal_tmp_mem_storage_engine

    此问题的根本原因与以下事实有关:当为窗口函数缓冲行时,如果内存中保存这些缓冲行的临时表的大小超过指定的限制,则在磁盘上创建一个新的临时表;帧缓冲区分区偏移量在新分区的开始设置为到目前为止已读取的行总数,并在临时表移动到磁盘时进行更新,以便使用(这用于计算处理窗口函数所需的提示)。出现这个问题是因为当在磁盘上创建临时表时启动一个新分区时,没有针对特定情况更新帧缓冲区分区偏移量,这导致读取了错误的行。

    这个问题可以通过确保在临时表移动到磁盘时启动新分区时正确更新帧缓冲区分区偏移量来解决。(错误# 31546816)

  • 在为窗口函数缓冲行时,如果保存这些缓冲行的内存中临时表的大小超过了temptable_max_ram,在磁盘上创建一个新的临时表。在创建临时表之后,用于处理窗口函数的提示需要重置,因为临时表现在被移动到磁盘,使得现有的提示不可用。当处理帧缓冲区中的第一行时在磁盘上创建临时表时,提示没有初始化,试图重置这些未初始化的提示会导致计划外的服务器退出。

    这个问题是通过添加一个检查来解决的,该检查用于在重置帧缓冲区提示之前验证帧缓冲区提示是否已初始化。(错误# 31544404)

  • 的连接可能产生不正确的结果CHANNEL_NAME列时的索引CHANNEL_NAME禁用了使用指数().(Bug #31544023, Bug #99989)

  • 类的子查询命令没有删除。(错误# 31518806)

  • 在某些情况下,服务器不能正确处理多重嵌套子查询。(错误# 31472704)

  • 的可识别语法声明中包括一个命令子句,但是没有解析该子句,因此执行引擎可能会遇到无效数据。(错误# 31387510)

  • 服务器在启动时试图访问不存在的临时目录,导致失败。添加了检查,以确保临时目录存在,并且文件在tmpdir目录中。(错误# 31377118)

  • 在删除冗余排序时,由于另一个窗口的排序要求行按顺序排列,因此删除了窗口的排序。当另一个窗口因为未使用而随后被删除时,这将导致无序行,这是在求值期间所不期望的。

    在这种情况下,直到删除任何未使用的窗口之后才执行冗余排序的删除。此外,任何卷集的解析都已转移到准备阶段。(错误# 31361393)

  • 半同步复制错误被错误地写入带有子系统标记的错误日志服务器.现在它们的标签是Repl,与其他复制错误相同。(错误# 31327337)

  • 用户可以将自己作为角色授予自己。(错误# 31222230)

  • 服务器并不总是正确地处理多个在哪里条件,其中一个总是FALSE,引用相同的子查询。(错误# 31216115)

  • 与一个lower_case_table_names = 2设置,InnoDB后台线程有时会使用错误的字符大小写来获取表元数据锁,从而导致不受保护的元数据和竞争条件。现在应用了正确的字符大小写。还实现了一些更改,以防止在相应的数据字典对象之前释放元数据锁,并改进了在获取数据字典对象时检查锁保护的断言代码。(错误# 31165802)

  • 如果一个CR_UNKNOWN_ERROR要发送给客户端时,发生了异常。(错误# 31123643)

  • 转换值到类型的值枚举,或可能会产生未定义的行为消毒剂警告。(错误# 31019130)

  • 某些帐户可能导致服务器启动失败,如果skip_name_resolve使能系统变量。(错误# 31018510)

  • 如果通信数据包包含错误数据,客户端程序可能会意外退出。(错误# 30890850)

  • 修复了客户端库中的缓冲区溢出问题。(错误# 30885987)

  • 在创建多值索引或其他函数索引时,在对定义索引的表执行查询时会看到性能下降,即使索引本身实际上没有使用。发生这种情况的原因是,对查询中的每一行计算了支持这些索引的隐藏虚拟列。(错误# 30838749)

    这个问题是:Bug #28069731的回归。

  • CMake检查libcurl依赖关系是改善。(错误# 30268245)

  • mysql_config_editor错误地处理在密码值中作为注释字符。(Bug #29861961, Bug #95597)

  • 在某些情况下,优化器试图为空字符串计算散列值。现在总是使用固定值来代替。(错误# 22588319)

  • INSERT ()而且RPAD ()函数没有正确设置结果的字符集。(Bug #22523946, Bug #79909, Bug #31887870, Bug #100841)

  • 一些极端情况val1共用val2val3是这样固定下来的吗9223372036854775808和1之间的1返回真。(Bug #22515857, Bug #79878)

  • 对于性能模式memory_summary_global_by_event_name表中,低水位列可能有负值,而高水位列的值不断增加,即使服务器内存使用情况没有增加。(Bug #22246001, Bug #79285)

  • 修复了将字符串转换为数字的几个问题。(Bug #19186271, Bug #73248)

  • 执行正确的查询时,某些组没有返回预期的结果与汇总是补充道。这是因为十进制信息并不总是正确地通过汇总组项进行管道传输,导致函数返回十进制值,例如截断()接收错误类型的数据。(Bug #101684, Bug #32179240)

  • 在创建用于实体化临时表的字段时(也就是说,当需要对连接排序时),优化器检查该项是否需要复制,还是只是一个常量。在一个特定的案例中,这一点没有正确执行;在对包含常量的视图或派生表执行外部连接时,该项没有正确地物化到表中,这可能会产生错误的情况的结果。(Bug #101622, Bug #32162862)

    参考文献:参见Bug #31790217。

  • REGEXP_REPLACE ()是在SQL语句中使用的内部函数Regexp_engine:替换()未在处理一条记录后重置错误码值,这可能会影响下一条记录的处理,从而导致问题。

    我们感谢霍普·李的贡献。(Bug #101256, Bug #32050219)

  • 对于具有以下形式的查询,列列表有时会在创建临时表后假设不一致的状态,导致稍后的越界索引:

    SELECT * FROM (SELECT PI() FROM t1 AS table1, t1 AS table2) ORDER BY PI(), table1。a) AS d1;

    (Bug #101012, Bug #31955761, Bug #31978439)

    参考文献:此问题是Bug #31790217的回归。

  • 在聚合已经排序的数据时(由于没有使用临时表,称为执行流聚合),在处理下一个组中的第一行之前无法确定组何时结束,这时要输出的组表达式通常已经被覆盖。

    解决这个问题的方法是,用一种更简单的方法替换以前使用的复杂逻辑,即在第一次遇到组时为组保存有代表性的行,这样在需要时就可以很容易地为输出行检索其列。(Bug #100791, Bug #27272052, Bug #31073167, Bug #31790217, Bug #31868610)

  • 时,使用全文匹配的子查询可能不能正常执行subquery_to_derived已启用,并可能导致在调试版本中进行断言。(Bug #100749, Bug #31851600)

  • 当一个ALTER TABLE……转换为字符集语句执行时,每个字符VARCHAR,文本表中的列被更新为新的字符集价值。这个改变也应用于隐藏字符使用的列数组列用于多值索引;因为隐藏列的字符集必须是my_charset_utf8mb4_0900_bin二进制,这会导致在服务器的调试版本中进行断言。

    方法时不再将隐藏列的字符集设置为表的字符集,从而解决了此问题ALTER TABLE声明引用之前;这与所做的类似列在类似的情况。(Bug #99403, Bug #31301101)

  • 在某些情况下,服务器的内部字符串转换例程在处理使用长度说明符的浮点值时出现问题,并触发使用科学记数法。(Bug #92537, Bug #101570, Bug #28691605, Bug #32144265)

    参考文献:参见Bug #88256, Bug #27041543。