Documentation Home
MySQL 5.7 发行说明  /  MySQL 5.7.22 的变化(2018-04-19,全面上市)

MySQL 5.7.22 的变化(2018-04-19,全面上市)

编译笔记

  • Sun RPC 正在从glibc. 如果不包含 Sun RPC , CMake现在会检测并使用 。(您可能会发现有必要安装 rpcgen以利用此CMake功能。)(Bug #27368272,Bug #89168)libtirpcglibclibtirpc

弃用和移除说明

  • 这些兼容 SQL 模式现已弃用 , 并将在 MySQL 8.0 中 删除: DB2、、、、、、、、、、、、 。 这些弃用有两个含义: MAXDBMSSQLMYSQL323MYSQL40ORACLEPOSTGRESQLNO_FIELD_OPTIONSNO_KEY_OPTIONSNO_TABLE_OPTIONS

    当从 MySQL 5.7 master 复制到 MySQL 8.0 slave 时,使用这些已弃用 SQL 模式的语句可能会失败,或者可能对 master 和 slave 产生不同的影响。为避免此类问题,使用 MySQL 5.7 中弃用模式的应用程序应修改为不使用它们。

测试套件说明

  • 减少 GIS 处理浮点结果的编译器和平台差异可以简化相关测试用例,不再需要舍入以避免虚假测试失败。感谢 Daniel Black 提供的补丁。(错误#26540102、错误#87223、错误#27462294)

X 插件说明

  • 当连接选项中指定的默认数据库无效时,使用 X 协议的 X 插件连接尝试不会返回错误,并且允许使用空默认数据库进行连接。使用经典 MySQL 协议的连接尝试确实返回错误并不允许连接。如果指定了无效的模式,X 协议连接尝试现在也不允许连接。(缺陷号 26965020)

添加或更改的功能

  • 复制: 版本 8 中引入的更改使 XCom 能够使用化身的概念识别成员,这些更改已合并到版本 5.7 中。这些潜在的变化会在成员每次加入群组时为其添加一个 UUID,并且此信息可用于区分不同的成员化身。

  • 复制: 现在可以指定写入二进制日志的信息是否使复制从站能够根据提交时间戳或事务写入集进行并行化。

    使用写集比使用提交时间戳具有更高的并行性,因为它不依赖于提交历史。当以这种方式在复制从站上应用二进制日志时,它可能能够利用底层计算硬件(例如 CPU 内核)的功能,从而加快此过程。

    用于选择并行化源的接口被实现为一个新的服务器系统变量 binlog_transaction_dependency_tracking ,它可以采用 、 或 中的任何 COMMIT_ORDER一个WRITESETWRITESET_SESSIONCOMMIT_ORDER(默认)导致使用提交时间戳记录并行化信息;WRITESET导致使用写集记录此信息,这样任何不更新同一行的事务都可以并行化;并 WRITESET_SESSION以与 相同的方式运行 WRITESET,除了无法重新排序来自同一会话的更新。保存在内存中用于跟踪事务依赖性的行哈希历史的大小可以使用 binlog_transaction_dependency_history_size,也在此版本中引入。

  • JSON: 函数JSON_MERGE()重命名为JSON_MERGE_PRESERVE().

    此版本还添加了 JSON_MERGE_PATCH()功能,符合 RFC 7396 的版本 JSON_MERGE_PRESERVE();它的行为与 的行为相同,JSON_MERGE_PRESERVE()但有以下两个例外:

    • JSON_MERGE_PATCH()删除第一个对象中具有第二个对象中的匹配键的任何成员,前提是与第二个对象中的键关联的值不是 JSON null

    • 如果第二个对象的成员的键与第一个对象中的成员匹配,则将第一个对象中 的值 JSON_MERGE_PATCH() 替换为第二个对象中的值,同时将第二个值JSON_MERGE_PRESERVE() 附加到第一个值。

    此示例将合并相同的 3 个 JSON 对象(每个对象都有一个匹配的键"a")的结果与以下每个函数进行比较:

    mysql> SET @x = '{ "a": 1, "b": 2 }',
         >     @y = '{ "a": 3, "c": 4 }',
         >     @z = '{ "a": 5, "d": 6 }';
    
    mysql> SELECT  JSON_MERGE_PATCH(@x, @y, @z)    AS Patch,
        ->         JSON_MERGE_PRESERVE(@x, @y, @z) AS Preserve\G
    *************************** 1. row ***************************
       Patch: {"a": 5, "b": 2, "c": 4, "d": 6}
    Preserve: {"a": [1, 3, 5], "b": 2, "c": 4, "d": 6}

    JSON_MERGE()仍然支持作为 的别名JSON_MERGE_PRESERVE(),但现在已弃用,并可能在未来的 MySQL 版本中删除。

    有关详细信息,请参阅修改 JSON 值的函数。(缺陷 #81283,缺陷 #23255346)

  • JSON: 添加了 JSON 实用函数 JSON_PRETTY(),它以人类易于阅读的格式打印现有JSON值或任何可以成功解析为 JSON 文档的字符串。每个 JSON 对象成员或数组值都显示在输出的单独一行上;每个子对象或数组相对于其父对象有 2 个空格。

    例子:

    mysql> SELECT JSON_PRETTY('123');
    +--------------------+
    | JSON_PRETTY('123') |
    +--------------------+
    | 123                |
    +--------------------+
    
    mysql> SELECT JSON_PRETTY("[1,3,5]");
    +------------------------+
    | JSON_PRETTY("[1,3,5]") |
    +------------------------+
    | [
      1,
      3,
      5
    ]      |
    +------------------------+
    
    mysql> SELECT JSON_PRETTY('{"a":"10","b":"15","x":"25"}');
    +---------------------------------------------+
    | JSON_PRETTY('{"a":"10","b":"15","x":"25"}') |
    +---------------------------------------------+
    | {
      "a": "10",
      "b": "15",
      "x": "25"
    }   |
    +---------------------------------------------+
  • JSON:JSON_STORAGE_SIZE()在 MySQL 服务器中 添加了 JSON 实用函数 此函数返回用于存储 JSON 文档的二进制表示的字节数,无论文档是作为表中的列值、用户变量的值还是 JSON 文字呈现。

    与许多其他作用于 JSON 值的 MySQL 函数一样,此函数也接受可以成功解析为 JSON 文档的字符串。有关更多信息和示例,请参阅 JSON 实用程序函数

  • SHOW CREATE TABLEROW_FORMAT如果行格式是默认格式,通常不显示表格选项。这可能会在可传输表空间的表导入和导出操作期间导致问题。MySQL 现在支持一个 show_create_table_verbosity 系统变量,当启用时, 无论它是否是默认格式都会导致SHOW CREATE TABLE显示 。ROW_FORMAT(漏洞#27516741)

  • 如果服务器 PID 文件配置为在全球可写位置创建,服务器现在会发出警告,建议使用更安全的位置。(漏洞 #26585560)

  • 添加了两个 JSON 聚合函数 JSON_ARRAYAGG()JSON_OBJECTAGG(). 该 JSON_ARRAYAGG()函数将列或列表达式作为参数,并将结果集聚合为单个JSON 数组,如下所示:

    mysql> SELECT col FROM t1;
    +--------------------------------------+
    | col                                  |
    +--------------------------------------+
    | {"key1": "value1", "key2": "value2"} |
    | {"keyA": "valueA", "keyB": "valueB"} |
    +--------------------------------------+
    2 rows in set (0.00 sec)
    
    mysql> SELECT JSON_ARRAYAGG(col) FROM t1;
    +------------------------------------------------------------------------------+
    | JSON_ARRAYAGG(col)                                                           |
    +------------------------------------------------------------------------------+
    | [{"key1": "value1", "key2": "value2"}, {"keyA": "valueA", "keyB": "valueB"}] |
    +------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    数组元素的顺序是未指定的。

    JSON_OBJECTAGG()接受两列或表达式,分别将其解释为键和值;它将结果作为单个 JSON对象返回,如下所示:

    mysql> SELECT id, col FROM t1;
    +------+--------------------------------------+
    | id   | col                                  |
    +------+--------------------------------------+
    |    1 | {"key1": "value1", "key2": "value2"} |
    |    2 | {"keyA": "valueA", "keyB": "valueB"} |
    +------+--------------------------------------+
    2 rows in set (0.00 sec)
    
    mysql> SELECT JSON_OBJECTAGG(id, col) FROM t1;
    +----------------------------------------------------------------------------------------+
    | JSON_OBJECTAGG(id, col)                                                                |
    +----------------------------------------------------------------------------------------+
    | {"1": {"key1": "value1", "key2": "value2"}, "2": {"keyA": "valueA", "keyB": "valueB"}} |
    +----------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    一个NULL键导致错误;忽略重复键。

    有关详细信息,请参阅 聚合函数。(错误#78117,错误#21647417)

修正错误

  • InnoDB: 页面压缩函数中不正确的压缩长度值导致在第一次压缩页面时跳过打孔。(漏洞#27399897)

  • InnoDB: Attempting to create a temporary table in a file-per-table tablespace using CREATE TEMPORARY TABLE ... TABLESPACEsyntax failed 报错。临时表空间只允许在临时表空间中使用。(漏洞#27361662)

  • InnoDB: 后台线程之间的死锁,一个试图从缓存中逐出全文搜索表,另一个试图同步表,导致 InnoDB Cluster 节点失败。(漏洞 #27304661)

  • InnoDB: 在释放间隙锁时未能跳过谓词锁会引发调试断言,就像在释放 supremum 上的间隙锁之前未能删除 supremum 记录位一样。(错误#27272806,错误#27294066)

  • InnoDB:对临时表 的REPLACE操作引发了断言。(错误#27225649,错误#27229072)

  • InnoDB: 在主服务器上成功运行到 XA 准备阶段的并发 XA 事务在从服务器上重放时发生冲突,导致应用程序线程中的锁等待超时。冲突是由于 GAP 锁定范围不同,当事务在从站上连续重放时不同。为了防止这种类型的冲突, READ COMMITTED当 XA 事务到达准备阶段时,隔离级别的 XA 事务获取的 GAP 锁现在被释放(并且不再继承)。(错误#27189701,错误#25866046)

  • InnoDB:ALTER TABLE添加引用具有生成的虚拟列的表的外键约束 的(漏洞 #27189701)

  • InnoDB:对表 的在线ALTER TABLE操作伴随着对同一个表的并发 DML 引发了断言。在访问 DML 日志以确定虚拟列的长度之前,未执行日志结束检查。(缺陷号 27158030)

  • InnoDB: 当添加虚拟索引失败时,释放的虚拟索引没有从虚拟列索引列表中删除。(漏洞#27141613)

  • InnoDB: 在同一语句中添加虚拟列和索引导致错误。(漏洞#27122803)

  • InnoDB: 服务器上的表空间导入操作,默认行格式REDUNDANT引发断言失败。(缺陷号 26960215)

  • InnoDB: 基于生成列的存储字段允许基列具有 NULL 值。(漏洞#26958695)

  • InnoDB: 解析函数中子查询的评估引发了断言。(漏洞#26909960)

  • InnoDB: An incorrectly specified innodb_data_file_pathor innodb_temp_data_file_path value 返回语法错误,未指定导致初始化失败的系统变量的名称。(漏洞 #26805833)

  • InnoDB: 当要应用的最后一条插入日志记录被拆分成两页时,重建表的在线 DDL 操作引发断言。(错误#26696448,错误#87532)

  • InnoDB:重命名模式 的RENAME TABLE操作未能重命名先前删除全文搜索索引时留下的全文搜索公共辅助表,导致在尝试删除旧模式时断言失败。(漏洞#26334149)

  • InnoDB: 当一个线程试图读取包含 BLOB 数据的记录而另一个线程正在将相同数据写入外部页面时,会引发断言。(漏洞 #26300119)

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

  • InnoDB: InnoDB在使用列偏移量搜索自动增量列的索引时无法说明虚拟列。(缺陷号 25076416)

  • InnoDB: 无效的调试条件导致缓冲池块分配失败,当清除线程试图访问未分配的块时导致断言失败。(缺陷号 23593654)

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

  • 复制: 组复制冲突检测使用架构和表名称作为主键等效项 (PKE) 的一部分,以检测和禁止冲突事务。系统变量的值 lower_case_table_names改变了模式和表名称的存储和外部化方式,这取决于配置的值可以将名为 T1 的表持久保存为 t1。组中的这种差异可能会导致不一致。现在,成员必须都具有相同的 值 lower_case_table_names。(漏洞 #27401817)

  • 复制: 在线次要成员上错误地更改组复制所需的设置可能会导致意外停止。(错误#27317478,错误#27157202)

  • 复制: 当一个成员加入一个组时,加入请求有可能被拒绝。如果拒绝导致重试,例如因为正在联系的种子成员不在组中,则重试循环有可能无限继续下去。(漏洞 #27294009)

  • 复制: 当复制从属使用写集进行并行化时,现在在生成写集信息时会考虑数据库的大小写和重音敏感性。transaction_write_set_extraction 启用系统变量时会生成写入设置信息 以前,重复的键可能会被错误地识别为不同的,导致事务具有不正确的依赖关系,因此可能以错误的顺序执行。(漏洞 #26985561,漏洞 #88120)

  • 复制: 语句 CREATE USER IF EXISTS(orIF NOT EXISTS) 和 ALTER USER IF EXISTS(orIF NOT EXISTS) 被写入二进制日志,即使查询导致错误。MySQL 服务器现在会检查导致这些查询失败的错误(例如,指定了无效的插件),并且不会记录那种情况下的语句。请注意,如果这些语句成功但由于不满足条件而对主服务器没有影响,则这些语句将写入二进制日志,因为条件可能在复制从属服务器上得到满足(参见错误#25813089,错误#85733)。(缺陷号 26680035)

    参考资料:另请参阅:Bug #25813089、Bug #85733。

  • 复制: 对于包含 BLOB 数据类型的虚拟生成列的更新,某些存储引擎需要旧 BLOB 值和新 BLOB 值进行复制。此修复将相同的行为扩展到 JSON 和 GEOMETRY 数据类型,它们基于 BLOB 数据类型,因此在未存储旧值时会产生相同的问题。(缺陷号 25873029)

  • 复制: 在多线程复制从站( slave_parallel_workers大于 0)上,从站滞后于主站未被Seconds_Behind_Master字段SHOW SLAVE STATUS。现在可以正确报告该值。感谢 Robert Golebiowski 提供的补丁。(漏洞 #25407335,漏洞 #84415)

  • 复制: 当使用选项 --read-from-remote-server--hexdump mysqlbinlog无法在生成自动增量值、引用用户定义变量或调用的 SQL 语句之后生成二进制日志内容的十六进制转储RAND()。这些事件的事件类型后跟一个信息行查询日志事件,以及mysqlbinlog缓存原始事件,以便在收到后续行查询日志事件时打印。当接收到后续事件时,指向包含原始事件的内存的指针无效,因此无法访问原始数据以生成十六进制转储。该问题现已解决。(漏洞#24674276)

  • 复制: 对二进制日志解码过程进行了许多更改,以改进对无效或损坏的二进制日志条目的处理。(漏洞 #24365972)

  • 复制: 在为 XA 事务引入二进制日志记录 WL#6860之后,如果在从属服务器上设置了从具有该功能的主服务器复制到不具有该功能的从服务器,则可以在调试构建中引发断言MASTER_AUTO_POSITION=1。断言已被删除,因此调试版本现在具有与非调试版本相同的行为,并且可以尝试复制不受支持的事件类型,无论是否 MASTER_AUTO_POSITION=1设置。(缺陷号 20677683)

  • 复制: 使用 时 group_replication_ip_whitelist,可以配置一个组,使其在所有成员无法相互建立内部组通信连接的情况下正常运行,从而导致行为不一致。现在,如果 IP 在白名单中或者 IP 属于 XCom 配置的当前成员,则传入连接将被接受。这可确保成员始终能够创建群组通信所需的内部网络。(错误#87834、错误#26846549、错误#27406775)

  • JSON: 执行JSON 引发错误的函数的查询可能会导致服务器退出。(漏洞 #22253965)

  • 在 Fedora 27 上从 MariaDB 升级到 MySQL Community Edition 失败。(缺陷 #27484835)

  • 从 Performance Schema status_by_threadvariables_by_thread表中选择不是线程安全的,可能会产生不正确的结果。(漏洞 #27471510)

  • INSERT ... ON DUPLICATE KEY UPDATE如果源表没有生成任何行,则可能无法正确处理。(缺陷号 27460607)

  • authentication_ldap_sasl_group_search_filter 由or 系统变量 指定的 LDAP 组搜索过滤器 authentication_ldap_simple_group_search_filter 现在在插入用户名或完整用户 DN 方面更加灵活。过滤器值现在使用 {UA}{UD}表示法来表示用户名和完整的用户 DN。例如, {UA}替换为用户名,例如 "admin",而{UD}替换为使用完整的 DN,例如 "uid=admin,ou=People,dc=example,dc=com". 以下值为默认值,它同时支持 OpenLDAP 和 Active Directory:

    (|(&(objectClass=posixGroup)(memberUid={UA}))
      (&(objectClass=group)(member={UD})))

    以前,如果组搜索属性是 isMemberOfmemberOf,它会被视为具有组信息的用户属性。但是,在某些情况下,对于用户场景, memberOf是一个不包含组信息的简单用户属性。为了获得额外的灵活性,可选{GA}前缀现在可以与组搜索属性一起使用。(以前,假设如果组搜索属性是isMemberOf,它将被区别对待。现在任何带有 {GA} 前缀的组属性都被视为具有组名称的用户属性。)例如,值为{GA}MemberOf,如果组值为 DN,则组 DN 中的第一个属性值作为组名返回。(错误#27438458,错误#27480946)

  • 来自查询结果集的元数据UNION ALL 可以说NEWDATE而不是 DATE. (漏洞#27422376)

  • Linux RPM 和 Debian 软件包现在包含运行 MySQL 测试套件所需的 Perl JSON 模块的依赖信息。Linux RPM 包现在包含运行 MySQL 测试套件所需的 Perl Digest 模块的依赖信息。(错误#27392800、错误#89250、错误#27392808、错误#89244)

  • 在密钥迁移模式下运行时,服务器会忽略无效选项。(漏洞#27387331)

  • 在配置期间,CMake假定 rpcgen可用而不是检查它。(缺陷号 27368078)

  • 客户端身份验证进程可以在内存被释放后使用它。(漏洞#27366143)

  • -DWITH_ZLIB=system可能导致其他CMake功能测试失败。(漏洞 #27356658,漏洞 #89135)

  • 如果必须下载 Boost,使用 RPM 源包构建现在使用安全连接。(漏洞 #27343289,漏洞 #89104)

  • audit_log即使禁用二进制日志记录, 该插件也可以将语句写入二进制日志。(漏洞 #27315321)

  • 对于使用身份验证插件进行身份验证的帐户, auth_sock服务器无法接受来自旧版 MySQL 客户端的连接。(漏洞#27306178)

  • 使用身份验证插件进行身份验证的帐户 auth_sock无法使用旧客户端进行连接。(漏洞#27306178)

  • audit_log插件内存泄漏已得到纠正 。(漏洞 #27302151)

  • audit_log插件可加载函数未报告失败错误。(缺陷号 27300689)

  • LDAP 身份验证插件不是基于 FreeBSD 构建的。(漏洞#27238252)

  • RPM 和 Debian 软件包被列为openldap-devel LDAP 身份验证插件的依赖项,但仅适用于企业发行版。他们现在也列出了对社区发行版的依赖。(错误#27232163,错误#88789)

  • 向持有多个锁的表添加唯一索引InnoDB可能会引发断言。(漏洞#27216817)

  • 对于某些语句,FILE 未正确检查权限。(缺陷号 27160888)

  • 对包含 FULLTEXT键和 FTS_DOC_ID列的表执行多次插入语句导致服务器错误。(漏洞 #27041445,漏洞 #88267)

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

  • audit_log插件可能会错误处理事件执行的中止,从而导致服务器退出。(漏洞 #27008133)

  • 从多个会话中多次安装和卸载插件可能会导致服务器无响应。(漏洞#26946491)

  • ALTER TABLE操作试图在废弃的表空间中设置表的 值AUTO_INCREMENT。(漏洞 #26935001)

  • MyISAM对于涉及按排序修复算法和许多(超过 4.5 亿)行的批量插入和表修复操作,可能会发生索引损坏。(错误#26929724、错误#88003、错误#28483283)

  • 从系统表中删除索引可能会导致服务器退出。(漏洞#26881798)

  • 准备好的语句 在引用具有相同名称的视图CREATE TABLE ... SELECT时导致意外行为。GROUP BY(漏洞#26881703)

  • 服务器可以在加载权限时取消引用空指针。(漏洞 #26881508)

  • LDAP 身份验证插件生成的一些诊断消息在没有发生错误时误导性地提示错误。(缺陷号 26844713)

  • 服务器退出可能是由于多个线程同时尝试注册和注销元数据性能模式对象,或者获取和释放元数据锁。(漏洞 #26502135)

  • 如果 LDAP 身份验证插件的关联系统变量设置为无效值,它们可能会失败。(漏洞#26474964)

  • 线程池插件为失败的连接记录了太多信息。(错误#26368725,错误#86863)

  • 对于调试版本,使用KILL终止存储的例程可能会引发断言。感谢 Laurynas Biveinis 提供补丁。(漏洞 #26040870,漏洞 #86260)

  • 如果init_connect设置了系统变量,则密码过期的客户端无法执行其内容,因此无法连接。现在,如果客户端的密码已过期, init_connect将跳过执行,这使客户端能够连接并更改密码。(漏洞#25968185)

  • 与 LDAP 身份验证插件相关的一些内存泄漏已修复。(缺陷号 25964438)

  • YYYYMMDD在满足以下所有三个条件的查询中,无法正确识别 使用该格式的日期:

    查询执行左连接。

    连接内表中的DATE列是多列主键的一部分。

    内表主键中的每一列都与另一个值进行比较;这可以是文字值或列值。(缺陷号 25949639)

  • 使用 C API,当尝试 INSERT使用 set 执行准备好的语句时 CURSOR_TYPE_READ_ONLY,客户端挂起。(缺陷 #25701141,缺陷 #85105)

  • 较大--ssl-cipher的值可能会导致客户端程序退出。(漏洞#25483593)

  • 如果收到格式错误的客户端/服务器协议数据包,MySQL 客户端程序可能会意外退出。(漏洞 #25471090)

  • 插件对内部哈希的不正确处理CONNECTION_CONTROL 导致错误日志中出现虚假消息并最终导致服务器退出。(漏洞 #25052009)

  • JSON如果文档很大并且包含许多带符号的整数,则将文档 转换为字符串可能会很慢。(缺陷号 24586888)

  • 对于调试版本,对访问值的子查询的结果缺少错误检查JSON 可能会引发断言。(漏洞 #22522073)

  • DO将错误信号转化为警告。(漏洞 #17043030,漏洞 #69647)

  • audit_log插件没有记录准备好的语句的占位符值。(漏洞 #16617026)

  • 当从内存临时表创建磁盘临时表时,新磁盘表的索引仍未初始化。(缺陷 #88601,缺陷 #27214153)

  • 当存储过程包含引用一个视图的语句,而该视图又引用另一个视图时,该过程不能被成功调用超过一次。(错误#87858,错误#26864199)

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

  • 对于声明为 的列 ,在严格模式下CREATE TABLE ... SELECT带有 a UNION的 语句SELECT失败。(缺陷 #87711,缺陷 #27068222)DATENOT NULL

  • 使用嵌套子选择的准备好的语句并不总是被正确处理。(漏洞 #87484,漏洞 #26657904)

  • JSON_MERGE()对函数 返回值的 操作JSON_SET()有时会产生无效结果。(缺陷 #80787,缺陷 #22961128)