在从 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;
系统表的
Password
列mysql.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.plugin
和mysql.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.5
FIL_PAGE_FLUSH_LSN
开始,写入每个InnoDB
系统表空间文件的第一页和InnoDB
撤消表空间文件的字段仅写入InnoDB
系统表空间的第一个文件(页码 0:0)。因此,如果您有一个多文件系统表空间并决定从 MySQL 5.7 降级到 MySQL 5.6,您可能会在 MySQL 5.6 启动时遇到一条无效消息,指出日志序列号x
和y
ibdata 文件中的日志序列与日志序列不匹配ib_logfilesy
中的编号. 如果遇到此消息,请重新启动 MySQL 5.6。无效消息不应再出现。为了简化
InnoDB
崩溃恢复期间的表空间发现,MySQL 5.7.5 中引入了新的重做日志记录类型。此增强功能更改了重做日志格式。在从 MySQL 5.7.5 或更高版本执行就地降级之前,使用 或的innodb_fast_shutdown
设置执行干净关闭。使用缓慢关闭 是 In-Place Downgrade中推荐的步骤。0
1
innodb_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=0
是 In-Place Downgrade中推荐的步骤。MySQL 5.7.8 撤消日志可能包含有关虚拟列和虚拟列索引的不足信息(缺陷 #21869656)。在执行从 MySQL 5.7.9 或更高版本到 MySQL 5.7.8 或更早版本的就地降级之前,执行缓慢关闭
innodb_fast_shutdown=0
以清除撤消日志。使用缓慢关闭innodb_fast_shutdown=0
是 In-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 TABLE
InnoDB
记录更改
支持将服务器错误日志发送到
syslog
MySQL 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
文件。重写的文件只保留每个触发事件和动作时间组合的触发;其他人都迷路了。
为避免这些问题,请在降级之前修改您的触发器。对于每个触发器事件和操作时间的组合都有多个触发器的每个表,将每个这样的触发器集转换为单个触发器,如下所示:
对于每个触发器,创建一个包含触发器中所有代码的存储例程。
NEW
使用和访问的值可以OLD
使用参数传递给例程。如果触发器需要来自代码的单个结果值,您可以将代码放在存储函数中并让函数返回该值。如果触发器需要来自代码的多个结果值,您可以将代码放在存储过程中并使用OUT
参数返回值。删除表的所有触发器。
为调用刚刚创建的存储例程的表创建一个新触发器。因此,此触发器的效果与其替换的多个触发器相同。