在从 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将每个受影响的表改回:MyISAMALTER 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将每个受影响的表改回:MyISAMALTER 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和yibdata 文件中的日志序列与日志序列不匹配ib_logfilesy中的编号. 如果遇到此消息,请重新启动 MySQL 5.6。无效消息不应再出现。为了简化
InnoDB崩溃恢复期间的表空间发现,MySQL 5.7.5 中引入了新的重做日志记录类型。此增强功能更改了重做日志格式。在从 MySQL 5.7.5 或更高版本执行就地降级之前,使用 或的innodb_fast_shutdown设置执行干净关闭。使用缓慢关闭 是 In-Place Downgrade中推荐的步骤。01innodb_fast_shutdown=0MySQL 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 TABLEtbl_nameCOMPRESSION='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=mytagsyslog- 没有相应mysqld_safe选项的相关系统变量在降级后不能使用。
SQL 更改
一个触发器可以有触发事件(
INSERT,UPDATE,DELETE)和动作时间(BEFORE,AFTER)的不同组合的触发器,但在 MySQL 5.7.2 之前不能有多个具有相同触发事件和动作时间的触发器。MySQL 5.7.2 取消了这个限制,允许多个触发器。此更改对降级有影响。如果将支持多个触发器的服务器降级为不支持的旧版本,则降级会产生以下影响:
对于具有触发器的每个表,所有触发器定义都保留在
.TRG该表的文件中。但是,如果有多个触发器具有相同的触发事件和动作时间,则服务器在触发事件发生时只执行其中一个。有关.TRG文件的信息,请参阅 表触发器存储。如果在降级后添加或删除表的触发器,服务器将重写表的
.TRG文件。重写的文件只保留每个触发事件和动作时间组合的触发;其他人都迷路了。
为避免这些问题,请在降级之前修改您的触发器。对于每个触发器事件和操作时间的组合都有多个触发器的每个表,将每个这样的触发器集转换为单个触发器,如下所示:
对于每个触发器,创建一个包含触发器中所有代码的存储例程。
NEW使用和访问的值可以OLD使用参数传递给例程。如果触发器需要来自代码的单个结果值,您可以将代码放在存储函数中并让函数返回该值。如果触发器需要来自代码的多个结果值,您可以将代码放在存储过程中并使用OUT参数返回值。删除表的所有触发器。
为调用刚刚创建的存储例程的表创建一个新触发器。因此,此触发器的效果与其替换的多个触发器相同。