Documentation Home
MySQL 5.7 发行说明  /  MySQL 5.7.23 的变化(2018-07-27,正式发布)

MySQL 5.7.23 的变化(2018-07-27,正式发布)

笔记

此版本包括对 innodb_index_statsinnodb_table_stats系统表的更改。升级到此版本时,请务必运行 mysql_upgrade以包含这些更改。

审核日志说明

  • 对于新的 MySQL 安装,MySQL Enterprise Audit 使用的表中的USERHOST列 现在具有更好地对应于系统表 中的和列audit_log_user的定义的定义。UserHostmysql.user

    对于已安装 MySQL Enterprise Audit 的安装升级,建议您按如下方式更改表定义:

    ALTER TABLE mysql.audit_log_user
      DROP FOREIGN KEY audit_log_user_ibfk_1;
    ALTER TABLE mysql.audit_log_filter
      ENGINE=InnoDB;
    ALTER TABLE mysql.audit_log_filter
      CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
    ALTER TABLE mysql.audit_log_user
      ENGINE=InnoDB;
    ALTER TABLE mysql.audit_log_user
      CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
    ALTER TABLE mysql.audit_log_user
      MODIFY COLUMN USER VARCHAR(32);
    ALTER TABLE mysql.audit_log_user
      ADD FOREIGN KEY (FILTERNAME) REFERENCES mysql.audit_log_filter(NAME);

    (漏洞 #23706056)

编译笔记

  • Solaris: 现在可以使用 gcc在 Solaris 上编译 MySQL 。(漏洞 #27802681)

弃用和移除说明

  • 子句的显式ASCDESC 限定符GROUP BY现已弃用,并将在未来的 MySQL 版本中删除。

防火墙注意事项

  • MySQL Enterprise Firewallfirewall_whitelist表现在包含一个名为 的主键列ID。(漏洞#27164826)

安全说明

  • MySQL Commercial Server 的链接 OpenSSL 库已更新到版本 1.0.2o。http://www.openssl.org/news/vulnerabilities.html中描述了新 OpenSSL 版本中修复的问题 。

    此更改不影响 Oracle 生成的 MySQL Community 构建的 MySQL Server,它使用 yaSSL 库。(漏洞 #28025379)

  • 在 MySQL 5.7 中,默认的身份验证插件是 mysql_native_password. 从 MySQL 8.0 开始,默认身份验证插件更改为 caching_sha2_password. 为了使 MySQL 5.7 客户端能够使用通过 进行身份验证的帐户连接到 8.0 及更高版本的服务器caching_sha2_password,MySQL 5.7 客户端库和客户端程序现在支持 caching_sha2_password客户端身份验证插件。这提高了 MySQL 5.7 客户端连接能力相对于 MySQL 8.0 和更高版本服务器的兼容性,尽管默认身份验证插件存在差异。有关详细信息,请参阅 缓存 SHA-2 可插入身份验证

添加或更改的功能

  • 以前,对于 --ssl-mode=VERIFY_IDENTITYor --ssl-verify-server-cert选项,客户端检查它用于连接的主机名是否与证书中的 Common Name 值匹配,而不是 Subject Alternative Name 值。现在,如果客户端使用 OpenSSL 1.0.2 或更高版本,客户端会检查主机名是否与服务器证书中的 Subject Alternative Name 值或 Common Name 值匹配。感谢 Daniël van Eeden 提供此更改所基于的补丁。(错误#16211011、错误#68052、错误#27511233、错误#89578)

修正错误

  • 重要变更;分区: 创建InnoDB 名称很长的分区表和 table_name 相应条目中的列 被截断。为解决此问题,每个表中列的长度 已从 64 个字符增加到 199 个字符。在这两种情况下,这现在与 MySQL 8.0 中这些列的长度相同。 mysql.innodb_index_statsmysql.innodb_table_statstable_name

    当升级到这个版本时,使用 mysql_upgrade来影响你的 MySQL 安装中的这些更改。如果您未能执行此操作,MySQL 将生成警告表 mysql/innodb_table_stats 在列名 table_name 中的长度不匹配。请在错误日志中 运行 mysql_upgrade 。

    笔记

    某些平台(例如 Microsoft Windows)可能会将路径长度 ( MAX_PATH) 限制为最大 260,这可能会导致创建长名称的分区表失败。您可以通过启用 NTFS 长路径名来避免 Windows 系统上的这个问题;有关如何执行此操作的信息,请参阅系统文档。

    (漏洞 #86926,漏洞 #26390736)

  • InnoDB: ngram 全文搜索解析器允许将逗号和句点字符标记为单词,这导致布尔和自然语言模式搜索结果不一致。逗号和句点字符不再标记化。(漏洞#27847697)

  • InnoDB:操作 返回的 I/O 错误fsync()现在被视为硬错误。(缺陷 #27805553,缺陷 #90296)

  • InnoDB: 导入表空间操作期间报告的架构不匹配错误无法以可读格式打印不匹配的表标志。(漏洞#27542720)

  • InnoDB: DDL 操作未能等待FULLTEXT 索引优化操作完成。(漏洞#27326796)

    参考资料:此问题是 Bug #24938374 的回归。

  • InnoDB:trx_set_rw_mode()从函数 中删除了对只读事务的不必要检查感谢 Sandeep Sethia 提供补丁。(错误#27211287,错误#88739)

  • InnoDB: 添加外键约束的 DDL 操作在访问属于父表的陈旧内存对象时引发断言。(缺陷号 27208858)

  • InnoDB:FULLTEXT 全文索引缓存同步时对 有索引的表进行DDL操作(错误#27082268,错误#27095935)

  • InnoDB:启动memcached get 操作 后发生断言失败 (漏洞#26876594)

  • InnoDB: 在外键检查期间遇到损坏的索引 ID 引发断言。(漏洞#26654685)

  • InnoDB: DDL 操作期间的内部死锁导致长时间信号量等待,然后服务器退出。(漏洞 #26225783)

  • InnoDB: 由于锁升级无效,DDL 操作遇到严重错误。(漏洞 #26225783)

  • InnoDB: 在 Windows 64 位系统上,无效的缓冲池配置值导致服务器在启动时退出。(缺陷 #26100239,缺陷 #86370)

  • 分区: 对于分区表,重建表或重启服务器后分区更新时间可能不正确。(错误号 27073100)

  • 分区:InnoDB对分区表 的更新强加了一个无关的行锁 (漏洞 #87253,漏洞 #26553164)

  • 复制: 当成员加入组失败时生成的日志消息已得到改进,例如,当 group_replication_group_name加入组的成员与种子不匹配 group_replication_group_name 时,日志消息中现在对此进行了描述。(漏洞#27628695)

  • 复制: 复制过滤器或二进制日志过滤器的使用在应用于使用 XA 事务更新的表时可能会导致问题。过滤表可能会导致复制从属上的 XA 事务为空,并且不支持空 XA 事务。此外,对于复制从属服务器上的设置 master_info_repository=TABLErelay_log_info_repository=TABLE 这成为 MySQL 8.0 中的默认设置,数据引擎事务的内部状态在过滤后的 XA 事务后发生更改,并且可能与复制事务上下文状态不一致。

    由于这些问题,不支持将复制过滤器或二进制日志过滤器与 XA 事务结合使用。此修复程序添加了新错误 ER_XA_REPLICATION_FILTERS,无论何时 XA 事务受到复制过滤器的影响,都会记录该事务,无论事务是否因此为空。如果事务不为空,复制从属能够继续运行,但您应该采取措施停止对 XA 事务使用复制过滤器以避免潜在问题。如果事务为空,则复制从站停止。在那种情况下,复制从属可能处于不确定状态,在这种状态下,复制过程的一致性可能会受到损害。特别是,gtid_executedslave 的 slave 上的设置可能与 master 上的设置不一致。要解决这种情况,请隔离 master 并停止所有复制,然后检查复制拓扑中的 GTID 一致性。撤消生成错误消息的 XA 事务,然后重新启动复制。(漏洞#27442477)

  • Replication: 当一个大于binary log transaction cache size(binlog_cache_size)的事务在处理过程中flush到一个临时文件,由于临时目录空间不足导致flush失败,没有正确处理flush错误。错误日志没有写入任何信息,事务回滚后二进制日志缓存也没有清空。现在,在这种情况下,服务器会根据设置采取适当的操作 binlog_error_action(关闭服务器或停止日志记录),并将消息写入错误日志。当事务回滚时,服务器会检查刷新错误并清除二进制日志缓存(如果有的话)。(漏洞 #27399620,漏洞 #89272)

  • 复制: 在 macOS 上的任何组复制相关配置中使用 IP 地址或主机名失败。(错误#27376511、错误#89123、错误#27604471)

  • 复制: 当 GTID 用于复制时,在从服务器上过滤掉的复制事务将被持久化。如果在从站上启用了二进制日志记录,则过滤掉的事务将写入二进制日志,Gtid_log_event 后跟一个仅包含 BEGINCOMMIT语句的空事务。如果禁用二进制日志记录,则过滤掉的事务的 GTID 将写入mysql.gtid_executed表中。此过程确保已执行的 GTID 集合中没有间隙,并且如果从属重新连接到主,则不会再次检索过滤掉的事务。以前,此过程未针对 CREATE DATABASEALTER DATABASEDROP DATABASE语句,但现在对这些语句以及其他语句执行。(漏洞 #27308751,漏洞 #88891)

  • 复制: 在多线程从站上,当在STOP SLAVE从站上执行一条语句,然后执行一条START SLAVE语句时,错误日志可以在退出时为从站 SQL 线程报告二进制日志中的不同位置,与为从站 SQL 报告的位置相比线程在随后的初始化。

    对于多线程从站,SQL 线程在退出时报告的位置是一个低水位线,在此之前复制流是一致的并且没有间隙。出现在该位置之前的事务保证已提交,但该位置之后的事务可能已提交或未提交。然而,这个低水位线是在停止工作线程的过程实际执行之前报告的,并且低水位线随后在该过程中由检查点例程更新。现在更改了日志消息的时间,以便将最终低水位线报告为退出时 SQL 线程的位置。(缺陷号 27300658)

  • 复制: 无法对运行早于 5.7.23 版本的 MySQL 的复制组进行在线升级。当运行 MySQL 5.7.22 或 MySQL 8.0.11 之前版本的成员试图加入一个运行 MySQL 5.7.21 或更早版本的成员的组时,它无法加入该组,因为 MySQL 5.7.21 没有发送值它是 lower_case_table_names系统变量。这意味着较新的版本将 lower_case_table_names变量与无效值进行比较并退出该组。解决方法是使组脱机,升级到版本 5.7.23 或 8.0.12 及更高版本。然后可以在不使组脱机的情况下执行组的后续升级。看 升级组复制。(缺陷 #90794,缺陷 #27991334)

  • 复制: 在某些情况下,例如在分布式恢复过程中,认证信息垃圾收集清除的数据多于应有的数据,导致未检测到冲突。已改进垃圾收集程序以考虑这种情况。(漏洞 #89938,漏洞 #27652526)

  • 复制: 错误 ER_GRP_RPL_SQL_SERVICE_FAILED_TO_RUN_SQL_QUERY 被错误地记录。(错误#89788,错误#27590534)

  • Replication:group_replication_applierchannel的applier线程遇到错误时,错误信息中的 master_log_nameend_log_pos不正确。在 Group Replication 中,事务的事件在写入事务发起的成员的二进制日志之前被复制。结果是这些事件的最终master_log_name和 通道的应用程序线程end_log_pos应用于副本时是未知的 group_replication_applier为避免混淆,现在通道遇到的任何此类错误消息group_replication_applier 都不包含二进制日志名称和二进制日志位置。(错误#89146,错误#27368735)

  • 修复了 MySQL 客户端库中的堆溢出漏洞。(缺陷号 27980823)

  • 对于使用该 INTERVAL()函数的生成列,可能会出现不正确的行为。(漏洞#27881102)

  • mysqltestexec_in_background命令 现在可用于 MySQL 5.7 (漏洞 #27858055)

  • 如果服务器未配置为支持 SSL,则客户端连接尝试指定需要加密连接可能导致未加密连接。(漏洞 #27759871)

  • BETWEEN比较负值的子句可能会导致错误的结果 。(漏洞#27691347)

  • 审核日志过滤规则不允许将类名指定为字符串数组。现在这是可能的。例子:

    {
      "filter": {
        "class": [
          { "name": [ "connection", "general", "table_access" ] }
        ]
      }
    }

    (缺陷号 27628325)

  • 在 Windows 上,如果已删除 Visual C++ Redistributable for Visual Studio,则使用 MSI 安装程序卸载 MySQL 会失败。(漏洞#27621546)

  • audit_log_read()加载函数可能会死锁。由于此问题的修复, audit_log_read()不再使用共享全局缓冲区。每个调用都会分配自己的缓冲区,该缓冲区在调用期间一直存在。要控制缓冲区大小,请设置audit_log_read_buffer_size 系统变量。以前,此变量仅存在于全局范围内,默认值为 1MB。现在,该变量也存在于会话范围内,具有较小的默认值 32KB,并且可以在运行时设置。每个客户端都应将其会话值设置为 audit_log_read_buffer_size 适合其对 audit_log_read(). (漏洞 #27545962)

  • FEDERATED在存储过程中,如果涉及的表使用存储引擎 ,则不可能编写条件处理程序来捕获外键故障。(漏洞 #27509959)

  • 在 禁用 SQL 模式的情况下, 如果使用系统变量禁用了所需的引擎 ,则会NO_ENGINE_SUBSTITUTION发生错误(而不是替换) 。(漏洞 #27502530)CREATE TABLEALTER TABLEdisabled_storage_engines

  • 如果 MySQL Enterprise Firewall 配置了大​​量规则,服务器关闭可能需要很长时间。(漏洞#27492122)

  • 单元测试中的内存泄漏pfs-t已修复。感谢 Yura Sorokin 提供的补丁。(漏洞 #27440735,漏洞 #89384)

  • automatic_sp_privileges 启用后,EXECUTE和 权限ALTER ROUTINE未正确授予例程创建者。(漏洞 #27407480)

  • 某些使用排序的查询可能会在优化期间访问未初始化的列并导致服务器退出。(漏洞#27389294)

  • 对于调试版本,针对具有包含空字符串的列ALTER TABLEARCHIVE表 提出了断言(而不是错误) 。GEOMETRY NOT NULL(漏洞 #27330634,漏洞 #89088)

  • 如果无法读取或初始化系统表,则服务器会写入一条不完整的错误消息。感谢 Daniël van Eeden 提供与修复相关的补丁。(漏洞 #27302337,漏洞 #89001)

  • keyring_okv主服务器不可用时,插件并不总是故障转移到备用 OKV 服务器。(漏洞#27244099)

  • 性能模式可能会尝试访问无效的 SOURCE列值。(漏洞 #27231036)

  • 内部权限结构处理不当可能导致服务器退出。(漏洞#27230925)

  • 使用UTF8 字符集时UNION,用户定义的变量和 DECIMAL列的 产生了不正确的结果。(缺陷号 27197235)

  • max_execution_time 与全文搜索一起使用时, 设置有时无效。(漏洞 #27155294)

  • 对于使用该算法增加表VARCHAR列 长度的 尝试,如果该列已被索引,则尝试失败。 InnoDBALTER TABLEINPLACE

    如果索引大小超过InnoDB767 字节COMPACTREDUNDANT行格式 的限制CREATE TABLE, 则ALTER TABLE不会报告错误(在严格 SQL 模式下)或警告(在非严格模式下)。(缺陷号 26848813)

  • 在 MySQL 5.7.19 中,该mysql.gtid_executed 表已从转储中排除。该表不再被排除,但其数据未被转储。(漏洞 #26643180,漏洞 #87455)

    参考:此问题是 Bug #82848、Bug #24590891 的回归。

  • 系统变量控制在 slave_rows_search_algorithms 为基于行的日志记录和复制准备成批的行时如何搜索行以查找匹配项。INDEX_SCAN如果存在索引,则指定其中一种搜索算法会执行索引扫描。在 master 和 slave 上使用不同的主键,并且 slave 上存在唯一键的情况下,代码中的错误意味着没有按应有的方式执行索引扫描,并且表速度较慢正在执行扫描。该问题现已得到纠正,因此可以使用索引扫描。(错误#26450129、错误#23311892、错误#81500、错误#81501)

  • 子查询具体化的某些情况可能会导致服务器退出。这些查询现在会产生一个错误,提示物化被禁用。(漏洞 #26402045)

  • mysqldump--where因大选项值异常退出 (错误#26171967、错误#86496、错误#27510150)

  • 对于表,特定的和 语句MyISAM序列 可能会导致表损坏。(漏洞 #25541037)INSERTDELETE

  • SHOW CREATE USER语句需要数据库的SELECT权限mysql,但不能查看当前用户的信息。此外,对于当前用户,该语句需要系统表的SELECT 权限才能在子句mysql.user中显示密码哈希;IDENTIFIED AS否则,哈希显示为 <secret>. (漏洞 #24911117)

  • CREATE FUNCTION如果没有默认数据库并且函数体调用了另一个函数,则会产生错误。(缺陷 #24357244,缺陷 #82350)

  • 对于调试版本,SELECT 如果派生表解析失败,则在存储程序中执行的语句可能会引发断言。(漏洞 #23221336)

  • 如果使用mysqldumpmysqlpump 转储二进制数据而没有 --hex-blob选项,重新加载转储文件可能会产生虚假警告(无论警告如何,值都被正确插入)。这些值现在由_binary 介绍者写入,以消除警告。(缺陷 #22601255,缺陷 #80150)