Documentation Home

2.12.3 降级说明

在从 MySQL 5.7 降级之前,请查看本节中的信息。某些项目可能需要在降级前采取措施。

系统表更改

  • 在 MySQL 5.7.13 中,存储 user@host 字符串值的系统表列的长度增加了。在降级到以前的版本之前,请确保没有超过之前 77 个字符长度限制的 user@host 值,并执行以下mysql系统表更改:

    ALTER TABLE mysql.proc MODIFY definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '';
    ALTER TABLE mysql.event MODIFY definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '';
    ALTER TABLE mysql.tables_priv MODIFY Grantor char(77) COLLATE utf8_bin NOT NULL DEFAULT '';
    ALTER TABLE mysql.procs_priv MODIFY Grantor char(77) COLLATE utf8_bin NOT NULL DEFAULT '';
  • 在 MySQL 5.7.8 中,MySQL 用户名的最大长度从 16 个字符增加到 32 个字符。在降级到以前的版本之前,请确保没有长度超过 16 个字符的用户名,并执行以下mysql系统表更改:

    ALTER TABLE mysql.tables_priv MODIFY User char(16) NOT NULL default '';
    ALTER TABLE mysql.columns_priv MODIFY User char(16) NOT NULL default '';
    ALTER TABLE mysql.user MODIFY User char(16) NOT NULL default '';
    ALTER TABLE mysql.db MODIFY User char(16) NOT NULL default '';
    ALTER TABLE mysql.procs_priv MODIFY User char(16) binary DEFAULT '' NOT NULL;
  • 系统表的Passwordmysql.user在 MySQL 5.7.6 中被移除。所有凭据都存储在 authentication_string列中,包括以前存储在Password 列中的凭据。要使该mysql.user表与以前的版本兼容,请在降级之前执行以下更改:

    ALTER TABLE mysql.user ADD Password char(41) character set latin1
      collate latin1_bin NOT NULL default '' AFTER user;
    UPDATE mysql.user SET password = authentication_string WHERE
      LENGTH(authentication_string) = 41 AND plugin = 'mysql_native_password';
    UPDATE mysql.user SET authentication_string = '' WHERE
      LENGTH(authentication_string) = 41 AND plugin = 'mysql_native_password';
  • help_*time_zone*系统表 在 MySQL 5.7.5 中 从更改MyISAM为。在降级到以前的版本之前,通过运行以下语句 InnoDB将每个受影响的表改回:MyISAM

    ALTER TABLE mysql.help_category ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
    ALTER TABLE mysql.help_keyword ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
    ALTER TABLE mysql.help_relation ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
    ALTER TABLE mysql.help_topic ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
    ALTER TABLE mysql.time_zone ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
    ALTER TABLE mysql.time_zone_leap_second ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
    ALTER TABLE mysql.time_zone_name ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
    ALTER TABLE mysql.time_zone_transition  ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
    ALTER TABLE mysql.time_zone_transition_type ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
  • mysql.pluginmysql.servers系统表 在 MySQL 5.7.6 中 从更改MyISAM为。在降级到以前的版本之前,通过运行以下语句 InnoDB将每个受影响的表改回:MyISAM

    ALTER TABLE mysql.plugin ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
    ALTER TABLE mysql.servers ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
  • plugin系统表中列 的定义mysql.user在 MySQL 5.7 中有所不同。在为 5.6.23 及更高版本降级到 MySQL 5.6 服务器之前,plugin使用以下语句更改列定义:

    ALTER TABLE mysql.user MODIFY plugin CHAR(64) COLLATE utf8_bin
      DEFAULT 'mysql_native_password';

    在降级到 MySQL 5.6.22 服务器或更早版本之前,plugin使用以下语句更改列定义:

    ALTER TABLE mysql.user MODIFY plugin CHAR(64) COLLATE utf8_bin DEFAULT '';
  • 从 MySQL 5.7.7 开始,sys模式在数据目录安装期间默认安装。在降级到以前的版本之前,建议您删除sys架构:

    DROP DATABASE sys;

    如果您要降级到包含 sys模式的版本, mysql_upgrade会以兼容的形式重新创建 sys模式。该 sys模式不包含在 MySQL 5.6 中。

