Documentation Home
MySQL 5.6 发行说明  /  MySQL 5.6.20 的变化(2014-07-31,全面上市)

MySQL 5.6.20 的变化(2014-07-31,全面上市)

弃用和移除说明

  • 系统timed_mutexes变量没有效果,已弃用。(漏洞#18277305)

  • mysqlhotcopy实用程序现已弃用 ,并将在未来的 MySQL 版本中删除。这样做的原因包括:它只适用于MyISAMARCHIVE存储引擎;它适用于 Unix 但不适用于 Windows。备选方案包括mysqldump 和 MySQL Enterprise Backup。

数据跟踪支持

  • MySQL 现在包括对 Oracle Linux 6 或更高版本和 UEK 内核的 D​​Trace 支持。如果存在 DTrace,服务器构建将检测到它而无需特殊的CMake选项。有关在 MySQL 上使用 DTrace 的信息,请参阅 使用 DTrace 跟踪 mysqld

InnoDB 注释

  • 重要变化: 对大型外部存储 BLOB字段的重做日志写入可能会覆盖最近的检查点。5.6.20 补丁将重做日志 BLOB写入的大小限制为重做日志文件大小的 10%。5.7.5 补丁在不施加限制的情况下解决了该错误。对于 MySQL 5.5,该错误仍然是一个已知限制。

    由于BLOB MySQL 5.6 引入了重做日志写入限制,该 innodb_log_file_size设置应比 BLOB表行中的最大数据大小加上其他可变长度字段( 、 和类型字段)的长度VARCHARVARBINARY10 TEXT倍。如果您的 innodb_log_file_size设置已经足够大或您的表不包含任何 BLOB数据,则无需执行任何操作。

    笔记

    在 MySQL 5.6.22 中,重做日志 BLOB写入限制放宽到重做日志总大小 ( innodb_log_file_size* innodb_log_files_in_group) 的 10%。

    (错误#16963396、错误#19030353、错误#69477)

MySQL 企业笔记

  • MySQL 企业版中包含的审计日志插件现在可以根据用户帐户和事件状态过滤审计事件。几个新的系统变量为 DBA 提供了过滤控制。此外,通过添加多个状态变量,审核日志插件报告功能得到了改进。

    不兼容的配置更改: audit_log_policy可以在服务器启动时设置(和以前一样),但在运行时现在是只读变量。这是由于引入了两个新的系统变量 audit_log_connection_policyaudit_log_statement_policy,它们可以更好地控制日志记录策略,并且可以在启动时或运行时进行设置。如果您在启动时继续使用 audit_log_policy而不是其他两个变量,服务器将使用它的值来设置这些变量。

    有关详细信息,请参阅 配置审计日志记录特征审计日志插件状态变量

安全说明

  • MySQL 5.6 Commercial Server 的链接 OpenSSL 库已从版本 1.0.1g 更新到版本 1.0.1h。据报道,1.0.1g 之前(包括 1.0.1g)的 OpenSSL 版本容易受到 CVE-2014-0224 的攻击

    此更改不影响 Oracle 生成的 MySQL Server 5.6 的 MySQL Community 版本,它使用 yaSSL 库。(漏洞#18917858)

添加或更改的功能

  • 复制: 新的系统变量 binlogging_impossible_mode 控制如果服务器无法写入二进制日志时发生的情况,例如,由于文件错误。为了向后兼容,默认为 binlogging_impossible_modeIGNORE_ERROR这意味着服务器记录错误、停止记录并继续更新数据库。将此变量设置为ABORT_SERVER使服务器停止记录并在无法写入二进制日志时关闭。(错误#51014,错误#11758766)

  • 5.6.17 引入的新 Debian7、Ubuntu12.04 和 Ubuntu14.04 发行版支持现在带有特定于平台的打包源,位于 packaging目录下,在 deb-precisedeb-wheezydeb-trusty目录中。(漏洞 #19020385)

  • CMake支持已更新以处理 CMake版本 3。(缺陷 #19001781)

  • 已从源代码中删除对 LinuxThreads 的支持。LinuxThreads 在 Linux 2.6 中被 NPTL 取代。(错误#17007529、错误#72888、错误#18913935)

  • 默认情况下,mysql_install_dbmy.cnf使用模板在安装基目录中创建一个 文件。这对于某些部署来说可能是不受欢迎的。为了抑制这种行为, mysql_install_db现在支持 --keep-my-cnf保留任何现有my.cnf文件而不创建新my.cnf文件的选项。(错误#71600,错误#18205019)

修正错误

  • 重要变更;复制: 如果一条DROP TABLE语句包含常规(非临时)表和临时表,或者如果它包含同时使用事务和非事务存储引擎的临时表,则在将其发送到二进制日志之前可能会被分成多条语句。现在,当使用 GTID 时,DROP TABLE不再允许影响这些表组合的语句,除非gtid_next系统变量的值为AUTOMATIC. 这是因为,在服务器上启用DROP TABLEGTID 的情况下,在刚才描述的情况下发出一个,而每个语句只有一个 GTID 关联(​​SQL 线程执行以下操作 SET gtid_next='uuid:number') 当没有足够的 GTID 分配给原始 . 之后的所有结果语句时,会导致问题DROP TABLE

    由于DROP TABLE语句相对于当前事务的行为因表特征而异,因此语句可能会被拆分,如下所示:

    • DROP TABLE立即提交常规(非临时)表

    • DROP TABLE使用事务存储引擎的临时表的一部分与当前事务一起提交(以下 COMMIT

    • DROP TABLE立即提交使用非事务性存储引擎的临时表

    在单个语句中命名所有这三种类型的表 会导致 MySQL 服务器在二进制日志DROP TABLE中将原始语句分成三个单独 的语句。DROP TABLE如果启用了 GTID 但 的值gtid_next 不是AUTOMATIC,则发出DROP TABLE混合前面描述的任何表类型的语句会导致服务器没有足够数量的 GTID 将所有结果语句写入二进制日志。此外, DROP TABLE IF EXISTS总是为语句中指定的所有表写入二进制日志,即使某些或所有表不存在。

    因为临时表的处理方式 DROP TABLE取决于它们是使用事务性存储引擎还是非事务性存储引擎,所以任何由DROP TEMPORARY TABLE不存在的语句命名的表都被假定为事务性的。这意味着,如果DROP TEMPORARY TABLE在 master 上发布了一个具有两个非事务性临时表的表,它只会写入一个DROP TABLE语句命名两个表。如果其中一个临时表不再存在于slave上,那么当SQL线程执行该语句时,由于它影响了一个非事务性(但存在的)临时表和一个不存在的事务性临时表,它试图将其分成多个语句;这会导致问题,因为 SQL 线程只有一个 GTID 用于原始语句,但必须在二进制日志中 DROP TABLE写入两个语句。DROP TABLE

    此外,当从服务器检测到主服务器已重新启动后删除临时表时,它会 DROP TABLE为每个伪线程和每个数据库记录一个语句,但在单个DROP TABLE语句中使用事务和非事务存储引擎组合临时表。

    现在,如果 gtid_next设置为 uuid:number 值,我们会在客户端会话中抛出一个错误,并DROP TABLE发出一条混合了前面描述的任何表类型的语句。

    此外,我们现在将不存在的临时表分组,并假设它们只有在语句删除至少一个事务性临时表时才是事务性的。如果没有事务性临时表被删除,任何不存在的临时表都被假定为非事务性临时表。

    如果主服务器重新启动,从服务器现在还可以正确处理临时表的删除。(漏洞 #17620053)

  • InnoDB: 打开具有数千个子表的父表可能会导致信号灯等待时间过长。(漏洞 #18806829)

  • InnoDB:mysqldinnodb_data_file_path启动时,使用该选项指定多个数据文件 在数据写入第二个文件后返回fsp 标头错误中的 Space id 。(漏洞#18767811)

  • InnoDB: 对于单项全文搜索,已删除的文档包含在逆向文档频率 (IDF) 计算中。(错误#18711306,错误#72548)

  • InnoDB:DELETE对具有全文搜索索引的表 的(漏洞 #18683832)

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

  • InnoDB:InnoDB构建为共享库时,尝试加载InnoDB全文搜索 (FTS)INFORMATION_SCHEMA插件将失败,并出现无法打开共享库 'ha_innodb.so'错误。(缺陷 #18655281,缺陷 #70178)

  • InnoDB: 调用memcached flush_all命令时,InnoDB 尝试初始化连接和事务。如果事务处于TRX_STATE_NOT_STARTED 状态,InnoDB未能设置 CONN_DATA->CRSR_TRX为 NULL,导致严重错误。(漏洞#18652854)

  • InnoDB: MySQL 5.6.5 中引入的回归会导致在系统表空间(空间 0)中创建全文搜索索引表,即使 innodb_file_per_table已启用。(漏洞#18635485)

  • InnoDB:InnoDB memcached 插件将 在plugin_del不获取lock_plugin互斥锁的情况下调用。此错误修复还解决了 ib_cursor_delete_row. (漏洞 #18409840)

  • InnoDB: Bug#16418661 的修复 启动代码buf_flush_list()的逻辑 InnoDB(错误#17798076,错误#70899)

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

  • InnoDB: 竞争条件fts_get_next_doc_id 导致Duplicate FTS_DOC_IDCannot find index FTS_DOC_ID_INDEX in InnoDB index translation table错误。(错误#17447086,错误#70311)

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

  • InnoDB: 由于不同处理器类型的内存顺序不同,一些互斥锁和读写锁标志的读取不一致。(缺陷 #11755438,缺陷 #47213)

  • 分区: 从主键中有多个列并按 分区的表中进行选择,主 键定义中列出的最后一个(最右边的)列返回了不正确的结果。(缺陷 #17909699,缺陷 #71095)LIST COLUMNS(R)R

  • 复制: mysqlbinlog --raw没有检查由失败的写入引起的错误,这可能导致二进制日志的静默损坏。现在在这种情况下它会因错误而停止。(错误#18742916,错误#72597)

  • 复制: 当一个从属工作线程试图执行一个太大的语句时,产生的错误导致崩溃。现在在这种情况下,错误会被截断以适应缓冲区的大小。(漏洞#18563480)

  • 复制: 当使用基于行的复制时,更新或删除主服务器上不存在的行会导致从服务器在尝试处理更改时失败。InnoDB缺少主键的表会出现此问题(错误#18432495,错误#72085)

  • 复制:LOAD DATA当写入二进制日志时, 引号并不总是被正确处理 (缺陷 #18207212,缺陷 #71603)

  • 复制: 从 MySQL 5.6.20 开始,当用户指定的 AUTO_INCREMENT值超出当前值与当前AUTO_INCREMENT 值和影响行数的总和之间的范围时,它会被正确复制。在以前的版本中,即使用户指定的 AUTO_INCREMENT值超出范围,从站也会生成错误。(错误#17588419,错误#70583)

  • 复制: 在 Windows 上,如果错误日志文件已从活动的 MySQL 服务器中删除(丢失) ,则mysqldump会失败。(漏洞 #17076131)

  • 复制: 客户端应用程序应该能够 BINLOG_DUMP_NON_BLOCK在初始握手数据包 (COM_BINLOG_DUMP) 中设置标志。当服务器发送二进制日志中的最后一个事件时,连接到发出 COM_BINLOG_DUMP未设置标志的服务器的客户端不会收到 EOF,这会导致连接阻塞。这个标志在 MySQL 5.6.5 中被错误地删除,现在在当前版本中恢复了。

    作为此修复的一部分, 向mysqlbinlog--connection-server-id 添加了一个新选项。客户端可以使用此选项来测试 MySQL 服务器是否存在此问题。(错误#71178,错误#18000079)

  • 复制: 在半同步复制处于活动状态时卸载并重新安装半同步复制插件会导致复制失败。如果半同步复制处于活动状态,插件现在会检查它们是否可以卸载并产生错误。要卸载主端插件,必须没有半同步从属。要卸载从端插件,必须没有运行的半同步 I/O 线程。(错误#70391,错误#17638477)

  • 复制:由于类型不兼容,来自不同 MySQL 版本 的包含时间类型字段(例如 、 和 )的表的TIMESTAMP复制DATETIME失败。MySQL 5.6.4 中添加的小数格式未正确转换。您现在可以根据 变量以任一格式正确复制 a。(错误#70124,错误#17532932)TIMETIMESTAMPTIMESTAMPTIMESTAMPslave_type_conversions

  • 复制: 当发生以下事件时,一组参与获取锁的线程可能会死锁:

    1. 转储线程从 slave 重新连接;在 master 上,一个新的转储线程试图杀死僵尸转储线程;获得了线程的LOCK_thd_data,它即将获得LOCK_log

    2. 正在执行的应用程序线程显示二进制日志,已获取LOCK_log和即将获取 LOCK_index

    3. 应用程序线程正在执行PURGE BINARY LOGS;已经获得 LOCK_index,即将获得 LOCK_thread_count

    4. 应用程序线程正在执行SHOW PROCESSLIST(或SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST)、已获取 LOCK_thread_count和即将获取僵尸转储线程的LOCK_thd_data.

    这导致 4 个线程按照与此处列出的线程相同的顺序死锁。

    出现这个问题是因为有 和 的排序规则,还有 和 LOCK_log的排序规则, 但是没有跨越这两组锁的排序规则。这是因为在函数的整个生命周期内调用的内部函数以及获取和释放每个线程 的 . 现在这个函数从全局线程列表中获取线程的副本并对它们执行遍历,并且仅在释放之后 。在此遍历期间,从全局线程列表中删除被阻止使用 LOCK_indexLOCK_thread_countLOCK_thd_datamysqld_list_processes()SHOW PROCESSLISTLOCK_thread_countLOCK_thd_dataLOCK_thread_countLOCK_thd_remove这样,否则会因删除而被销毁的副本在遍历期间仍然有效。此处显示了此修复后的锁定顺序:

    LOCK_thd_remove -> LOCK_thd_data -> LOCK_log -> LOCK_index -> LOCK_thread_count

    (漏洞 #69954,漏洞 #17283409)

    参考资料:另请参阅:Bug #73475、Bug #19364731、Bug #19365180。

  • 当 a在其列表 SELECT中的联接中包含派生表并且列表包含 时, 即使基础结果集为空,也会返回 1。(漏洞#18853696)FROMSELECTCOUNT(DISTINCT)COUNT()

    参考资料:这个问题是 Bug #11760197 的回归。

  • 启用优化器跟踪可能会导致服务器退出子句中带有子查询的查询HAVING。(漏洞 #18791851)

  • SHA 和 MD5 函数对使用内部 filename字符集的操作失败,并可能导致服务器退出。(漏洞#18786138)

  • 传递给mysqldump的大参数可能导致缓冲区溢出和程序退出。(漏洞#18779944)

  • 元数据更改后,重新准备的触发器可能会导致服务器退出或修剪不正确的分区。(漏洞 #18684393)

  • ALTER TABLE在分区表上可能会导致将错误的存储引擎写入表的.frm文件并以 SHOW CREATE TABLE. (漏洞 #18618561)

  • 编译器标志未传递给 DTrace,导致 32 位构建在 64 位平台上交叉编译时出现问题。(漏洞#18593044)

  • max_heap_table_size 系统变量设置为较大值 (20GB) 时,创建临时表或使用MEMORY 存储引擎创建表会导致服务器退出。(漏洞#18463911)

  • 如果 MySQL 是使用该 -DINSTALL_LIBDIR=lib64选项 构建的,如果 MySQL 包被解压到具有不同安装前缀的位置,则mysql_config不起作用。此外,mysql_config不适用于某些 RPM 构建,因为它使用了不正确的安装前缀。(漏洞 #18382225)

  • 对于调试版本,0x00全文查询字符串中使用 ujis_japanese_ciutf8mb4_turkish_cieucjpms_bin排序规则的字符可能引发断言。(漏洞#18277305)

  • yaSSL 代码在证书解码中有一个差一错误,可能导致缓冲区溢出。

    yaSSL 代码有一个opendir()没有相应的closedir(). (错误#18178997,错误#17201924)

  • mysqladmin 密码屏蔽了命令行上给出的旧密码,但没有屏蔽新密码。(漏洞 #18163964)

  • 对于表的全文查询InnoDB,尝试访问已删除的文档 ID 可能会导致服务器退出。(漏洞 #18079671)

  • MyISAM临时文件可用于发起代码执行攻击。(漏洞 #18045646)

  • 对于从 events_statements_current Performance Schema 表中选择的查询,添加ORDER BY 子句可能会产生不正确的结果。(漏洞 #17729044)

  • 如果查询同时具有MIN()/MAX()aggregate_function(DISTINCT) (例如,SUM(DISTINCT))并且使用松散索引扫描执行,则结果值 MIN()/MAX()设置不正确。(漏洞 #17217128)

  • 对于UNION语句,行检查值计算错误。ROWS_EXAMINED这表现为Performance Schema 语句表(例如 )列的 值过大 events_statements_current。(漏洞 #17059925)

  • 客户端可以根据连接错误信息的内容判断一个账号是否存在。(错误#16513435、错误#17357528、错误#19273967)

  • TINYBLOB在列中的 a或 GEOMETRY列 的前缀上创建索引时可能会引发断言InnoDB。(错误#16368875、错误#18776592、错误#17665767)

  • 使用非多字节算法跳过多字节字符串中的前导空格可能会导致服务器退出。(错误#12368495,错误#18315770)

  • MySQL.prefPaneOS X 10.8 及更高版本的二进制 MySQL 发行版现在将和 工具作为可配置选项 捆绑 MySQLStartupItem.pkg到主包中,而不是单独的包。(错误#74123,错误#19701502)

  • 新的CMake选项 SUNPRO_CXX_LIBRARY启用链接libCstd而不是 stlport4在 Solaris 10 或更高版本上。这仅适用于客户端代码,因为服务器依赖于 C++98。用法示例:

    cmake -DWITHOUT_SERVER=1 -DSUNPRO_CXX_LIBRARY=Cstd

    (错误#72352,错误#18605389)

  • 当给选项一个空参数时, mysql_config_editor--login-path退出。(错误#71837、错误#18311024、错误#18830493)

  • 使用 RPM 包进行升级可能会更改安装目录的所有权。(错误#71715,错误#18281535)

  • 如果代理用户密码已过期,代理用户将无法执行语句。(错误#71337,错误#18057562)

  • MySQL 未使用 Bison 3 进行编译。(Bug #71250、Bug #18017820、Bug #18978946)

  • INSTALL PLUGIN如果三个线程同时执行, SHOW VARIABLES, 和 , 可能会发生死锁 mysql_change_user()。(错误#71236、错误#18008907、错误#72870、错误#18903155)

  • MIN()如果or 引用的列上有一个谓词, MAX()并且该谓词不存在于复合索引中早期关键部分的所有析取中,松散索引扫描将返回不正确的结果。(错误#71097,错误#17909656)

  • 客户端自动重新连接对链接到 的客户端不起作用 libmysqlclient,即使 已MYSQL_OPT_RECONNECT启用。

    此外,如果在过期FEDERATED后访问表 ,则会在没有尝试重新建立连接的情况下发生错误。(错误#70026、错误#17309863、错误#14874、错误#11745408)wait_timeoutLost connection to MySQL server

  • 多个测试和配置文件的文件权限和行尾更加一致,以避免来自包检查器的警告。(错误#68521、错误#16415173、错误#16395459、错误#68517、错误#16415032、错误#71112、错误#17919313、错误#71113、错误#17919422)

  • 使用cmake -DWITHOUT_SERVER 配置以在没有服务器的情况下构建客户端对于源代码树之外的构建失败。(缺陷 #66000,缺陷 #14367046)

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

  • big_tables启用后,在非重复键上使用具有常量相等条件的简单连接的查询 返回COUNT(DISTINCT)不正确的结果。(错误#52582,错误#11760197)

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