Documentation Home
MySQL 5.7 发行说明  /  MySQL 5.7.0 中的变化(未发布,里程碑 10)

MySQL 5.7.0 中的变化(未发布,里程碑 10)

笔记

这是一个里程碑版本,使用风险自负。不支持里程碑版本之间的升级(或从里程碑版本升级到 GA 版本)。重大的开发变更发生在里程碑版本中,您可能会遇到兼容性问题,例如除了运行mysql_upgrade的常规过程之外还需要注意的数据格式更改。例如,您可能会发现有必要在升级前使用mysqldump转储数据并 在升级后重新加载。(无论如何,在升级之前进行备份是一种谨慎的预防措施。)

弃用和移除说明

  • Microsoft Windows: Windows Vista、Windows Server 2008 和更新版本支持使用mklink命令进行本机符号链接。这使得 MySQL 服务器使用.sym文件冗余实现数据库符号链接,因此该机制现在已被删除。此更改具有以下含义:

诊断说明

  • MySQL 现在支持堆叠诊断区域。当向诊断区域堆栈推送时,第一个(当前)诊断区域成为第二个(堆栈)诊断区域,并创建一个新的当前诊断区域作为它的副本。在条件处理程序中,执行的语句修改新的当前诊断区域,但是 GET STACKED DIAGNOSTICS可用于检查堆叠诊断区域以获取有关导致处理程序激活的条件的信息,独立于处理程序本身的当前条件。(以前,只有一个诊断区域。要检查处理程序中的处理程序激活条件,有必要在执行任何可能更改它的语句之前检查该诊断区域。)请参阅GET DIAGNOSTICS 语句MySQL 诊断区域

