官方文档
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 开始已经不支持降级

  1. /data/app/mysql5728/bin/mysqladmin -S /tmp/3307.sock shutdown
  2. cp -a /data/3307/data /data/3307/data.bak

2、系统表处理

  • 系统表变更
  • InnoDB的变化
  • 记录变更
  • SQL变更 (开发介入)

    2.1、系统表变更

    sql_mode 设置向下兼容
    #会话级别
    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.13版本开始, 用户的增长了定义长度。降级时, 需要将长度调整为低版本兼容的长度 (77字符)
    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.8版本之后, 在授权表中user列的长度需要从16调整为32字符。所以降级到5.7.8更低的版本, 需要调整位16长度
    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.6版本以后, user 表中 password 字段 已经取消, 被替换为了 authentication_string 列。
    如果降级, 需要替换回来
    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';
    
    在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.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 & ```