在从MySQL 5.7降级之前,请阅读本节中的信息。有些项目可能需要在降级前采取行动。
系统表变更
在MySQL 5.7.13中,存储user@host字符串值的系统表列的长度增加了。在降级到以前的版本之前,请确保user@host的值没有超过以前的77个字符长度限制,并执行以下操作
mysql
系统表变更:修改mysql表。修改定义字符(77)CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ";修改mysql表。SET utf8 CHARACTER SET utf8_bin NOT NULL DEFAULT ";修改mysql表。(3) COLLATE utf8_bin NOT NULL DEFAULT ";修改mysql表。procs_priv MODIFY grant char(77) COLLATE utf8_bin NOT NULL DEFAULT ";
MySQL用户名的最大长度从16个字符增加到32个字符。在降级到以前的版本之前,请确保用户名的长度不超过16个字符,并执行以下操作
mysql
系统表变更:修改mysql表。修改User char(16) NOT NULL default ";修改mysql表。columns_priv MODIFY User char(16) NOT NULL default ";修改mysql表。user char(16) NOT NULL default ";ALTER TABLE mysql.db修改User char(16) NOT NULL default修改mysql表。procs_priv修改用户字符(16)
的
密码
的列mysql.user
在MySQL 5.7.6中删除了system表。所有凭据都存储在authentication_string
列,包括以前存储在密码
列。为了使mysql.user
表与以前版本兼容,在降级之前执行以下更改:修改mysql表。user ADD密码char(41)字符集latin1 collate latin1_bin NOT NULL default " AFTER user;更新mysql。WHERE LENGTH(authentication_string) = 41 AND plugin = 'mysql_native_password';更新mysql。user SET authentication_string = " WHERE LENGTH(authentication_string) = 41 AND plugin = 'mysql_native_password';
的
help_ *
而且time_zone *
系统表从MyISAM
来InnoDB
MySQL 5.7.5。在降级到以前的版本之前,将每个受影响的表更改回MyISAM
通过运行以下语句:修改mysql表。help_category ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;修改mysql表。help_keyword ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;修改mysql表。help_relation ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;修改mysql表。help_topic ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;修改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
系统表从MyISAM
来InnoDB
MySQL 5.7.6。在降级到以前的版本之前,将每个受影响的表更改回MyISAM
通过运行以下语句:修改mysql表。插件ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT; ALTER TABLE mysql.servers ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
的定义
插件
中的列。mysql.user
系统表在MySQL 5.7中有所不同。在降级到5.6.23及更高版本的MySQL 5.6服务器之前,请修改插件
列定义使用以下语句:修改mysql表。user MODIFY plugin CHAR(64) COLLATE utf8_bin DEFAULT 'mysql_native_password';
在降级到MySQL 5.6.22或更老版本服务器之前,请修改
插件
列定义使用以下语句:修改mysql表。user MODIFY plugin CHAR(64) COLLATE utf8_bin DEFAULT ";
从MySQL 5.7.7开始,
sys
在安装数据目录时,默认安装模式。在降级到以前的版本之前,建议您删除sys
模式:DROP DATABASE sys;
的版本,则降级到包含
sys
模式,mysql_upgrade再现了sys
兼容形式的模式。的sys
schema不包含在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文件中不匹配日志序列号y
在ib_logfiles中.如果遇到此消息,请重新启动MySQL 5.6。无效的消息将不再出现。为了简化
InnoDB
MySQL 5.7.5引入了新的重做日志记录类型。这种增强改变了重做日志的格式。在执行从MySQL 5.7.5或更高版本的原位降级之前,使用innodb_fast_shutdown
设置0
或1
.使用慢速关机innodb_fast_shutdown = 0
是否有推荐的步骤就地降级.MySQL 5.7.8和5.7.9 undo日志可能包含空间列的信息不足(Bug #21508582)。在执行从MySQL 5.7.10或更高版本到MySQL 5.7.9或更早版本的原位降级之前,请使用
innodb_fast_shutdown = 0
清除undo日志。使用慢速关机innodb_fast_shutdown = 0
是否有推荐的步骤就地降级.MySQL 5.7.8 undo日志可能包含关于虚拟列和虚拟列索引的信息不足(Bug #21869656)。在执行从MySQL 5.7.9或更高版本到MySQL 5.7.8或更早版本的原位降级之前,使用
innodb_fast_shutdown = 0
清除undo日志。使用慢速关机innodb_fast_shutdown = 0
是否有推荐的步骤就地降级.从MySQL 5.7.9开始,第一个重做日志文件的重做日志头(
ib_logfile0
)包含一个格式版本标识符和一个文本字符串,用来标识创建重做日志文件的MySQL版本。这种增强改变了重做日志的格式。为了防止旧版本的MySQL在MySQL 5.7.9或更高版本创建的重做日志文件上启动,修改了重做日志检查点页面的校验和。因此,你必须缓慢地关闭MySQL(使用innodb_fast_shutdown=0),并删除重做日志文件(使用innodb_fast_shutdown=0)ib_logfile *
文件),然后执行就地降级。使用慢速关机innodb_fast_shutdown = 0
删除重做日志文件是建议的步骤就地降级.控件使用的新压缩版本
InnoDB
MySQL 5.7.32增加了页面压缩功能。新的压缩版本与以前的MySQL版本不兼容。在MySQL 5.7.32或更高版本中创建一个页面压缩表,并在降级到MySQL 5.7.32之前的版本后访问表会导致失败。作为一种解决方法,在降级之前解压这些表。要解压缩一个表,执行ALTER TABLE
而且tbl_name
压缩= '没有'优化表
.有关InnoDB
页面压缩功能,请参见章节14.9.2,“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的变化
触发器可以有用于不同触发事件组合的触发器(
插入
,更新
,删除
)和行动时间(之前
,后
),但在MySQL 5.7.2之前不能有多个触发器,这些触发器具有相同的触发器事件和动作时间。MySQL 5.7.2取消了这个限制,允许多个触发器。这一变化对降级有影响。如果您将支持多个触发器的服务器降级为不支持多个触发器的旧版本,则降级会产生以下影响:
对于具有触发器的每个表,所有触发器定义都保留在
.TRG
表的文件。但是,如果有多个触发器具有相同的触发器事件和操作时间,则当触发器事件发生时,服务器只执行其中一个触发器。有关.TRG
文件,请参阅表触发存储.如果在降级之后添加或删除了表的触发器,服务器将重写表的触发器
.TRG
文件。重写后的文件在每个触发事件和动作时间的组合中只保留一个触发器;其他的都丢了。
要避免这些问题,请在降级之前修改触发器。对于每个触发器事件和动作时间组合都有多个触发器的表,将每一组触发器转换为单个触发器,如下所示:
对于每个触发器,创建一个存储的例程,其中包含触发器中的所有代码。使用
新
而且老
可以使用参数传递给例程。如果触发器需要来自代码的单个结果值,则可以将代码放在存储函数中,并让函数返回该值。如果触发器需要代码中的多个结果值,则可以将代码放在存储过程中,并使用返回值出
参数。删除表的所有触发器。
为调用刚刚创建的存储例程的表创建一个新触发器。因此,此触发器的效果与它所替代的多个触发器相同。