2.12.3 降级说明

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

系统 table 更改

  • 在 MySQL 5.7.13 中,存储 user @ host 字符串值的系统 table 列的长度增加了。降级到以前的版本之前,请确保没有任何 user @ host 值超过以前的 77 个字符的长度限制,并执行以下mysql系统 table 更改:
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系统 table 更改:
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;
  • 在 MySQL 5.7.6 中删除了mysql.user系统 table 的Password列。所有凭证都存储在authentication_string列中,包括以前存储在Password列中的凭证。为了使mysql.usertable 与以前的版本兼容,请在降级之前执行以下更改:
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';
  • 在 MySQL 5.7.5 中,help_*time_zone*系统 table 从MyISAM更改为InnoDB。在降级到先前版本之前,通过运行以下语句将每个受影响的 table 改回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 5.7.6 中,pluginservers系统 table 从MyISAM更改为InnoDB。在降级到先前版本之前,通过运行以下语句将每个受影响的 table 改回MyISAM
ALTER TABLE mysql.plugin ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
ALTER TABLE mysql.servers ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
  • mysql.user系统 table 中plugin列的定义在 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 Changes

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

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

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

  • MySQL 5.7.8 撤消日志可能包含的有关虚拟列和虚拟列索引的信息不足(错误号 21869656)。在执行从 MySQL 5.7.9 或更高版本到 MySQL 5.7.8 或更早版本的就地降级之前,请使用innodb_fast_shutdown=0进行慢速关机以清除撤消日志。建议在In-Place Downgrade中使用innodb_fast_shutdown=0缓慢关闭。

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

Logging Changes

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

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

[mysqld_safe]
syslog
syslog-tag=mytag

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

SQL Changes

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

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

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

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

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

  • 对于每个触发器,创建一个存储的例程,其中包含触发器中的所有代码。可以使用参数将使用NEWOLD访问的值传递给例程。如果触发器需要代码中的单个结果值,则可以将代码放入存储的函数中,并使该函数返回该值。如果触发器需要代码中的多个结果值,则可以将代码放入存储过程中,并使用OUT参数返回值。

  • 删除 table 的所有触发器。

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