InnoDB 的变化

  • 从 MySQL 5.7.5FIL_PAGE_FLUSH_LSN 开始,写入每个 InnoDB系统表空间文件的第一页和 InnoDB撤消表空间文件的字段仅写入InnoDB 系统表空间的第一个文件(页码 0:0)。因此,如果您有一个多文件系统表空间并决定从 MySQL 5.7 降级到 MySQL 5.6,您可能会在 MySQL 5.6 启动时遇到一条无效消息,指出日志序列号xyibdata 文件中的日志序列与日志序列不匹配ib_logfilesy中的编号. 如果遇到此消息,请重新启动 MySQL 5.6。无效消息不应再出现。

  • 为了简化InnoDB崩溃恢复期间的表空间发现,MySQL 5.7.5 中引入了新的重做日志记录类型。此增强功能更改了重做日志格式。在从 MySQL 5.7.5 或更高版本执行就地降级之前,使用 或的innodb_fast_shutdown设置执行干净关闭。使用缓慢关闭 是 In-Place Downgrade中推荐的步骤。 01innodb_fast_shutdown=0

  • MySQL 5.7.8 和 5.7.9 撤消日志可能包含有关空间列的信息不足(缺陷 #21508582)。在执行从 MySQL 5.7.10 或更高版本到 MySQL 5.7.9 或更早版本的就地降级之前,执行缓慢关闭 innodb_fast_shutdown=0以清除撤消日志。使用缓慢关闭 innodb_fast_shutdown=0In-Place Downgrade中推荐的步骤。

  • MySQL 5.7.8 撤消日志可能包含有关虚拟列和虚拟列索引的不足信息(缺陷 #21869656)。在执行从 MySQL 5.7.9 或更高版本到 MySQL 5.7.8 或更早版本的就地降级之前,执行缓慢关闭 innodb_fast_shutdown=0以清除撤消日志。使用缓慢关闭 innodb_fast_shutdown=0In-Place Downgrade中推荐的步骤。

  • 从 MySQL 5.7.9 开始,第一个重做日志文件 ( ib_logfile0) 的重做日志标头包括一个格式版本标识符和一个文本字符串,用于标识创建重做日志文件的 MySQL 版本。此增强功能更改了重做日志格式。为了防止旧版本的 MySQL 从 MySQL 5.7.9 或更高版本中创建的重做日志文件开始,重做日志检查点页面的校验和已更改。因此,您必须缓慢关闭 MySQL(使用 innodb_fast_shutdown=0)并ib_logfile*在执行就地降级之前删除重做日志文件(这些文件)。使用 innodb_fast_shutdown=0和删除重做日志文件的缓慢关闭是推荐的步骤 就地降级

  • InnoDB在 MySQL 5.7.32 中添加 了页面压缩功能使用的新压缩版本 。新的压缩版本与早期的 MySQL 版本不兼容。在 MySQL 5.7.32 或更高版本中创建页面压缩表并在降级到 MySQL 5.7.32 之前的版本后访问该表会导致失败。作为解决方法,在降级之前解压缩此类表。要解压缩表,请运行 和。有关 页面压缩功能的信息,请参阅 第 14.9.2 节,“InnoDB 页面压缩”ALTER TABLE tbl_name COMPRESSION='None'OPTIMIZE TABLEInnoDB

记录更改

  • 支持将服务器错误日志发送到 syslogMySQL 5.7.5 及更高版本与旧版本不同。如果使用syslog并降级到5.7.5之前的版本,必须停止使用相关的mysqld系统变量,改用相应的mysqld_safe命令选项。假设您 通过在选项文件组中 syslog设置这些系统变量来使用:[mysqld]

    [mysqld]
    log_syslog=ON
    log_syslog_tag=mytag

    要降级,请删除这些设置并在[mysqld_safe]选项文件组中添加选项设置:

    [mysqld_safe]
    syslog
    syslog-tag=mytag

    syslog- 没有相应mysqld_safe选项的相关系统变量在降级后不能使用。

SQL 更改

  • 一个触发器可以有触发事件(INSERT, UPDATE, DELETE)和动作时间(BEFORE, AFTER)的不同组合的触发器,但在 MySQL 5.7.2 之前不能有多个具有相同触发事件和动作时间的触发器。MySQL 5.7.2 取消了这个限制,允许多个触发器。此更改对降级有影响。

    如果将支持多个触发器的服务器降级为不支持的旧版本,则降级会产生以下影响:

    • 对于具有触发器的每个表,所有触发器定义都保留在.TRG该表的文件中。但是,如果有多个触发器具有相同的触发事件和动作时间,则服务器在触发事件发生时只执行其中一个。有关.TRG文件的信息,请参阅 表触发器存储

    • 如果在降级后添加或删除表的触发器,服务器将重写表的 .TRG文件。重写的文件只保留每个触发事件和动作时间组合的触发;其他人都迷路了。

    为避免这些问题,请在降级之前修改您的触发器。对于每个触发器事件和操作时间的组合都有多个触发器的每个表,将每个这样的触发器集转换为单个触发器,如下所示:

    1. 对于每个触发器,创建一个包含触发器中所有代码的存储例程。NEW使用和访问的值可以 OLD使用参数传递给例程。如果触发器需要来自代码的单个结果值,您可以将代码放在存储函数中并让函数返回该值。如果触发器需要来自代码的多个结果值,您可以将代码放在存储过程中并使用OUT参数返回值。

    2. 删除表的所有触发器。

    3. 为调用刚刚创建的存储例程的表创建一个新触发器。因此,此触发器的效果与其替换的多个触发器相同。