添加或更改的功能

  • 重要变更;复制: 如果从属 SQL 线程正在应用大型更新,则SHOW SLAVE STATUS与并发运行时STOP SLAVE为解决此问题, NONBLOCKING中添加了一个新选项 SHOW SLAVE STATUS。使用此选项时,SHOW SLAVE STATUS不等待 SQL 或 I/O 线程,而是立即返回。这意味着使用该选项时,这些线程的报告状态可能不是完全最新的。 NONBLOCKING主要供监控工具使用,在这些工具中,获得即时响应比拥有最及时的数据更重要。(错误#15993588,错误#67879)

  • 重要变更;复制:为mysqlbinlog 添加了--idempotent 选项,这会导致 MySQL 服务器采用幂等模式。这会导致在处理二进制日志更新时抑制所有重复键和键未找到错误。该模式仅对当前mysqlbinlog客户端和客户端会话有效。

  • 重要更改: INSERT DELAYED 不再支持。服务器识别但忽略 DELAYED关键字,将插入处理为非延迟插入,并生成 ER_WARN_LEGACY_SYNTAX_CONVERTED 警告。(不再支持 INSERT DELAYED。该语句已转换为 INSERT。)。同样, REPLACE DELAYED作为非延迟替换处理。该 DELAYED关键字将在以后的版本中删除。

    此外,DELAYED删除了几个 - 相关的选项或功能:

    • mysqldump--delayed-insert选项 。

    • Performance Schema 表 的COUNT_WRITE_DELAYED, SUM_TIMER_WRITE_DELAYED, MIN_TIMER_WRITE_DELAYED, AVG_TIMER_WRITE_DELAYEDMAX_TIMER_WRITE_DELAYED列 。table_lock_waits_summary_by_table

      如果从早期版本升级到此 MySQL 版本,则必须运行mysql_upgrade(并重新启动服务器)以将这些更改合并到 performance_schema数据库中。

    • mysqlbinlog不再写入提及INSERT DELAYED.

  • 以前mysql中control+C有 则中断当前语句,无则退出mysql。现在 Control+C中断当前语句(如果有的话),否则取消任何部分输入行,但不会退出。(错误#66583,错误#14554568)

  • 如果创建的索引与现有索引重复,或者在严格 SQL 模式下出错,服务器现在会发出警告。(缺陷 #37520,缺陷 #11748842)

  • 明文客户端身份验证插件适用于要求服务器接收在客户端输入的密码的mysql_clear_password身份验证方案,无需散列。因为密码是明文发送的,所以这个插件应该在加密连接的上下文中使用,比如 SSL 连接,以避免通过网络暴露密码。为了减少无意中使用此插件的可能性,现在要求客户端明确启用它。这可以通过几种方式完成:

    • 将环境变量设置为以、或 LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN 开头的值 。这将为所有客户端连接启用插件。 1Yy

    • mysqlmysqladminmysqlslap客户端程序支持 --enable-cleartext-plugin在每次调用的基础上启用插件的选项 。

    • mysql_options()C API 函数支持 MYSQL_ENABLE_CLEARTEXT_PLUGIN在每个连接的基础上启用插件的选项 。此外,任何使用和读取选项文件的程序都可以通过在客户端库读取的选项组中 libmysqlclient包含一个选项来启用该插件 。enable-cleartext-plugin

修正错误

  • 重要变更;复制: 涉及性能模式表的语句不应写入二进制日志,因为这些表的内容仅适用于给定的 MySQL 服务器实例,并且在复制拓扑中的不同服务器之间可能会有很大差异。数据库管理员应该能够在不影响其他服务器的情况下在单个服务器上INSERT, UPDATE, 或 DELETE) 或刷新 (TRUNCATE TABLE但是,在启用 GTID 的情况下使用复制时(请参阅 使用全局事务标识符进行复制),有关更新性能模式表的不安全语句的警告被提升为错误,从而阻止了 performance_schema和 GTID 一起使用。

    启用 GTID 时,复制和系统日志记录表也遇到了类似的问题。

    此修复引入了 非复制表或 本地表的概念。现在,当 MySQL 复制遇到一个标记为本地的表时,对该表的更新将被忽略。

    此修复将以下表定义为本地表,不再复制:

    • performance_schema 数据库 中的所有表

    • mysql.general_log

    • mysql.slow_log

    • mysql.slave_relay_log_info

    • mysql.slave_master_info

    • mysql.slave_worker_info

    在此修复之前,使用 performance_schema刚刚列出的表和其他表的语句被标记为复制不安全,这会在执行期间引起警告;不管日志记录格式如何,这些语句仍然被写入二进制日志。

    INFORMATION_SCHEMA此修复不会更改数据库 中表的现有复制行为 。

    有关详细信息,请参阅MySQL 性能架构。另请参阅MySQL 服务器日志复制元数据存储库。有关一般和慢速查询日志表的信息,请参阅 选择一般查询日志和慢速查询日志输出目标。(漏洞 #14741537)

  • 重要更改: 以前,ExtractValue()UpdateXML()函数支持作为参数提供给它们的 XPath 表达式的最大长度为 127 个字符。此限制现在已被删除。(缺陷 #13007062,缺陷 #62429)

  • InnoDB: 重复创建和更改表会导致内存泄漏,这是由于重复键错误造成的。发生重复键错误是因为 row_merge_build_indexes函数调用 row_fts_psort_info_destroy不够频繁。由于全文搜索索引是使用唯一索引创建的,因此唯一索引因重复键错误而失败,并且不会释放全文搜索构建资源。(漏洞 #14759111)

  • InnoDB:在线 DDL 操作期间,如果在重建表时插入并随后更新记录,则可能会错误地发出重复键错误。(漏洞 #14723456)

  • InnoDB: Performance Schema 中的 InnoDB IO 线程使用以下名称公开: io_handler_thread。此修复实现了特定的键,例如 io_read_handler_thread, io_write_handler_threadio_ibuf_handler_thread以区分 Performance Schema 中的 InnoDB IO 线程。(漏洞 #14670810)

  • InnoDB:如果服务器在为ALTER TABLE重建聚集索引的操作 期间的某个精确时刻崩溃 InnoDB,则之后可能无法访问原始表。此类操作的一个示例是ALTER TABLE ... ADD PRIMARY KEY如果服务器在此操作期间停止,修复将保留原始表。您可能仍然需要 .ibd手动重命名文件以恢复原始表内容:在 MySQL 5.6 及更高版本中, 在数据库目录 到 在 MySQL 5.6 之前,要重命名的临时文件是 or 。(漏洞#14669848)#sql-ib$new_table_id.ibdtable_name.ibdtable_name#1#2

  • InnoDB: 将不同记录长度的数据插入到 使用压缩InnoDB的表中 可能会导致服务器因错误而停止。(错误#14554000、错误#13523839、错误#63815、错误#12845774、错误#61456、错误#12595091、错误#61208)

  • InnoDB: 此修复解决了将大型 BLOB 插入具有 4KB 物理页面大小的表空间或某些压缩表时会发生的断言情况。不会很快为具有较小物理页面大小的表空间分配范围。(漏洞 #14520559)

  • InnoDB: 如果表的索引键长度非常接近长度上限 3072,则对该表的查询可能会导致严重错误。(错误#14500557,错误#14537695)

  • InnoDB: 在调试版本中,InnoDB PAGE_FREE列表中的不匹配会导致断言。(漏洞 #12701488)

  • InnoDB: 在 Linux 系统上,某些读取或写入少于请求字节数的 I/O 请求可能会导致服务器崩溃。对于异步 I/O 请求,此问题可能会更频繁地发生 这些消息没有明确指出发生了什么类型的错误:

    InnoDB: Operating system error number 0 in a file operation.
    InnoDB: Error number 0 means 'Success'.

    有了这个修复,MySQL 在放弃之前会重试操作几次。(重试次数由 NUM_RETRIES_ON_PARTIAL_IO源代码中的常量定义,默认值为 10。)(Bug #11761646,Bug #54160)

  • 分区: 当服务器启动时 --skip-partition,它应该拒绝分区表上的 DDL 或 DML 语句。但是,对于 DROP TABLE,服务器删除了.frm文件,对于 RENAME TABLE,服务器重命名了.frm文件。(漏洞 #11763795)

  • 复制: mysqlbinlog没有正确解码 DECIMAL基于行的二进制日志中的值。这可能会导致为DECIMAL列打印出无效值。(漏洞 #14309019)

    参考资料:另请参阅:错误 #17544169。

  • 复制: mysqlbinlog 以详细模式打印,带有来自二进制日志文件的数据列类型的注释。当 mysqlbinlog 遇到一个列数据值为 时 ,该列的数据类型没有更新;结果,打印了前一列的数据类型,或者在这是表的第一列的情况下,类型显示为. 现在在这种情况下,数据类型显示正确。(漏洞 #14171756)-v -v -v -vNULL<an integer>

  • 复制: 当使用mysqlbinlog--verbose选择读取由使用基于行或混合格式的日志记录的 MySQL 服务器写入的二进制日志时,当注释出现在BINLOG 语句中时,可能会产生无效的 SQL。发生这种情况的一种方式是在 INSERT ... SELECT语句中使用更新数据的函数。(漏洞 #12889121)

  • 复制: 当从服务器运行 等于 或时,主服务器上的mysql_upgrade中断了复制。(漏洞 #11763447)--log-outputFILENONE

  • 复制: 发出STOP SLAVE导致从服务器读取数据包的虚假消息写入错误日志期间丢失与 MySQL 服务器的连接。(错误#11761457、错误#12977988、错误#53955)

  • Replication: 当从 SQL 线程发生错误时,这会导致 Slave_SQL_ErrorSlave_SQL_Errnocolumns SHOW SLAVE STATUS显示错误原因。错误号应该是 中定义 的常用常量ER_*sql/share/errmsg.txt之一,错误消息应该是相应的字符串。但是,在某些情况下, Slave_SQL_Errno它被设置为数字以外的其他ER_*,并且 Slave_SQL_Error设置为硬编码错误消息而不是来自 sql/share/errmsg.txt. 现在,如预期显示的所有错误都SHOW SLAVE STATUS源自 sql/share/errmsg.txt(缺陷 #11760365,缺陷 #52768)

  • Microsoft Windows: 在 Microsoft Windows 上,将在 Microsoft Windows 上找不到的 POSIX API 的CMake条目添加到 CMake 缓存中。这减少了编译 MySQL 时预期的“未找到”错误的数量。(漏洞 #14790333)

  • Microsoft Windows: 在 Microsoft Windows 上,引用具有无效字符的表的查询将在系统中搜索无效文件名。生成的系统错误代码 (ERROR_INVALID_NAME) 无法被 MySQL 识别,因此这个未知错误将作为“ERRNO: 22 - INVALID ARGUMENT”报告给服务器日志。MySQL 现在识别这些错误并将它们报告为表不存在,并且它不再将它们记录到服务器错误日志中。(漏洞#14642248)

  • Microsoft Windows: 在 Windows 上,启动服务器 --log-error--console导致服务器写入日志文件而不是控制台。在 MySQL 5.5.3 之前,只有在--log-error 之后指定才会--console。现在,无论选项顺序如何都会--console覆盖 在所有情况下都产生控制台输出。(缺陷 #14207773,缺陷 #65592)--log-error--console

  • Microsoft Windows: 可以指定已在使用的命名管道。这不再被允许,因为现在发出错误并且进程被中止。在mysqld.exe命名管道模式下启动后,管道名称已被另一个实例使用,当从 TCP任何进程中的套接字接收到关闭命令时,两个实例都无法正确关闭。因此,mysqld.exe没有被终止。(缺陷 #13891058,缺陷 #61885)

  • Microsoft Windows: 在 Microsoft Windows 上,失败的 API 或函数调用 mysqld.exe有时会报告错误代码 22,而不是正确的错误代码。(漏洞 #11763004)

  • NDB 复制: 源自复制主服务器的事务被应用到从服务器上,就像使用 一样AO_AbortError,但从二进制日志重放的事务不是。现在,从日志中重放的事务处理方式与来自实时复制主服务器的处理方式相同。

    有关详细信息,请参阅NdbOperation::AbortOption。(漏洞 #14615095)

  • 连接恰好 32 个表并包含一个 HAVING子句返回空结果。(漏洞 #15972635)

  • 解析器拒绝了一些合法的 UNION陈述。(漏洞 #14730856)

  • 在服务器启动时设置thread_cache_size为负值会导致值为 16384 而不是 0。(缺陷 #14683107)

  • XA RECOVER 在 XID 数据中显示不可打印的字符。现在这些字符是十六进制编码的。(漏洞 #14670465)

  • 如果服务器以无效query_cache_size 值启动,则启动时不会发出警告。(漏洞 #14576423)

  • IS_USED_LOCK()使用错误的数据类型报告了 返回值 。(漏洞 #14575699)

  • 解析外部字段时, 为准备语句的每次执行Item_field::fix_outer_fields()创建新 Item_ref的 s,因此这些必须在运行时 memroot 中分配。解析之前的 memroot 切换 JOIN::having导致它们在语句根中分配,从而为每个准备好的语句执行泄漏内存。(漏洞 #14409015)

  • 激活存储的程序处理程序不会保留当前的诊断堆栈。(漏洞 #14342913)

  • 在调试版本中,终止HELP 语句会导致引发断言。(漏洞 #14221840)

  • BEFORE如果在对语句的表达式 求值期间发生错误 PURGE BINARY LOGS BEFORE,则该语句不会像它应该的那样中止,而是在稍后提出断言。(漏洞 #14215847)

  • 对于索引合并访问方法,优化器可能会选择次优的索引来使用。(漏洞 #14095506)

  • .frm如果为临时表 打开文件的尝试失败,则可能会引发断言 。(漏洞 #13359247)

  • 如果在服务器关闭期间更改了事件调度程序的状态,则服务器可能会崩溃。(漏洞 #13002460)

  • 在存储使用 UPPER()or LOWER()函数的视图的定义时,函数调用分别被UCASE()or 替换LCASE()(如 的输出所示SHOW CREATE VIEW)。尽管事实上 UPPER()LOWER()是标准的,UCASE()并且 LCASE()是这些的 MySQL 同义词。这使得在 MySQL 和其他数据库系统之间移动数据库变得更加困难。

    通过此修复,在存储定义时不再重写对视图UPPER()和 视图内的 调用;LOWER()相反, UCASE()现在 UPPER()在存储的视图定义中 重写为LCASE()as LOWER(),这增加了视图的可移植性。(漏洞 #12844279)

  • 对于在子查询中访问 INFORMATION_SCHEMA表的查询,尝试锁定已经锁定的互斥量可能会导致服务器崩溃。(漏洞 #11765744)

  • 可以创建使用 INTERVAL() 的视图,但无法从视图中进行选择,也无法使用 SHOW CREATE VIEW 显示。(漏洞 #11753832)

  • Range checked for each record 优化现在用于具有外部查询引用的条件 。(漏洞 #11750963)

  • 对于ALTER TABLE重命名或更改列的默认值的语句, BINARY更改是使用表副本完成的,而不是就地。(错误#67141、错误#14735373、错误#69580、错误#17024290)

  • 对于使用ref字符串数据类型访问的查询,ref 访问条件可以作为查询条件的一部分再次评估,或者作为索引条件下推到存储引擎。(缺陷 #66983,缺陷 #14682735)

  • 并发执行 、 或 中的任何一个DROP DATABASE都可能以错误的顺序写入二进制日志,从而导致复制失败。(缺陷 #65428,缺陷 #14127220)CREATE FUNCTIONCREATE PROCEDURECREATE EVENT

  • 对于在 上定义的视图UNION,服务器可能会创建无效的视图定义。(错误#65388、错误#14117018、错误#72018、错误#18405221)

  • 如果read_only启用,仍然允许创建TEMPORARY表。TEMPORARY但是在这种情况下,也可以创建同名的非表,这是不允许的。(缺陷 #64992,缺陷 #13969578)

  • 启用会话值 对语句low_priority_updates没有影响。INSERT(缺陷 #64892,缺陷 #13939940)

  • 在没有默认数据库的情况下引用不带数据库名称限定符的存储函数会导致 ER_SP_DOES_NOT_EXIST错误,而不是ER_NO_DB_ERROR. (错误#64692,错误#13864485)

  • 服务器在执行时拒绝客户端连接 FLUSH PRIVILEGES。(漏洞 #63178,漏洞 #13418619)

  • 如果 WHERE子句包含字符串文字并且 character_set_clientcharacter_set_connection被设置为不同的字符集,则创建的视图定义不正确。(缺陷 #63094,缺陷 #13520710)

  • SHOW CREATE VIEW如果更改了视图下的表,则失败。(缺陷 #61718,缺陷 #12762393)

  • 如果插入是从存储过程中生成的,则并发插入会被选择阻止。(错误#58689,错误#11765698)

  • 未插入行的INSERT INTO ... SELECT语句不必要地使使用目标表的查询缓存中的语句无效。(错误#50065,错误#11757947)

  • 使用ALTER TABLE将表重命名为.导致没有名称的表。(缺陷 #49636,缺陷 #11757569)

  • SHOW GLOBAL STATUS由于锁争用导致繁忙的服务器出现性能问题。(错误#42930,错误#11751904)

  • INSERT INTO ... SELECT ... ON DUPLICATE KEY UPDATELOAD DATA CONCURRENT REPLACE采用了太弱的锁,导致并发SELECT语句返回不一致结果的可能性。(缺陷 #38046,缺陷 #11749055)

  • 在这些情况下,事件不会从mysql.event 表中删除: 事件是在启用事件调度程序时创建的;调度程序被禁用并重新启用;已到事件到期时间。(缺陷 #34804,缺陷 #11748012)