Documentation Home
MySQL 5.6 发行说明  /  MySQL 5.6.9 的变化(2012-12-11,发布候选)

MySQL 5.6.9 的变化(2012-12-11,发布候选)

弃用和移除说明

  • Microsoft Windows: Windows Vista、Windows Server 2008 和更新版本支持使用mklink命令进行本机符号链接。这使得 MySQL 服务器使用.sym文件冗余实现数据库符号链接,因此该机制现已弃用,并将在未来的 MySQL 版本中删除。请参阅在 Windows 上使用数据库的符号链接

安装注意事项

  • 使用 Solaris PKG 包的 MySQL 安装操作(不是升级)现在支持 mysql_install_db--random-passwords选项 。

添加或更改的功能

  • 不相容的变化;复制: 一些与基于 GTID 的复制相关的变量和其他名称已更改,目的是使这些名称更合适和有意义。不再支持旧名称

    如此重命名的功能如下表所示:

    有关详细信息,请参阅使用全局事务标识符进行复制全局事务 ID 选项和变量。(漏洞 #14775984)

  • 对于因客户端帐户密码过期而被服务器限制的客户端连接,服务器现在 SET PASSWORD仅在语句中指定的帐户与客户端使用的帐户匹配时才允许。(漏洞 #14807074)

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

  • 服务器现在提供线程信息(for SHOW PROCESSLIST)来指示就地ALTER TABLE 操作的进度:

    • preparing for alter table

      服务器正准备执行就地 ALTER TABLE.

    • altering table

      服务器正在执行就地 ALTER TABLE.

    • committing alter table to storage engine

      服务器已就地完成 ALTER TABLE并正在提交结果。

    (漏洞 #14790408)

  • InnoDB通过将主键列附加到它来自动扩展每个二级索引。以前,优化器在确定如何以及是否使用该索引时不会考虑扩展二级索引的主键列。现在优化器将主键列考虑在内,这可以产生更高效的查询执行计划和更好的性能。

    优化器可以使用扩展辅助键进行 refrangeindex_merge索引访问、松散索引扫描、连接和排序优化以及 MIN()/MAX() 优化。

    系统变量的新use_index_extensions 标志允许控制优化器在确定如何使用表的二级索引optimizer_switch 时是否考虑主键列。InnoDB默认情况下,use_index_extensions 启用。要检查禁用索引扩展是否会提高性能,请使用以下语句:

    SET optimizer_switch = 'use_index_extensions=off';

    有关详细信息,请参阅索引扩展的使用。(错误#62025、错误#12814559、错误#56714、错误#11763940)

  • mysqldYYYY-MM-DD hh:mm:ss现在以 ISO ( ) 格式将日期写入错误日志它还包括其在日期之后的进程 ID。感谢 Davi Arnaut 提供补丁。(错误#56240,错误#11763523)

修正错误

  • 不兼容的更改:THREAD_ID Performance Schema 表中 的INTBIGINT以容纳 64 位值。

    笔记

    作为此更改的结果,该 表的PROCESSLIST_IDthreads现在 NULL用于后台线程。以前,后台线程的值为 0。

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

  • 不兼容的更改: 不适用于大于最大有符号值的 值。现在接受了这样的论点,对与以前版本的兼容性产生了一些影响: LAST_INSERT_ID(expr)exprBIGINT

    • LAST_INSERT_ID()现在返回一个BIGINT UNSIGNED值,而不是一个 BIGINT(有符号的)值。

    • LAST_INSERT_ID(expr) 现在返回一个无符号整数值,而不是一个有符号整数值。

    • 对于AUTO_INCREMENT列,不再支持负值。

    (错误#20964,错误#11745891)

  • Incompatible Change: 连接 ID(线程 ID)值大于 32 位可能会出现在某些系统(例如繁忙或长时间运行的 64 位系统)上,导致这些问题:

    • 写入一般查询日志和慢查询日志的连接 ID 不正确。这对于记录到文件和表都是如此。

    • CONNECTION_ID()对于大于 32 位的值, 该函数可能会返回一个数据类型太小的值。

    • mysql_thread_id()mysql_kill()C API 函数不处理大于 32 位的 ID 值 。这可能导致杀死错误的线程;例如,如果您调用了mysql_kill(mysql_thread_id()).

    当服务器支持它们时(当使用 64 位数据类型构建时),现在允许连接 ID 为 64 位值,这具有以下效果:

    • 连接 ID 已正确记录到一般查询日志和慢速查询日志中。

      笔记

      此更改涉及对日志表的修改,因此升级到此版本后,您必须运行 mysql_upgrade 并重新启动服务器。

    • CONNECTION_ID()返回适用于大于 32 位的值的数据类型。

    • mysql_thread_id()不变;客户端/服务器协议的 ID 值只有 4 个字节。对于大于 32 位的连接 ID,此函数返回不正确(截断的)值,应避免使用。

      mysql_kill()仍然无法处理大于 32 位的值,但为了防止杀死错误的线程现在在这些情况下返回错误:

      为避免 和 出现问题 mysql_thread_id()mysql_kill()请勿使用它们。要获取连接 ID,请执行SELECT CONNECTION_ID()查询并检索结果。要杀死线程,请执行一条KILL语句。

    (错误#19806、错误#11745768、错误#65715、错误#14236124、错误#44728、错误#11753308)

  • 重要变更;InnoDB:使用索引合并访问方法 的DML语句可以锁定表中的许多行,即使这些行不是最终结果集的一部分。此修复通过释放不匹配行的锁来减少过度 锁定。此优化仅影响隔离级别等于或低于严格的事务 READ COMMITTED;它不适用于事务使用REPEATABLE READSERIALIZABLE隔离级别。(漏洞 #14226171)

  • 重要变更;复制: 涉及性能模式表的语句不应写入二进制日志,因为这些表的内容仅适用于给定的 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)

  • 重要变更;复制: 由于在启用 GTID 的情况下运行服务器会阻止对非事务表的更改,因此 mysql_upgrademysql_install_db等程序无法对使用 MyISAM 存储引擎的系统表进行操作,因此无法正常运行。现在,当使用 --enforce-gtid-consistency (无论何时都需要 --gtid-mode=ON)运行时,服务器允许在非事务表上使用单个语句。(漏洞 #14722659)

  • 重要变更;复制: 以前, 每当 SQL 线程或 I/O 线程停止时Seconds_Behind_Master,输出中列 SHOW SLAVE STATUS总是设置为NULL现在,此列设置为 NULL仅当 SQL 线程未运行时,或者如果 I/O 线程未在检查以确定 SQL 线程是否已处理所有中继日志后未运行。(如果 SQL 线程已完成处理并且 I/O 线程正在运行,Seconds_Behind_Master 则为 0。)(缺陷 #12946333)

  • 表现; InnoDB:调整了 低级InnoDB读取操作的计时值,以便在快速存储设备(例如SSD )中获得更好的性能。此增强功能主要影响压缩BLOB列的 读取操作 (缺陷 #13702112,缺陷 #64258)

  • 创新数据库;Partitioning: 以前,当试图优化一个分区表的一个或多个分区时,使用了不支持分区级的存储引擎OPTIMIZE,例如 InnoDB,MySQL报告 Table does not support optimize,改为recreate + analyze,然后重新创建整个表,但实际上并没有分析它。现在在这种情况下,警告消息是,表不支持分区优化。将重建和分析所有分区。此外,整个表在第一次重建后进行分析。(缺陷 #11751825,缺陷 #42822)

  • InnoDB: 当两种操作同时发生时,服务器可能会因错误而停止:

    • ROLLBACK 包含页外列的插入行的 。

    • 涉及重建表的 ROW_FORMAT=DYNAMICor 表ROW_FORMAT=COMPRESSED(即使用Barracuda文件格式)的在线DDL操作。例如, ADD/DROP COLUMNADD PRIMARY KEY改变ROW_FORMAT

    (漏洞 #14842014)

  • InnoDB: 如果在将行插入到具有FULLTEXT索引的表中但在提交事务之前服务器崩溃,则在下一次启动期间可能会发生错误:

    InnoDB: Assertion failure in thread thread_num in file dict0dict.cc line 1019

    (漏洞 #14826779)

  • InnoDB:当通过语句InnoDB包含 FULLTEXT索引 的表时,服务器可能会因错误而停止 HANDLER(漏洞 #14788710)

  • InnoDB:由于文件系统中保留了临时表空间文件,在orALTER TABLE语句 时,Windows 系统上可能会发生超时错误 (漏洞 #14776799)DISCARD TABLESPACEIMPORT TABLESPACE

  • InnoDB: InnoDB带有 FULLTEXT索引的表可以为从未释放的线程句柄分配内存,这可能导致 Windows 系统上的资源问题。(漏洞 #14759163)

  • InnoDB: 服务器可能会因操作的断言错误而停止 ANALYZE TABLE,具体取决于表及其索引的结构:

    InnoDB: Assertion failure in thread thread_num in file dict0dict.ic line 447
    InnoDB: Failing assertion: pos < table->n_def

    (漏洞 #14755452)

  • InnoDB: 在 复制表 的在线 DDL操作期间,表的二级索引可能会损坏。(漏洞 #14753701)

  • InnoDB:当使用索引前缀为唯一索引报告重复键错误时,表 的在线 DDL 操作InnoDB错误地报告了空值 ('') 而不是正确的键值。(漏洞 #14729221)

  • InnoDB: 如果在线 DDL CREATE INDEX操作后服务器崩溃,则在下次启动时回滚未完成的事务时可能会出错:

    InnoDB: error in sec index entry del undo in
    ...
    InnoDB: Assertion failure in thread thread_num in file row0umod.cc line 559

    (漏洞 #14707452)

  • InnoDB:ALTER TABLE此修复改进了操作添加的列超出表允许的最大数量 时的错误处理 InnoDB。它还将表的最大列数InnoDB从 1000 增加到 1020。(缺陷 #14705287)

  • InnoDB: 此修复使 MySQL KILL QUERY 在查询访问 InnoDB表时对语句的响应更快。(漏洞 #14704286)

  • 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: 在 重建表的在线 DDLCHECK TABLE操作期间,一条语句可能会报告所有二级索引的计数不匹配。(漏洞 #14606472)

  • InnoDB:FULLTEXT创建索引并从InnoDB表中删除索引后,进一步 ALTER TABLE的添加、删除和重命名列的操作可能会导致严重错误。bug #13972248 的回归。(漏洞 #14504337)

  • InnoDB: 如果ALTER TABLE在尝试为表创建FULLTEXT 索引InnoDB,则服务器可能会在删除不完整索引时因断言错误而停止。(漏洞 #14504174)

  • InnoDB: 在关闭期间, innodb_purge_threads 配置选项设置大于 1,服务器可能会因以下错误而过早停止:

    mysqld got signal 11

    解决方法是增加 innodb_log_file_size并设置 innodb_purge_threads=1. 该修复程序已反向移植到 MySQL 5.5 和 5.1,尽管这些版本没有 innodb_purge_threads 配置选项,因此不太可能发生错误。(漏洞 #14234028)

  • InnoDB: 在某些并发操作组合下,服务器可能会因错误而停止:

    InnoDB: unknown error code 20

    此问题起源于 5.6 开发周期。它只影响使用READ COMMITTEDREAD UNCOMMITTED 隔离级别的事务。(错误#13641662,错误#12424846)

  • InnoDB:此修复改进了无法创建外键约束 时的错误消息 该消息没有提及无法使用自动生成的名称创建表,而是明确指出了错误:

    ERROR 1215 (HY000): Cannot add foreign key constraint

    发出后续SHOW WARNINGS语句会提供有关所需的任何二级索引的更多详细信息。(错误#11745444,错误#15324)

  • 复制: 如果要复制的表有FULLTEXT 索引,则在选择用于查找下一行的扫描类型时不排除该索引,即使它不能用于查找正确的行。行应用程序随后尝试使用索引扫描失败,导致复制失败。FULLTEXT现在在这种情况下,在确定是否为此目的使用表、索引或散列扫描时,不考虑不提供顺序访问的索引(例如 (漏洞 #14843764)

  • 复制: 给定调用函数的存储例程:一旦R在 返回 ,在客户端会话的其余部分,每次在内部它都会继续返回(漏洞 #14838575)GTID_SUBTRACT()GTID_SUBTRACT()NULLRNULLR

  • 复制: 当使用 GTID-aware master-slave 协议时,slave I/O 线程使用了错误的位置。使用 GTID 时,通常不会使用该位置,但作为一种特殊情况,当从属重新连接到同一主控时,除了 GTID 之外还使用了该位置(即使这不是必需的)。通过使 GTID 感知主从协议不再使用位置来解决此问题。(漏洞 #14828028)

  • 复制: MySQL Enterprise Backup mysqldumpmysqlhotcopy无法与启用 GTID 的 MySQL 服务器一起使用,因为它们无法恢复服务器的 GTID 状态,因此无法从二进制日志中除开头以外的任何点恢复。

    作为此问题修复的一部分, gtid_purged系统变量(以前名为gtid_lost)不再是只读的;现在可以在 gtid_executed(以前 gtid_done)为空时向其添加 GTID。(漏洞 #14787808)

  • 复制: 在清除第一个二进制日志文件后重新启动复制导致错误Got fatal error 1236 from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but master has purged binary logs containing从站需要的 GTID。这导致基于 GTID 的复制失败。(漏洞 #14756691)

  • Solaris: 使用 Solaris 软件包安装 在升级操作期间运行mysql_install_db (这应该只发生在新安装中)。(错误#14747671,错误#16534721)

  • mysql_install_db未能遵守该 --user选项。(漏洞 #15866735)

  • 优化器在确定子查询执行策略时可能分配的内存不足,导致服务器退出。(漏洞 #14846866)

  • 优化器可以在根据条件评估范围测试时提出断言IS NOT NULL。(漏洞 #14843705)

  • init_io_cache()用于 memset()清除互斥量但传递了错误的互斥量大小。(漏洞 #14838882)

  • 如果表名包含非字母数字字符,则使用索引创建InnoDBFULLTEXT可能会遇到严重错误。(错误#14835178,错误#16036699)

  • 越界读取可能发生在 filename_to_tablename(). (漏洞 #14834378)

  • 在启用了全局事务 ID (GTID) 的服务器上使用mysqldump进行备份时,转储文件不包含任何 GTID 信息。这最终会导致在使用备份启动从属时从历史开始复制事务。

    为了能够控制写入转储文件的 GTID 信息,mysqldump现在有一个 --set-gtid-purged选项指示是否向 输出添加语句。 SET @@GLOBAL.gtid_purged

    下表显示了允许的选项值。默认值为AUTO

    价值 意义
    OFF SET不向输出添加语句。
    ON 在输出中添加SET语句。如果服务器上未启用 GTID,则会发生错误。
    AUTO SET如果在服务器上启用了 GTID,则在输出中添加一条语句。

    (漏洞 #14832472)

  • LOCK TABLES实际上, 可以CREATE TABLE IF NOT EXISTS ... LIKE提出断言。(漏洞 #14788976)

  • 断言可以在执行 INSERT, UPDATE, 或 DELETE隐式启动READ ONLY事务 LOCK TABLES模式后引发。(漏洞 #14788540)

  • 带有联合和连接的查询可能会使解析器崩溃。(错误#14786792,错误#16076289)

  • 尝试读取utf16带有 LOAD DATA引发断言的文件。(漏洞 #14786470)

  • 派生表处理的自动键生成部分未正确处理指定为 VALUES()子句一部分的列,并导致引发断言。(漏洞 #14786324)

  • 对于从零长度表名中选择的查询,可能会发生无效的内存读取。(漏洞 #14780820)

  • SHOW PROCESSLIST输出未按顺序排序Id。(漏洞 #14771006)

  • 对于某些SELECT语句, EXPLAIN可能会导致服务器退出。(漏洞 #14761894)

  • 尝试在具有类型属性的表 中创建 自动增量列可能会导致严重错误。(漏洞 #14758479)InnoDBNULL

  • 尝试使用 tiny、medium、long或 列ALTER TABLE设置默认值 时发生内存泄漏。(漏洞 #14756206)BLOBTEXT

  • 如果ALTER TABLE用于将列重命名为与现有列相同的名称,同时还使用 AFTERor对重命名的列重新排序,则会引发断言FIRST。(漏洞 #14756089)

  • NOT IN如果使用半连接物化来评估子查询 ,则可以提出断言。(漏洞 #14751858)

  • 发出后ALTER TABLE ... DISCARD TABLESPACE,同一表的联机 DDL 操作可能会在 Windows 系统上失败并出现错误:Got error 11 from storage engineALTER TABLE带有该 子句的语句ALGORITHM=INPLACE还可以创建一个空的.ibd 文件,使表空间不再被丢弃。(漏洞 #14735917)

  • 对于某些延续处理程序嵌套,延续可能发生在错误的位置。(漏洞 #14724836)

  • 启动服务器 bind_address然后设置 host_cache_size为 0 可能会导致服务器停止某些类型的客户端连接。(漏洞 #14689561)

  • 对于UPDATE语句, EXPLAIN在列中显示总密钥长度,key_len而不是使用的密钥部分的长度。(漏洞 #14682438)

  • 启用索引条件下推后,优化器可能会为派生表生成不正确的结果。(漏洞 #14640176)

  • SHOW PROFILE可用于导致过多的服务器内存消耗。(漏洞 #14629232)

  • 优化器可能会错误地使用非空间索引来优化空间操作,从而导致引发断言。(漏洞 #14600994)

  • 修复 了mysql_config_editor的 几个问题:

    • 没有关于配置文件写入错误的错误消息。

    • --all该命令不支持该选项 ,remove但没有针对尝试使用 的警告消息remove --all

    • --all该命令不支持该选项 ,set但没有针对尝试使用 的警告消息set --all

    此外,命令现在支持--user--password和选项。如果存在,该命令仅从登录路径中删除请求的值。如果没有给出,则删除整个 登录路径。例如,此命令仅删除登录路径中的值 而不是整个 登录路径: --hostremoveremoveremoveclientuserclientclient

    mysql_config_editor remove --login-path=client --user

    (错误#14505672、错误#14545989、错误#14545999)

  • LIKE具有太多 '%'通配符 的模式可能会导致分段错误。(漏洞 #14303860)

  • 以前, events_statements_summary_by_digest Performance Schema 表是 DIGEST单独按列分组的摘要。现在此表包含一SCHEMA_NAME列,摘要摘要按SCHEMA_NAMEDIGEST列分组。

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

  • 即使没有启用任何关联的日志,查询重写以清除日志记录的密码也是如此。此外, CREATE SERVER现在 ALTER SERVER根据需要重写。(漏洞 #14073554)

  • CREATE TABLE ... SELECT可以创建一个包含 type 列的表,NULL访问该列时会导致服务器退出。(错误#14021323,错误#23280699)

  • CHECK TABLE如果表有损坏的键 ( ) 文件, REPAIR TABLE则可能会崩溃 。现在服务器产生错误。(漏洞 #13556441)MyISAM.MYI

  • CHECK TABLE如果表有损坏的键 ( ) 文件, REPAIR TABLE则可能会崩溃 。现在服务器产生错误。(错误#13556107,错误#13556000)MyISAM.MYI

  • 来自myisamchk命令 的缓冲区太小错误消息 引用了 配置选项,而它本应引用 . myisam_sort_buffer_sizesort_buffer_size

    myisamchk现在有一个 myisam_sort_buffer_size变量可用作sort_buffer_size. myisam_sort_buffer_size更可取, sort_buffer_size因为它的名称对应于myisam_sort_buffer_size 具有相似含义的服务器系统变量。 sort_buffer_size应被视为弃用。(错误#11754894,错误#46578)

  • Performance Schema表host_cache多次显示某些行。这不是主机缓存本身的问题,只是提供有关缓存内容信息的表的问题。(缺陷 #67236,缺陷 #14764890)

  • 在 OS X 上,重新初始化查询缓存可能会导致服务器退出。感谢 Davi Arnaut 提供补丁。(漏洞 #67156,漏洞 #14741880)

  • 服务器无法将查询缓存用于其中数据库或表名包含特殊字符且表存储引擎为 的查询InnoDB。(漏洞 #64821,漏洞 #13919851)

  • mysqld_safe忽略了 UMASK环境变量的值,导致在创建文件的访问模式方面与mysqld不同的行为。现在 mysqld_safe(和 mysqld_multi)试图接近与mysqld相同的行为。(错误#57406,错误#11764559)

  • 对于mysql数据库 的转储,除非给出选项,否则mysqldump会跳过该 event表 。--events这不再发生。event 如果需要 跳过该表,请改用该--ignore-table选项(Bug #55587,Bug #11762933)

  • 对于MEMORYHASH索引的表, DELETE有时无法删除所有适用的行。(错误#51763,错误#11759445)

  • 在 OS X 上,KILL有时可能不可靠。(缺陷 #37780,缺陷 #11748945)