10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

2.11.3 MySQL 5.7的变化

在升级到MySQL 5.7之前,请检查本节中描述的更改,以确定那些适用于当前MySQL安装和应用程序的更改。执行任何推荐的操作。

更改标记为不兼容的更改与MySQL的早期版本不兼容,可能需要您的注意在升级之前.我们的目标是避免这些更改,但有时它们对于纠正比版本之间的不兼容更糟糕的问题是必要的。如果适用于您的安装的升级问题涉及不兼容,请遵循描述中给出的说明。有时,这涉及到转储和重新加载表,或使用诸如检查表修理表

有关转储和重新加载的说明,请参见第2.11.12节“重建或修复表或索引”.任何涉及到修理表USE_FRM选项必须在升级前完成。在与创建表的版本不同的MySQL版本中使用此语句(即在升级后使用它)可能会损坏表。看到第13.7.2.5节,“REPAIR TABLE声明”

配置更改

系统表的变化

  • 不兼容的更改:密码列的mysql.user在MySQL 5.7.6中删除system表。所有凭据都存储在authentication_string列,包括以前存储在密码列。如果执行MySQL 5.7.6或更高版本的本地升级,请运行mysql_upgrade根据就地升级程序迁移的密码列内容添加到authentication_string列。

    如果执行逻辑升级使用一个, mysqldumpdump文件从5.7.6以前的MySQL安装,您必须遵守这些条件, mysqldump生成转储文件的命令。

    正如《逻辑升级程序,在运行前将5.7.6之前的转储文件加载到5.7.6(或更高版本)服务器mysql_upgrade

