Documentation Home
MySQL 5.7 发行说明  /  MySQL 5.7.21 的变化(2018-01-15,正式发布)

MySQL 5.7.21 的变化(2018-01-15,正式发布)

审核日志说明

  • MySQL Enterprise Audit 现在支持审计日志文件的压缩和加密。加密基于用户定义的密码。要使用此功能,必须启用 MySQL 密钥环,因为审核日志记录使用它来存储密码。除了现有的 XML 格式外,MySQL Enterprise Audit 现在还支持 JSON 格式的日志记录。对于 JSON 格式,可以使用提供运行时日志读取功能的函数。有关其他信息,请参阅MySQL 企业审计

    笔记

    与以前的 MySQL 版本相比,日志文件名(audit_log_file系统变量值)的解释发生了变化,审计日志插件初始化和终止时的日志文件重命名行为也发生了变化。请参阅 审计日志文件的命名约定

配置注意事项

  • 对于 RHEL、SLES 和 Fedora RPM,调试构建的默认插件目录已从更改 /usr/lib64/mysql/plugin/usr/lib64/mysql/plugin/debug. (缺陷 #27072155,缺陷 #88363)

  • MySQL Enterprise Audit 和 MySQL Enterprise Firewall 的安装脚本现在在mysql系统数据库中创建它们的关联表InnoDB而不是 MyISAM表。(错误#26323351,错误#26906601)

  • 内存映射事务协调器的 8KB 硬编码内存页面大小对于 ARM64 和 PowerPC 等页面大小要大得多的平台来说太小了。服务器现在调用系统调用来获取当前平台的页面大小,而不是使用硬编码值。该--log-tc-size选项的结果是最小值和默认值现在是页面大小的 6 倍。此外,该值必须是页面大小的倍数。感谢 Alexey Kopytov 提供的补丁。(错误#23014086、错误#80818、错误#26931470、错误#87995)

弃用和移除说明

  • InnoDB: 配置innodb_undo_tablespaces 选项已弃用,将在未来的 MySQL 版本中删除。

  • 复制: 系统 group_replication_allow_local_disjoint_gtids_join 变量已被弃用,并计划在未来的 MySQL 版本中删除。

  • mysqlpump不再 SQL_NO_CACHE在语句中包含修饰符,因为该修饰符现在已弃用并导致弃用警告。(漏洞#26694675)

  • Performance Schemasetup_timers 表现在已弃用,将在 MySQL 8.0 中删除,表中的 TICK行也是 如此performance_timers。(错误号 18296337)

钥匙圈笔记

可插拔认证

  • 对于 LDAP 身份验证插件,由 authentication_ldap_sasl_group_search_attrauthentication_ldap_simple_group_search_attr 系统变量指示的组搜索属性的处理更加灵活。如果组搜索属性为isMemberOf,LDAP 认证直接检索用户属性isMemberOf值并将其分配为组信息。如果组搜索属性不是isMemberOf,则 LDAP 身份验证会搜索用户所属的所有组。(后者是默认行为。)此行为基于如何以两种方式存储 LDAP 组信息:1) 组条目可以具有名为 memberUidmember值为用户名;2) 用户条目可以有一个属性,该属性以isMemberOf组名的值命名。(漏洞#26317645)

  • LDAP 身份验证插件现在允许提供用户 DN 信息的身份验证字符串以 +字符开头。在没有此字符的情况下,身份验证字符串值将被视为未经修改,就像以前一样。如果身份验证字符串以 开头+,则插件从帐户用户名构造完整的用户 DN 值作为cn属性值,连同身份验证字符串(已+ 删除)。身份验证字符串存储在 mysql.user系统表中,完整的用户 DN 在身份验证之前即时构建。

    该账号认证字符串没有 +开头,所以取为完整的用户DN:

    CREATE USER 'admin'
      IDENTIFIED WITH authentication_ldap_simple
      BY "cn=admin,ou=People,dc=example,dc=com";

    此帐户身份验证字符串确实有 +开头,因此它只是作为完整用户 DN 的一部分:

    CREATE USER 'accounting'
      IDENTIFIED WITH authentication_ldap_simple
      BY "+ou=People,dc=example,dc=com";

    在这种情况下,完整的用户 DN 是使用 accountingascn 属性和身份验证字符串构造的,以产生 "cn=accounting,ou=People,dc=example,dc=com". (缺陷号 26147775)

  • 对于 LDAP 身份验证插件,组搜索属性是固定的且不可配置。两个新的系统变量现在可以使用自定义组过滤器: authentication_ldap_sasl_group_search_filterauthentication_ldap_simple_group_search_filter。(缺陷号 26091340)

安全说明

  • 不兼容的更改: 密码现在限制为最多 256 个字符,用于sha256_password身份验证插件和PASSWORD()函数 whenold_passwords=2. 此外,密码散列轮次的数量受到限制,以限制使用的 CPU 时间。(错误#27099029,错误#27194270)

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

    此更改不影响 Oracle 生成的 MySQL Community 构建的 MySQL Server,它使用 yaSSL 库。(错误#27212666,错误#27236394)

测试套件说明

  • MySQL 测试套件的文档现在使用 Doxygen 在 MySQL 源代码树中维护(请参阅 MySQL 服务器 Doxygen 文档,可在 https://mysql.net.cn/doc/index-other.html获得。)相关的 Unix 手册页以前根据旧测试套件手册生成的测试不再更新并且已经过时了。因此,它们不再包含在 MySQL 发行版中。(漏洞 #27021754)

  • MySQL 测试套件现在包括 CRC32()测试。感谢 Daniel Black 提供的补丁。(错误#26495791,错误#87136)

添加或更改的功能

  • 复制:group_replication_ip_whitelist现在可以使用 系统变量 将主机名指定为组复制连接白名单的一部分 主机名支持 CIDR 表示法。不支持解析为 IPv6 地址的主机名。

    对于主机名,仅当另一台服务器发出连接请求时才会进行名称解析。无法解析的主机名不会被考虑用于白名单验证,并且警告消息会写入错误日志。对已解析的主机名进行前向确认反向 DNS (FCrDNS) 验证。

    警告

    主机名本质上不如白名单中的 IP 地址安全。FCrDNS 验证提供了良好的保护级别,但可能会受到某些类型的攻击。仅在绝对必要时才在白名单中指定主机名,并确保用于名称解析的所有组件(例如 DNS 服务器)都在您的控制之下。您还可以使用主机文件在本地实现名称解析,以避免使用外部组件。

  • CMake选项启用 AddressSanitizer Clang 标志以进行范围后使用检测 。默认关闭。要使用此选项,还必须启用。(缺陷号 27095089)-DWITH_ASAN_SCOPE -fsanitize-address-use-after-scope-DWITH_ASAN

修正错误

  • 重要变更;分区: 检查使用通用分区处理程序的表可能会在启动 MySQL 服务器时导致几分钟的延迟。为了防止这种情况发生,该 --disable-partition-engine-check 选项现在默认启用。(缺陷 #85830,缺陷 #25846957)

  • 表现; JSON: 创建 JSON 字符串的表示现在优化了最常见的情况——要处理的字符串不包含需要转义的特殊字符——扫描字符串中的第一个特殊字符,并复制每个字符序列不需要在单个 memcpy()调用中转义,而不是依次检查每个字符以确定它是否需要转义,如果需要则转义它,然后像以前那样一个一个地复制它。

    此修复程序还纠正了无法转义控制字符 \u001f或单位分隔符的问题。(错误#86898、错误#26388690、错误#87722、错误#26780307)

    参考资料:另请参阅:Bug #25977595。

  • InnoDB: 由于错误设置的锁类型,分区表上来自不同客户端的多个更新导致意外的锁等待超时。(漏洞 #26731025,漏洞 #87619)

  • InnoDB: 一个ALTER TABLE操作导致服务器停止。(漏洞#26492721)

  • InnoDB:重命名分区表时 ,innodb_table_stats数据字典表未使用新分区名称更新。(漏洞 #26390658,漏洞 #86927)

  • InnoDB: 操作FLUSH TABLES未能删除中止的索引。从缓存中删除表时,聚集索引在检查中止索引之前被删除。(漏洞 #26256456,漏洞 #86607)

  • InnoDB: 处理外部级联操作的迭代方法导致内存使用过多。(漏洞 #26191879,漏洞 #86573)

    参考:这个问题是 Bug #16244691 的回归。

  • InnoDB:INSERT由于在锁冲突检查期间发生故障,对具有空间索引的表 的(缺陷号 25729649)

  • InnoDB: 当历史列表的长度超过 2000000 时,应该只出现在 MySQL 调试版本中的警告被打印到错误日志中。(Bug #24296076,Bug #82213)

  • InnoDB: Attempting to reduce the buffer pool size to less than the buffer pool chunk size 没有报告警告。(缺陷号 23590280)

  • InnoDB:添加 了错误的键列错误以解决不支持的索引创建方案。(缺陷号 22486025)

  • InnoDB: 对使用二进制排序规则的索引列的全文搜索未返回区分大小写的匹配项。(缺陷 #21625016,缺陷 #78048)

  • 打包: 尝试使用 MySQL Yum 存储库在 Fedora 27 上安装 MySQL Server 时,由于与本机mariadb-connector-c-devel包冲突,安装失败。通过此修复,已为该包和其他本机包添加了适当的“过时” 。(缺陷号 26963839)

  • 复制: Bug #26117735(MySQL Bug #86288)的修复可能会在使用 选项和选项运行mysqlbinlog时导致调试断言 ,具体取决于重写规则中指定的数据库名称。该问题现已得到纠正。(缺陷号 26878022)--read-from-remote-server--rewrite-db

  • 复制: 使用 yaSSL 编译的 MySQL 和使用的半同步复制,死锁可能是由确认数据包的不正确处理引起的。yaSSL 可以同时读取多个确认包,但半同步复制的接收线程只处理轮询后看到的第一个确认包。现在,接收器线程处理缓冲区中存在的所有确认数据包。(漏洞#26865538)

  • 复制: 在使用半同步复制的情况下,如果 RESET MASTER在活动事务等待从服务器确认时发出,则 Rpl_semi_sync_master_wait_sessions 等待完成后服务器状态变量中等待会话的计数不正确。(缺陷号 26748533)

  • 复制: XA ROLLBACK 由于给出了不正确的事务 ID 而失败的语句可以使用正确的事务 ID 记录在二进制日志中,因此可以由复制从属操作。现在会在二进制日志记录发生之前检查错误情况,并且 XA ROLLBACK 不会记录失败的语句。(漏洞 #26618925,漏洞 #87393)

  • 复制: 半同步复制的接收线程无法接收到来自使用主/从协议压缩的从属设备的确认 (slave_compressed_protocol=ON)。接收器线程现在可以正确处理压缩确认。(漏洞 #26027024,漏洞 #86230)

  • 复制: 在复制从站上,在XA_STATEPerformance Schema 表的字段中 events_transactions_current,XA 事务的状态被错误地报告为 COMMITTED而不是 在从站上应用语句PREPARED之后 XA PREPARE(缺陷号 25940184)

  • Replication:binlog_rows_query_log_events在多源复制拓扑中,当 在 master 上启用 时,slave 可能会发生内存泄漏 在这种情况下,Rows_query存储在从服务器上的日志事件实例不会被删除。现在已清理日志事件实例并释放内存。感谢 Vlad Lesin 对补丁的贡献。(错误#25695434、错误#85371、错误#85034)

  • 复制: 修复了基于 GTID 的复制中的内存泄漏。在为跳过或忽略的事件更新存储库表后,内存未被释放。(错误#25656123,错误#85251)

  • 复制: 当多线程从属服务器上的工作线程无法应用后续事务所依赖的事务时,协调器线程可以在收到问题通知之前开始调度相关事务。如果 STOP SLAVE在这种情况下发出请求,则会导致在调试版本中引发断言。(缺陷号 25585436)

  • 复制:group_replication_enforce_update_everywhere_checks=ON Group Replication 插件检查是否存在外键级联并禁止更新此类表时。但是 SET NULL,未检查操作,这可能会导致数据不一致。现在,当 时 配置了选项group_replication_enforce_update_everywhere_checks=ON,则对子表的操作将被阻止 SET NULL(漏洞 #25404162)

  • 复制: 在 Windows 上,组复制生成的错误现在包含详细的错误消息,而不仅仅是错误编号。(缺陷号 24918678)

  • 复制: 在使用基于语句的复制时,如果 在以 结尾的 XA 事务UPDATEor ,并且该语句不影响任何行,则会发生复制错误。没有将 语句写入二进制日志,因此从属服务器将 XA 事务识别为在提交请求时仍处于活动状态。 即使事务不影响任何行,现在也会写入所需的(漏洞 #24812958,漏洞 #83295)DELETEXA COMMIT ONE PHASEXA ENDXA END

  • 复制: 属于一个组的所有服务器都必须具有由设置的唯一 UUID server_uuid,但这不是由组复制强制执行的,并且可以添加具有重复 UUID 的成员。(缺陷 #88452,缺陷 #27105803)

  • 复制: 作为加入组的一部分的分布式恢复期间,当应用程序发出信号表明它已应用所有事务时,它也在盲目地搜索部分事务。这是为了避免未来的应用程序错误,如果应用程序在此时停止,就会发生这种情况。但是,此搜索和删除仅对应用程序停止案例有意义。执行完成后不应执行此操作,否则会损坏或清除应用程序中继日志,从而导致数据丢失。为了解决这个问题,应用程序在等待执行完成时,不再搜索和删除部分事务。(漏洞 #88304,漏洞 #27049034)

  • 复制: 组复制在插件启动和停止期间在服务器上执行内部操作,例如使用内部会话启用或禁用只读模式。打开此内部会话时,如果会话总数超过 设置的允许打开会话数 max_connections,操作会按预期失败,但会留下一个线程,这会在以后引起问题。(错误#88182、错误#27008102、错误#27016552)

  • 复制:--initialize如果组复制配置为在使用or 初始化服务器时在服务器启动时启动 --initialize-insecure,因为复制应用程序基础结构未初始化,这会导致断言。现在,初始化服务器时不会启动组复制。(漏洞 #87759,漏洞 #26802395)

  • 复制: 在负载较重的组中,加入成员可能需要检索大量数据才能与组同步。如果检索到的数据量超过 View_change4Mb 的数据包大小,则成员将无法加入组并进入Error 状态。现在,数据包大小取自 slave_max_allowed_packet,默认为 1GB。根据您的组进程的负载,您可能希望通过配置 slave_max_allowed_packet. (漏洞 #87701,漏洞 #26770576)

  • Replication: 在加入成员持续收到交易的群组中,加入成员有时无法进入在线状态。这是由于测试传入消息队列的方式所致。(漏洞 #87631,漏洞 #26731317)

  • Replication: 无论一台机器上配置了多少虚拟 IP,Group Replication 只能访问前 12 个地址。(错误#86772,错误#26324852)

  • Microsoft Windows: 在 Windows 上,启用了myisam_use_mmapflush系统变量, MyISAM并不总是正确地刷新表文件。(缺陷号 26880757)

  • Microsoft Windows: 在 Windows 上,改进了用于查询性能评估的计时器的分辨率。(错误#22305994,错误#26734457)

  • JSON: 当插入JSON结果创建的值GROUP BY,插入的值有时可能包括先前插入该列的所有值的串联。(错误#87854,错误#26867509)

  • event过滤规则的项目中, audit_log插件没有正确处理指定为JSON数组的值。(漏洞 #27010045)

  • VALUES()在某些情况下没有正确处理。(漏洞#26881946)

    参考资料:另请参阅:Bug #19601973、Bug #17458914。

  • 在某些情况下,包含比较运算符的虚拟生成列表达式可能会导致后续语句访问同一表时出现问题。(漏洞#26881855)

  • 对于调试版本,语句可能会错过对相关生成列的验证检查 UPDATE,从而导致服务器退出。(漏洞#26838771)

  • authentication_ldap_sasl_auth_method_name 系统变量 的默认值 被错误地设置为 ,SIMPLE 而不是SCRAM-SHA-1,并且该变量可能被设置为不允许的值。(漏洞 #26838525,漏洞 #26093370)

  • Linux 发行版使用不同的 SASL 库版本,具体取决于包类型。(漏洞#26773194)

  • 在子句中包含因违反约束而失败的值的INSERT语句之后,没有理由返回错误的类似语句可能会导致服务器退出。(漏洞#26734162)BLOBON DUPLICATE KEY UPDATE

  • 性能模式现在存储重写的而不是原始的 SQL 语句文本(如果可用)。(漏洞 #26732229)

  • SHA2()在某些字符集中传递用户定义的变量 时,可能会导致不正确的结果或服务器退出 。(漏洞 #26704451)

  • 由于尝试将 客户端插件链接到嵌入式服务器库,使用-DWITHOUT_SERVER=ON CMake选项 构建失败。authentication_ldap_sasl_client(漏洞#26665217)

  • 设置 authentication_ldap_simple_max_pool_size=0authentication_ldap_simple_init_pool_size=0 在运行时没有禁用 authentication_ldap_simple身份验证插件的 LDAP 连接池。(缺陷号 26646063)

  • 使用 LDAP 身份验证插件且创建时没有任何身份验证字符串的帐户可以由 LDAP 服务器进行身份验证,而不管连接时指定的密码如何。(漏洞#26634245)

  • 对于使用外部联接且派生表引用 const外部联接内部表中的值的查询,可能会返回不正确的结果。(漏洞#26627181)

  • AFTER UPDATEINSERT ... ON DUPLICATE KEY UPDATE当要更新的值和新值相同时,不会调用触发器 。(错误#26626277,错误#87371)

  • 更改UMASKUMASK_DIR环境变量的默认值对数据库目录和表文件访问没有影响。(缺陷号 26529942)

  • 创建具有过多索引信息的表可能会导致服务器退出。(缺陷号 26529369)

  • 当安装 Microsoft Visual C++ 2010 Redistributable Package 时,Windows 的 MSI 程序包无法检测到。(漏洞 #26501092,漏洞 #87139)

  • audit_logTHD 可以使用不正确的线程 ID 信息创建插件对象,从而导致断言失败。(漏洞#26362452)

  • HASH_SCAN被指定为 slave_rows_search_algorithms 系统变量的值之一时,这是 MySQL 8.0.2 的默认值,并且基于行的复制生效,对包含虚拟生成字段的表的更新可能会引发断言。该问题是由于在生成虚拟生成字段的字符串表示以创建用于搜索的哈希值时出现错误引起的。为了解决这个问题,MySQL 不再为虚拟生成的字段创建哈希。(缺陷号 26280724)

  • 在启用 GTID 的服务器上尝试使用mysqlpump进行 部分备份失败,并产生一条错误消息,错误地表明这是不可能的。(可以使用该 --set-gtid-purged选项。)(缺陷 #26199978)

  • ALTER TABLE由于未删除为使用表复制算法 的操作创建的文件实例,性能模式可能会泄漏内存。(漏洞 #26152751,漏洞 #86482)

  • mysqlpump没有正确解析 它执行以确定表结构TABLESPACE的语句的结果中的子句 SHOW CREATE TABLE(漏洞#26116415)

  • 某些语句可能会导致摘要代码中的缓冲区溢出。感谢 Laurynas Biveinis 和 Roel van de Paar 提供补丁。(漏洞 #26021187)

  • 以前,当 Performance Schema 初始化失败时,它会向错误日志写入一个非特定的初始化失败警告。现在它会打印有关内存分配失败的更具体的消息。(漏洞#25996291)

  • 当优化器选择松散索引扫描时,即使唯一索引没有索引扩展,具有唯一索引的表也可能出现不正确的结果。(错误#25989915、错误#86165、错误#26532061、错误#87207)

    参考资料:此问题是 Bug #21749123、Bug #78244 的回归。

  • 重新启动 LDAP 服务器可能会导致使用连接池的 LDAP 身份验证插件无法正确进行身份验证。(缺陷号 25989788)

  • CREATE USER IF NOT EXISTS如果用户存在,则不会写入二进制日志。如果用户在从服务器上不存在,这可能会导致不一致的复制行为。发生了类似的问题ALTER USER IF EXISTS。为了避免不一致,这些语句现在被写入二进制日志。(漏洞 #25813089,漏洞 #85733)

  • 对内部内存缓冲区的不正确处理可能会导致服务器退出。(漏洞#25737271)

  • MySQL 未使用 GCC 7 进行编译。(Bug #25643811,Bug #26825211)

  • 执行包含从某些语句的内容创建表的语句的存储过程 SELECT可能会导致内存泄漏。(缺陷号 25586773)

  • UPDATE需要一个主键大于 1024 字节的临时表并且该表是使用创建InnoDB的时,服务器可以退出。(缺陷号 25153670)

  • 对于几何计算,无效的输入参数可能会导致结果缓冲区不正确,并导致引发断言或服务器退出。(缺陷号 25062396)

  • 在某些情况下,该audit_log插件可能会递归地锁定互斥量,从而导致服务器无响应。(漏洞 #24437533)

  • 在某些情况下,即使存在带析取的谓词, 优化器也会为查询选择松散索引扫描 ( QUICK_GROUP_MIN_MAX_SELECT) 。 当子句中的条件导致多个不相交的范围树GROUP BY时,通过不执行范围扫描来解决此问题。WHERE(漏洞#24423143)

  • 设置MYSQL_GROUP_SUFFIX环境变量没有效果。(漏洞 #23072792)

  • 如果使用连接缓冲(例如,使用块嵌套循环算法),具有许多左连接的查询会很慢。(缺陷 #18898433,缺陷 #72854)

  • ORDER BY 包含引用参数 的列表的准备好的语句并不总是被正确处理。(错误#87863,错误#26867652)

  • 服务器处理触发器和生成的列不正确。(漏洞 #86637,漏洞 #26251621)