降级MySQL(参考MySQL官方文档)
降级MySQL(参考MySQL官方文档)
介绍降级MySQL安装的步骤。
降级比升级更不常见。降级通常是由于生产系统上发生兼容性或性能问题而执行,并且在测试系统的初始升级验证期间没有发现。
与升级过程一样,在生产系统上使用降级过程之前,请先在某些测试系统上执行并验证它。
注意
在下面的讨论中,必须使用具有管理权限的MySQL帐户运行的MySQL命令,在命令行中包含-u root以指定MySQL root用户。需要root用户密码的命令还包括-p选项。
可以使用mysql命令行(connect as root)执行SQL语句以确保您拥有必要的权限)。
一、开始之前
•通过备份保护数据。备份应该包括mysql数据库,其中包含mysql系统表。
注意
以下各节中描述的降级过程假设正在使用由较新MySQL版本创建或修改的数据文件进行降级。但是,如果升级后没有修改数据,建议使用升级到新MySQL版本之前所做的备份来降级。
二、降级路径
•只有在一般可用性(GA)版本之间才支持降级。
•使用逻辑降级方法支持从MySQL 5.7降级到5.6。
•不支持跳过版本的降级。例如,直接从MySQL 5.7降级到5.5。
•支持在发布系列中降级。例如,支持从MySQL 5.7.z降级到5.7.y。还支持跳过发布。例如,支持将MySQL 5.7.z降级为5.7.x。
三、降级注意
在从MySQL 5.7降级之前,请查看本节中的信息。有些项目可能需要在降级前采取行动。
1> 系统表更改
•在MySQL 5.7.13中,存储user@host字符串值的系统表列的长度增加了。在降级到以前的版本之前,请确保没有超过以前77个字符长度限制的user@host值,并执行以下mysql系统表更改:
1 ALTER TABLE mysql.proc MODIFY definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ''; 2 ALTER TABLE mysql.event MODIFY definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ''; 3 ALTER TABLE mysql.tables_priv MODIFY Grantor char(77) COLLATE utf8_bin NOT NULL DEFAULT ''; 4 ALTER TABLE mysql.procs_priv MODIFY Grantor char(77) COLLATE utf8_bin NOT NULL DEFAULT '';
•在MySQL 5.7.8中,MySQL用户名的最大长度从16个字符增加到32个字符。在降级到以前的版本之前,请确保用户名的长度不超过16个字符,并执行以下mysql系统表更改:
1 ALTER TABLE mysql.tables_priv MODIFY User char(16) NOT NULL default ''; 2 ALTER TABLE mysql.columns_priv MODIFY User char(16) NOT NULL default ''; 3 ALTER TABLE mysql.user MODIFY User char(16) NOT NULL default ''; 4 ALTER TABLE mysql.db MODIFY User char(16) NOT NULL default ''; 5 ALTER TABLE mysql.procs_priv MODIFY User char(16) binary DEFAULT '' NOT NULL;
•mysql 5.7.6中删除了mysql.user系统表的Password列。所有凭据都存储在“身份验证字符串”列中,包括以前存储在“密码”列中的凭据。要使mysql.user表与早期版本兼容,请在降级之前执行以下更改:
1 ALTER TABLE mysql.user ADD Password char(41) character set latin1 2 collate latin1_bin NOT NULL default '' AFTER user; 3 UPDATE mysql.user SET password = authentication_string WHERE 4 LENGTH(authentication_string) = 41 AND plugin = 'mysql_native_password'; 5 UPDATE mysql.user SET authentication_string = '' WHERE 6 LENGTH(authentication_string) = 41 AND plugin = 'mysql_native_password';
•在MySQL 5.7.5中,帮助表和时区表从MyISAM更改为InnoDB。在降级到以前的版本之前,请通过运行以下语句将每个受影响的表更改回MyISAM:
1 ALTER TABLE mysql.help_category ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT; 2 ALTER TABLE mysql.help_keyword ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT; 3 ALTER TABLE mysql.help_relation ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT; 4 ALTER TABLE mysql.help_topic ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT; 5 ALTER TABLE mysql.time_zone ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT; 6 ALTER TABLE mysql.time_zone_leap_second ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT; 7 ALTER TABLE mysql.time_zone_name ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT; 8 ALTER TABLE mysql.time_zone_transition ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT; 9 ALTER TABLE mysql.time_zone_transition_type ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
•在MySQL 5.7.6中,plugin和servers系统表从MyISAM更改为InnoDB。在降级到以前的版本之前,请通过运行以下语句将每个受影响的表更改回MyISAM:
1 ALTER TABLE mysql.plugin ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT; 2 ALTER TABLE mysql.servers ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;
•mysql.user系统表中plugin列的定义在mysql 5.7中有所不同。在降级到5.6.23及更高版本的MySQL 5.6服务器之前,请使用以下语句更改插件列定义:
1 ALTER TABLE mysql.user MODIFY plugin CHAR(64) COLLATE utf8_bin DEFAULT 'mysql_native_password';
在降级到MySQL 5.6.22服务器或更低版本之前,请使用以下语句更改插件列定义:
1 ALTER TABLE mysql.user MODIFY plugin CHAR(64) COLLATE utf8_bin DEFAULT '';
•从MySQL 5.7.7开始,sys模式默认在数据目录安装期间安装。在降级到以前的版本之前,建议您删除sys架构:
1 DROP DATABASE sys;
如果要降级到包含sys架构的版本,mysql_upgrade将重新创建sys兼容格式的架构。MySQL 5.6中不包含sys模式。
2> InnoDB变更
•从MySQL 5.7.5开始,FIL_PAGE_FLUSH_LSN字段写入每个InnoDB系统表空间文件的第一页和InnoDB undo表空间文件,只写入InnoDB系统表空间的第一个文件(页码0:0)。
因此,如果您有一个多文件系统表空间并决定要从MySQL 5.7降级到MySQL 5.6,在MySQL 5.6启动时可能会遇到一条无效消息,指出ibdata文件中的日志序列号x和y与ibu日志文件中的日志序列号y不匹配。
如果遇到此消息,请重新启动MySQL 5.6。无效消息不再出现。
•为了在崩溃恢复期间简化InnoDB表空间,MySQL 5.7.5引入了新的重做日志记录类型。此增强更改重做日志格式。从MySQL 5.7.5或更高版本执行in-place降级,使用innodb_fast_shutdown设置0或1执行完全关闭。
使用innodb_fast_shutdown=0缓慢关机是建议的in-place降级步骤。
•MySQL 5.7.8和5.7.9撤消日志可能包含有关空间列的信息不足(错误21508582)。在执行从MySQL 5.7.10或更高版本到MySQL 5.7.9或更早版本的in-place降级之前,使用innodb_fast_shutdown=0来清除撤消日志,
执行一个缓慢的关闭。使用innodb_fast_shutdown=0缓慢关机是建议的in-place降级步骤。
•MySQL 5.7.8撤消日志可能包含有关虚拟列和虚拟列索引的信息不足(错误21869656)。在执行从MySQL 5.7.9或更高版本到MySQL 5.7.8或更早版本的in-place降级之前,使用innodb_fast_shutdown=0来清除撤消日志,
执行一次慢速关闭。使用innodb_fast_shutdown=0缓慢关机是建议的in-place降级步骤。
•从MySQL 5.7.9开始,第一个重做日志文件(ib_logfile0)的重做日志头包含一个格式版本标识符和一个文本字符串,用于标识创建重做日志文件的MySQL版本。此增强更改重做日志格式。
为了防止旧版本的MySQL在MySQL 5.7.9或更高版本中创建的重做日志文件上启动,已更改重做日志检查点页面的校验和。因此,在执行就地降级之前,必须执行MySQL的慢速关闭(使用innodb_fast_shutdown=0),
并删除重做日志文件(ib_logfile*文件)。建议使用innodb_fast_shutdown=0缓慢关机并删除重做日志文件,以执行in-place降级。
3> 记录更改
•在MySQL 5.7.5及更高版本中,对将服务器错误日志发送到syslog的支持与旧版本不同。如果使用syslog并降级到早于5.7.5的版本,则必须停止使用相关的mysqld系统变量,
而是使用相应的mysqld_safe命令选项。假设通过在选项文件的[mysqld]组中设置这些系统变量来使用syslog:
要降级,请删除这些设置并在[mysqld_safe]选项文件组中添加选项设置:
降级后不能使用没有相应mysqld_safe选项的syslog相关系统变量。
4> SQL更改
•触发器可以具有触发器事件(INSERT、UPDATE、DELETE)和操作时间(BEFORE、AFTER)的不同组合,但MySQL 5.7.2之前不能有多个触发器具有相同的触发器事件和操作时间。
MySQL 5.7.2解除了这个限制,允许使用多个触发器。这一变化意味着降级。
•如果将支持多个触发器的服务器降级到不支持多个触发器的旧版本,则降级会产生以下效果:对于每个具有触发器的表,所有触发器定义都保留在该表的.TRG文件中。
但是,如果有多个触发器具有相同的触发器事件和操作时间,则服务器在触发器事件发生时仅执行其中一个触发器。
•如果在降级之后添加或删除了表的触发器,服务器将重写表的.TRG文件。重写后的文件在触发器事件和动作时间的组合中只保留一个触发器。
要避免这些问题,请在降级之前修改触发器。对于每个触发器事件和操作时间组合具有多个触发器的表,请按如下所示将每个这样的触发器集转换为单个触发器:
1.对于每个触发器,创建一个包含触发器中所有代码的存储过程。使用NEW和OLD访问的值可以使用参数传递给例程。如果触发器需要来自代码的单个结果值,则可以将代码放入存储的函数中,并让函数返回该值。
如果触发器需要来自代码的多个结果值,则可以将代码放入存储过程并使用OUT参数返回值。
2.删除表的所有触发器。
3.为调用刚创建的存储例程的表创建一个新触发器。此触发器的效果与它替换的多个触发器的效果相同。
四、在Unix/Linux上降级基于二进制和包的安装的MySQL
本节介绍如何在Unix/Linux上降级MySQL二进制和基于包的安装。描述了in-place和逻辑降级方法。
1> In-Place Downgrade
in-place降级涉及关闭新的MySQL版本,用旧的MySQL二进制文件或包替换旧的MySQL版本,并在现有的数据目录上重新启动旧的MySQL版本。
对于同一发布系列内的GA发布之间的降级,支持就地降级。MySQL APT、SLES和Yum存储库安装不支持就地降级。
注意
对于某些Linux平台,从RPM或Debian软件包安装MySQL包括用于管理MySQL服务器启动和关闭的systemd支持。在这些平台上,未安装mysqld_safe。
在这种情况下,请使用systemd来启动和关闭服务器,而不要使用以下说明中使用的方法。
执行in-place降级:
1.复习“开始前”中的信息。
2.如果在InnoDB中使用XA事务,在降级之前运行XA RECOVER以检查未提交的XA事务。如果返回结果,则通过发出XA commit或XA rollback语句来提交或回滚XA事务。
3.通过将innodb_fast_shutdown设置为0,将MySQL配置为执行慢速关闭。例如:
1 mysql -u root -p --execute="SET GLOBAL innodb_fast_shutdown=0"
在缓慢关闭的情况下,InnoDB会在关闭之前执行完全清除和更改缓冲区合并,以确保数据文件在不同版本之间的文件格式差异时完全准备好。
4.关闭更新的MySQL服务器。例如:
1 mysqladmin -u root -p shutdown
5.在缓慢关闭之后,从数据目录中删除InnoDB重做日志文件(ib_log file*文件),以避免与重做日志文件格式更改相关的降级问题,这些更改可能在两个版本之间发生。
rm ib_logfile*
6.通过将较新的二进制文件或包替换为较旧的二进制文件或包,将MySQL二进制文件或包降级。
7.使用旧的数据目录启动旧的(降级的)MySQL服务器。例如:
1 mysqld_safe --user=mysql --datadir=/path/to/existing-datadir
8.运行mysql_升级。例如:
1 mysql_upgrade -u root -p
mysql_upgrade检查所有数据库中的所有表是否与当前版本的mysql不兼容,如果发现问题,将尝试修复这些表。
9.关闭并重新启动MySQL服务器,以确保对系统表所做的任何更改生效。例如:
1 mysqladmin -u root -p shutdown 2 mysqld_safe --user=mysql --datadir=/path/to/existing-datadir
2> 逻辑降级
逻辑降级包括使用MySQL dump转储新MySQL版本中的所有表,然后将转储文件加载到旧MySQL版本中。
对于同一版本系列内的不同版本之间的降级以及降级到以前的版本级别,都支持逻辑降级。仅支持在一般可用性(GA)版本之间降级。
注意
对于某些Linux平台,从RPM或Debian软件包安装MySQL包括用于管理MySQL服务器启动和关闭的systemd支持。在这些平台上,未安装mysqld_safe。在这种情况下,请使用systemd来启动和关闭服务器,
执行逻辑降级:
1.复习“开始前”中的信息。
2.转储所有数据库。例如:
1 mysqldump -u root -p 2 --add-drop-table --routines --events 3 --all-databases --force > data-for-downgrade.sql
3.关闭更新的MySQL服务器。例如:
1 mysqladmin -u root -p shutdown
4. 要初始化MySQL 5.7实例,请使用mysqld和--initialize或--initialize-insecure选项。
1 mysqld --initialize --user=mysql
5.使用新的数据目录启动旧的MySQL服务器。例如:
1 mysqld_safe --user=mysql --datadir=/path/to/new-datadir
6.将转储文件加载到旧的MySQL服务器中。例如:
1 mysql -u root -p --force < data-for-upgrade.sql
7.运行mysql_升级。例如:
1 mysql_upgrade -u root -p
mysql_upgrade检查所有数据库中的所有表是否与当前版本的mysql不兼容,如果发现问题,将尝试修复这些表。
8.关闭并重新启动MySQL服务器,以确保对系统表所做的任何更改生效。例如:
1 mysqladmin -u root -p shutdown 2 mysqld_safe --user=mysql --datadir=/path/to/new-datadir
五、降级故障排除
如果从一个版本系列降级到另一个版本系列,则表存储格式中可能存在不兼容。在这种情况下,使用mysqldump在降级之前转储表。
降级后,使用mysql或mysqlimport重新加载转储文件以重新创建表。
降级时向下不兼容表格式更改的典型症状是无法打开表。在这种情况下,使用以下步骤:
1.停止降级到的旧MySQL服务器。
2.重新启动要降级的新MySQL服务器。
3.通过使用mysqldump创建转储文件,转储旧服务器无法访问的任何表。
4.停止较新的MySQL服务器并重新启动较旧的服务器。
5.将转储文件重新加载到较旧的服务器中。