服务器的变化

  • 不兼容的更改:从MySQL 5.7.5开始,删除了对使用旧的4.1以前的密码哈希格式的密码的支持,这涉及到以下更改。使用不再支持的特性的应用程序必须被修改。

    • mysql_old_password删除使用4.1之前的密码哈希值的身份验证插件。使用此插件的帐户在启动时被禁用,服务器写入未知的插件消息发送到错误日志。有关升级使用此插件的帐户的说明,请参阅第6.4.1.3节,“从4.1之前的密码哈希和mysql_old_password插件迁移”

    • old_passwords系统变量,值为1(产生4.1之前的哈希值)不再被允许。

    • ——secure-auth选项到服务器和客户端程序是默认的,但现在是空的。它已被弃用,希望在未来的MySQL版本中删除它。

    • ——skip-secure-auth选项不再受支持,使用它会产生错误。

    • secure_auth系统变量只允许值为1;不再允许值为0。

    • OLD_PASSWORD ()函数删除。

  • 不兼容的更改:在MySQL 5.6.6中,2位数(2)数据类型已弃用。在MySQL 5.7.5中,支持(2)是删除。升级到MySQL 5.7.5或更高版本后,任何剩下的2位数(2)列必须转换为4位数字一年列重新变得可用。有关转换策略,请参见第11.2.5节,“两位数年份(2)的限制和向四位数年份的迁移”.运行mysql_upgrade升级后是一种可能的转化策略。

  • 从MySQL 5.7.7开始,检查表……为升级报告需要重建的表,如果该表包含5.6.4以前格式的旧时态列(时间DATETIME,时间戳不支持小数秒精度的列)和avoid_temporal_upgrade禁用系统变量。这可以帮助mysql_upgrade检测和升级包含旧时态列的表。如果avoid_temporal_upgrade启用,为升级忽略表中旧有的时间列;因此,mysql_upgrade不升级它们。

    从MySQL 5.7.7开始,修理表如果表中包含5.6.4以前格式的旧时态列,则升级该表avoid_temporal_upgrade禁用系统变量。如果avoid_temporal_upgrade启用,修理表忽略表中存在的旧时态列,不升级它们。

    若要检查包含此类时态列并需要重新构建的表,请禁用avoid_temporal_upgrade在执行之前检查表……为升级

    若要升级包含此类时态列的表,请禁用avoid_temporal_upgrade在执行之前修理表mysql_upgrade

  • 不兼容的更改:从MySQL 5.7.2开始,服务器需要在mysql.user系统表有一个非空的插件列值,并禁用具有空值的帐户。这要求您升级您的mysql.user表中要填写全部插件值。从MySQL 5.7.6开始,使用以下过程:

    如果您计划使用现有MySQL安装的data目录进行升级:

    1. 停止旧的(MySQL 5.6)服务器

    2. 通过用新的二进制文件替换旧的二进制文件来升级MySQL二进制文件

    3. 正常启动MySQL 5.7服务器(没有特殊选项)

    4. 运行mysql_upgrade升级系统表

    5. 重新启动MySQL 5.7服务器

    如果您计划通过重新加载从现有MySQL安装生成的转储文件来升级:

    1. 执行命令生成转储文件, mysqldump——add-drop-table选项,且没有——flush-privileges选项

    2. 停止旧的(MySQL 5.6)服务器

    3. 升级MySQL二进制文件(用新的二进制文件替换旧的二进制文件)

    4. 正常启动MySQL 5.7服务器(没有特殊选项)

    5. 重新载入转储文件(mysql <dump_file

    6. 运行mysql_upgrade升级系统表

    7. 重新启动MySQL 5.7服务器

    在MySQL 5.7.6之前,这个过程更复杂:

    如果您计划使用现有MySQL安装的data目录进行升级:

    1. 停止旧的(MySQL 5.6)服务器

    2. 升级MySQL二进制文件(用新的二进制文件替换旧的二进制文件)

    3. 方法重新启动服务器——skip-grant-tables选项禁用特权检查

    4. 运行mysql_upgrade升级系统表

    5. 正常重启服务器——skip-grant-tables

    如果您计划通过重新加载从现有MySQL安装生成的转储文件来升级:

    1. 执行命令生成转储文件, mysqldump没有——flush-privileges选项

    2. 停止旧的(MySQL 5.6)服务器

    3. 升级MySQL二进制文件(用新的二进制文件替换旧的二进制文件)

    4. 方法重新启动服务器——skip-grant-tables选项禁用特权检查

    5. 重新载入转储文件(mysql <dump_file

    6. 运行mysql_upgrade升级系统表

    7. 正常重启服务器——skip-grant-tables

    mysql_upgrade默认运行为MySQL用户。对于上述程序,如果运行时密码已过期mysql_upgrade,它会显示一条消息,通知您的密码已过期mysql_upgrade结果失败了。要纠正此错误,请重置密码和运行mysql_upgrade再次:

    shell> mysql -u root-p Enter password: **** <- Enter root password here mysql> ALTER USER USER() IDENTIFIED BY 'root-password';SET PASSWORD = PASSWORD('root-password');# MySQL 5.7.6 MySQL > quit shell> mysql_upgrade -p Enter password: **** <- Enter root password here

    如果服务器以。启动,则密码重置语句通常不起作用——skip-grant-tables,但第一次的祈求mysql_upgrade清除特权,所以当您运行时mysql时,接受该声明。

    如果mysql_upgrade本身到期密码,您必须以相同的方式重新设置密码。

    在遵循上述指示之后,建议dba还转换使用mysql_old_password要使用的身份验证插件mysql_native_password相反,因为支持mysql_old_password被移除。有关帐户升级说明,请参见第6.4.1.3节,“从4.1之前的密码哈希和mysql_old_password插件迁移”

  • 不兼容的更改:对于一个列来说是可能的默认的的值有效sql_mode的值,但对于sql_mode值时插入或更新行。例子:

    SET sql_mode = ";CREATE TABLE t (d DATE DEFAULT 0);SET sql_mode = 'NO_ZERO_DATE,STRICT_ALL_TABLES';INSERT INTO t (d) VALUES(默认值);

    在这种情况下,应该接受0作为创建表但是被拒绝了插入.然而,以前服务器不进行评估默认的用于针对当前进行插入或更新的值sql_mode.在这个例子中,插入成功和插入“0000-00-00”日期列。

    从MySQL 5.7.2开始,服务器应用了适当的sql_mode检查在插入或更新时生成警告或错误。

    如果使用基于语句的日志记录,则会导致复制不兼容(binlog_format =声明)是,如果副本被升级,未升级的源将正常执行上述示例,而插入复制失败,复制停止。

    要处理这个问题,请停止源上的所有新语句,并等待副本追赶上来。然后升级副本,然后升级源。或者,如果无法停止新语句,则在源(binlog_format =行)并等待,直到所有副本都处理了到此更改点为止产生的所有二进制日志。然后升级副本,然后升级源,并将源更改为基于语句的日志记录。

  • 不兼容的更改:为了更好地兼容Oracle audit Vault,审计日志插件做了一些修改。出于升级的目的,主要问题是审计日志文件的默认格式发生了更改:内部的信息< AUDIT_RECORD >以前使用属性编写的元素现在使用子元素编写。

    旧的例子< AUDIT_RECORD >格式:

     .  2013-04-15T15:27:27 UTC 3998_2013-04-15T15:27:27 Query 3 0 0 root[root] @ localhost [127.0.0.1]  localhost 127.0.0.1 select 

    如果你之前使用的是旧版本的审计日志插件,使用这个过程来避免将新格式的日志条目写入现有的包含旧格式条目的日志文件:

    1. 停止服务器。

    2. 手动重命名当前审计日志文件。该文件只包含使用旧格式的日志条目。

    3. 更新服务器并重新启动它。审计日志插件创建一个新的日志文件,其中只包含使用新格式的日志条目。

    有关审计日志插件的信息,请参见第6.4.5节,“MySQL企业审计”

  • 从MySQL 5.7.7开始,副本的默认连接超时时间从3600秒(1小时)更改为60秒(1分钟)。的副本时应用新的默认值slave_net_timeout系统变量升级到MySQL 5.7。心跳间隔的默认设置(如果连接仍然良好,则调节心跳信号以停止在没有数据的情况下发生的连接超时)计算为的值的一半slave_net_timeout.心跳间隔记录在副本的源信息日志中mysql.slave_master_info表或master.info的值或默认设置时,它不会自动更改slave_net_timeout是改变。一个MySQL 5.6副本使用默认的连接超时和心跳间隔,然后升级到MySQL 5.7,因此心跳间隔远远大于连接超时。

    如果源上的活动级别是至少每60秒向副本发送一次对二进制日志的更新,那么这种情况就不是问题。但是,如果没有从源接收到数据(因为没有发送心跳),则连接超时将过期。副本因此认为到源的连接已经丢失,并进行多次重新连接尝试(由MASTER_CONNECT_RETRY而且MASTER_RETRY_COUNT设置,也可以在源信息日志中看到)。重新连接尝试产生大量僵尸转储线程,源必须杀死这些线程,导致源的错误日志包含多个错误实例ER_RPL_ZOMBIE_ENCOUNTERED.为避免此问题,在将副本升级到MySQL 5.7之前,立即检查slave_net_timeout系统变量使用默认设置。如果是这样的话,问题改变主MASTER_HEARTBEAT_PERIOD选项,并将心跳间隔设置为30秒,以便它与升级后应用的新连接超时60秒一起工作。

InnoDB的变化

  • 从MySQL 5.7.24开始,zlib库与MySQL绑定的版本从1.2.3版本提升到1.2.11版本。

    zlibcompressBound ()函数在zlib 1.2.11中返回的压缩给定字节长度所需缓冲区大小的估计值比在zlib 1.2.3中略高。的compressBound ()函数由InnoDB确定在创建压缩时允许的最大行大小的函数InnoDB表或将行插入到压缩InnoDB表。作为一个结果,创建表……ROW_FORMAT =压缩插入在早期版本中,行大小非常接近最大行大小的操作现在可能会失败。

    如果你压缩了InnoDB对于行较大的表,建议您测试压缩表创建表在升级之前在MySQL 5.7测试实例上安装一个语句。

  • 不兼容的更改:为了简化InnoDB在MySQL 5.7.5中引入了新的重做日志记录类型。这种增强改变了重做日志的格式。在执行就地升级之前,请使用innodb_fast_shutdown设置01.使用innodb_fast_shutdown = 0是否有建议的步骤就地升级

  • 不兼容的更改MySQL 5.7.8和5.7.9 undo日志可能包含空间列的信息不足,这可能导致升级失败(Bug #21508582)。在执行MySQL 5.7.8或5.7.9升级到5.7.10或更高版本之前,请使用innodb_fast_shutdown = 0清除undo日志。使用innodb_fast_shutdown = 0是否有建议的步骤就地升级

  • 不兼容的更改: MySQL 5.7.8 undo日志可能包含虚拟列和虚拟列索引的信息不足,这可能导致升级失败(Bug #21869656)。在执行从MySQL 5.7.8到MySQL 5.7.9或更高版本的本地升级之前,请使用innodb_fast_shutdown = 0清除undo日志。使用innodb_fast_shutdown = 0是否有建议的步骤就地升级

  • 不兼容的更改从MySQL 5.7.9开始,第一个重做日志文件的重做日志头(ib_logfile0)包含一个格式版本标识符和一个文本字符串,用来标识创建重做日志文件的MySQL版本。这个增强改变了重做日志的格式,要求MySQL干净地使用innodb_fast_shutdown设置01在执行MySQL 5.7.9或更高版本的本地升级之前。使用innodb_fast_shutdown = 0是否有建议的步骤就地升级

  • 在MySQL 5.7.9,动态替换紧凑的的隐式默认行格式InnoDB表。一个新的配置选项,innodb_default_row_format,指定默认的InnoDB行格式。允许的值包括动态(默认),紧凑的,冗余

    升级到5.7.9之后,您创建的任何新表都将使用innodb_default_row_format除非显式定义行格式(ROW_FORMAT).

    对于没有显式定义的现有表ROW_FORMAT选项或使用ROW_FORMAT =违约,任何重建表的操作也会将表的行格式无声地更改为定义的格式innodb_default_row_format.否则,现有表将保留其当前行格式设置。有关更多信息,请参见定义表的行格式

  • 从MySQL 5.7.6开始,InnoDB存储引擎使用自己的内置(本地的)对使用创建的任何新分区表的分区处理程序InnoDB.分区InnoDB在以前版本的MySQL中创建的表不会自动升级。您可以轻松地升级这些表来使用InnoDB在MySQL 5.7.9或更高版本中使用以下方法之一进行本地分区:

    • 将单个表从通用分区处理程序升级到InnoDB本机分区,执行该语句ALTER TABLEtable_name升级分区

    • 升级所有InnoDB使用通用分区处理程序的表将使用本机分区处理程序来代替mysql_upgrade

SQL的变化

  • 不兼容的更改:GET_LOCK ()函数在MySQL 5.7.5中使用元数据锁定(MDL)子系统重新实现,它的功能得到了扩展:

    • 在此之前,GET_LOCK ()一次只允许获取一个命名锁,以及第二个GET_LOCK ()调用释放任何现有的锁。现在GET_LOCK ()允许同时获取多个命名锁,而不释放现有锁。

      的行为的应用程序GET_LOCK ()释放任何以前的锁必须针对新的行为进行修改。

    • 获取多个锁的功能引入了客户端之间死锁的可能性。MDL子系统检测死锁并返回ER_USER_LOCK_DEADLOCK错误。

    • MDL子系统对锁名施加了64个字符的限制,因此该限制现在也适用于命名锁。此前,没有实施长度限制。

    • 与获得的锁GET_LOCK ()现在出现在性能架构中metadata_locks表格的OBJECT_TYPE列表示用户级锁OBJECT_NAME列表示锁名。

    • 一个新函数,RELEASE_ALL_LOCKS ()允许立即释放所有已获得的命名锁。

    有关更多信息,请参见第12.15节,“锁定功能”

  • 中的派生表和视图条款,以更好地避免不必要的物化,并允许使用下推条件,以产生更有效的执行计划。然而,对于诸如删除更新修改表时,对先前物化的派生表使用合并策略会导致ER_UPDATE_TABLE_USED错误:

    mysql> DELETE FROM t1 -> WHERE id IN (SELECT id -> FROM)id -> FROM t1 INNER JOIN t2 USING (id) -> WHERE t2。status = 0) AS t);错误1093 (HY000):在FROM子句中不能为更新指定目标表't1'

    当将派生表合并到外部查询块中会产生从表中选择和修改表的语句时,会出现此错误。(物化不会引起这个问题,因为实际上它将派生表转换为一个单独的表。)要避免此错误,请禁用derived_merge国旗的optimizer_switch执行语句之前的系统变量:

    SET optimizer_switch = 'derived_merge=off';

    derived_merge控件中的子查询和视图是否试图合并子句插入外部查询块,假设没有其他规则阻止合并。缺省情况下,标志为使合并。将标志设置为防止合并,避免刚才描述的错误。有关更多信息,请参见第8.2.2.4节“通过合并或物化优化派生表和视图引用”

  • MySQL 5.7中可能保留了MySQL 5.6中没有保留的一些关键字。看到第9.3节“关键词和保留词”.这可能导致以前用作标识符的单词变成非法的。要修复受影响的语句,请使用标识符引号。看到第9.2节“模式对象名称”

  • 在升级之后,建议您测试应用程序代码中指定的优化器提示,以确保实现所需的优化策略仍然需要这些提示。优化器增强有时会使某些优化器提示变得不必要。在某些情况下,不必要的优化提示甚至可能适得其反。

  • 联盟语句,应用命令限制一个个人选择,将子句放在包含选择

    SELECT a FROM t1 WHERE a=11 AND B=2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10

    以前版本的MySQL可能允许这种不带括号的语句。在MySQL 5.7中,对括号的要求是强制的。