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.user
table 与以前的版本兼容,请在降级之前执行以下更改:
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 中,
plugin
和servers
系统 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. 无效的消息应该不再出现。 -
为了简化崩溃恢复期间的
InnoDB
table 空间发现,MySQL 5.7.5 中引入了新的重做日志记录类型。此增强功能更改了重做日志格式。在从 MySQL 5.7.5 或更高版本执行就地降级之前,请使用0
或1
的innodb_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
- 触发器可以具有触发器事件(INSERT,UPDATE,DELETE)和动作时间(
BEFORE
,AFTER
)的不同组合的触发器,但是在 MySQL 5.7.2 之前不能有多个触发器具有相同的触发器事件和动作时间。 MySQL 5.7.2 取消了此限制,并且允许多个触发器。此更改对降级具有影响。
如果将支持多个触发器的服务器降级为不支持的触发器,则降级会产生以下影响:
-
对于每个具有触发器的 table,所有触发器定义都保留在该 table 的
.TRG
文件中。但是,如果有多个具有相同触发事件和动作时间的触发,则当触发事件发生时,服务器仅执行其中一个。有关.TRG
个文件的信息,请参见table 触发器存储。- 如果在降级之后添加或删除了 table 的触发器,则服务器将重写 table 的
.TRG
文件。每次触发事件和动作时间的组合,重写的文件仅保留一个触发;其他人迷路了。
- 如果在降级之后添加或删除了 table 的触发器,则服务器将重写 table 的
为避免这些问题,请在降级之前修改触发器。对于每个具有触发事件和动作时间组合的多个触发器的 table,将每个这样的一组触发器转换为单个触发器,如下所示:
-
对于每个触发器,创建一个存储的例程,其中包含触发器中的所有代码。可以使用参数将使用
NEW
和OLD
访问的值传递给例程。如果触发器需要代码中的单个结果值,则可以将代码放入存储的函数中,并使该函数返回该值。如果触发器需要代码中的多个结果值,则可以将代码放入存储过程中,并使用OUT
参数返回值。 -
删除 table 的所有触发器。
-
为 table 创建一个新的触发器,该触发器调用刚刚创建的存储例程。因此,此触发器的效果与其替换的多个触发器相同。