MySQL 数据库跨版本降级

降级:操作前将数据库先备份

一、降级注意事项

1、inplace降级只支持同一个发布版G中的A版本

2、5.7降级到5.6只能使用logical模式

3、不支持跨多版本降级

二、8.0版本之前降级

(一)、5.7.28降级到5.7.10(inplace)

1. 安装 5.7.10 (低) 二进制版本

2. 针对5728版本(高)进行处理工作

set sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' ;
set global sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' ;
select @@sql_mode;                              
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 '';

3. 优雅的关闭5.7.28

数据库内执行:

set global innodb_fast_shutdown=0 ;

4. 删除redo日志文件(ib_logfile* )

rm -rf /data/3306/data/ib_logfile*

5. 替换配置文件、环境变量 (替换成低版本)

[mysqld]
user=mysql
basedir=/data/app/mysql5710
#basedir=/data/app/mysql56
datadir=/data/3306/data
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock

vim /etc/profile

export PATH=/data/app/mysql5710/bin:$PATH
source /etc/profile
mysql -V

6. 修改启动脚本,启动数据库

vim /etc/systemd/system/mysqld3308.service

ExecStart=/data/app/mysql5710/bin/mysqld --defaults-file=/data/3308/my.cnf

systemctl daemon-reload
systemctl start mysqld3308.service

7. 检查降级后系统表状态

mysql_upgrade --force 

(二)、5.7.28降级到5.6.46(logical)

第一步:降级前准备

安装低版本软件

初始化低版本示例

启动登录低版本数据库

第二步:系统表处理

1、调整sql_mode,设置为向下兼容

set sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' ;
set global sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' ;
select @@sql_mode;

2.由于 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 '';

3.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;

4.在 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.在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;

6.在 5.7 之后 plungin列,

字符长度需要调整会原来状态

ALTER TABLE mysql.user MODIFY plugin CHAR(64) COLLATE utf8_bin
DEFAULT 'mysql_native_password';

7.5.7.7 版本之后有了sys库,降级之前要删除掉

DROP DATABASE sys;

第三步:逻辑备份5.7.28数据

mysqldump -A >/tmp/full.sql

第四步:初始化一套5.6.46的空环境

vim /etc/profile

export PATH=/data/app/mysql56/bin:$PATH

source /etc/profile
mv /etc/my.cnf /etc/my.cnf.bak
rm -rf /data/3316/data/*
/data/app/mysql56/scripts/mysql_install_db  --user=mysql --basedir=/data/app/mysql56 --datadir=/data/3316/data
systemctl start mysqld3316

恢复备份数据到5.6.46中

mysql -S /tmp/mysql3316.sock 
mysql> source /tmp/full.sql

 

posted @ 2021-11-04 15:43  VicLW  阅读(691)  评论(0编辑  收藏  举报