官方文档
https://dev.mysql.com/doc/refman/5.7/en/downgrading-to-previous-series.html
参考链接
https://blog.csdn.net/weixin_45262858/article/details/105804279
1、升级前全备
MySQL 8.0 开始已经不支持降级
/data/app/mysql5728/bin/mysqladmin -S /tmp/3307.sock shutdowncp -a /data/3307/data /data/3307/data.bak
2、系统表处理
- 系统表变更
- InnoDB的变化
- 记录变更
- SQL变更 (开发介入)
2.1、系统表变更
sql_mode 设置向下兼容
由于 5.7.13版本开始, 用户的增长了定义长度。降级时, 需要将长度调整为低版本兼容的长度 (77字符)#会话级别 mysql> set sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' ; #全局级别 mysql> set global sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' ; #查询sql_mode限制规则 (如果一个都没有, 则表示兼容最低版本) mysql> select @@sql_mode;
5.7.8版本之后, 在授权表中user列的长度需要从16调整为32字符。所以降级到5.7.8更低的版本, 需要调整位16长度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 '';
在 5.7.6版本以后, user 表中 password 字段 已经取消, 被替换为了 authentication_string 列。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;
如果降级, 需要替换回来
在5.7.5 版本之后, 会将一些系统表的存储引擎从MyISAM替换为InnoDB。要降级的话,需要替换回来 ``` 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;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';
ALTER TABLE mysql.plugin ENGINE=’MyISAM’ STATS_PERSISTENT=DEFAULT; ALTER TABLE mysql.servers ENGINE=’MyISAM’ STATS_PERSISTENT=DEFAULT;
在 5.7 之后 plungin列, 字符长度需要调整会原来状态
ALTER TABLE mysql.user MODIFY plugin CHAR(64) COLLATE utf8_bin DEFAULT ‘mysql_native_password’;
~~在降级为MySQL 5.6.22服务器或更早版本之前,请plugin使用以下语句更改列定义~~<br />当前环境版本为 MySQL 5648, 不需要更改
ALTER TABLE mysql.user MODIFY plugin CHAR(64) COLLATE utf8_bin DEFAULT ‘’;
5.7.7 版本之后有了sys库, 降级之前要删除掉
DROP DATABASE sys;
<a name="SBETb"></a>
## 2.2. InnoDB的变化
5.7.5版本之后, ib_logfile日志文件和5.6不兼容, 降级时, 需要将这些文件删除, 5.6重新生成<br />确保ib_logfile文件不再被使用
设置innodb_fast_shutdown=0, ib_logfile日志文件为失效状态
set global innodb_fast_shutdown=0 ;
退出重连 quit, 参数生效
/data/app/mysql57/bin/mysql -uroot -p -h localhost -P 3307 -S /tmp/mysql.sock
查询值是否为0, 失效状态
mysql> select @@innodb_fast_shutdown; +————————————+ | @@innodb_fast_shutdown | +————————————+ | 0 | +————————————+
关闭数据库
优雅关闭, 不可使用kill
mysql> shutdown;
删除ib_logfile
rm -rf /data/3307/data/ib_logfile*
修改日志记录方式
vim /data/3307/my.cnf
添加
[mysqld_safe] syslog syslog-tag=mytag
将mysql5.7 改为 mysql 5.6路径
basedir=/data/app/mysql5728 #改为 basedir=/data/app/mysql5648
<a name="G5Vet"></a>
## 2.3. 低版本软件启动降级后库
/data/app/mysql56/bin/mysqld_safe —defaults-file=/data/3307/my.cnf & ```
