1.在另外一台主机上安装MySQL5.6.46
见不同版本多实例MySQL5.6.46部署过程
/data/app/mysql56
2.处理5.7.28高版本数据
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;
+-------------------------------------------------------------------------------------------+
| @@sql_mode |
+-------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
由于 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';
5.7.7 版本之后有了sys库,降级之前要删除掉。
drop database sys;
3. 逻辑备份5.7.28数据
[root@db01 ~]# mysqldump -A >/tmp/full.sql
4. 初始化一套5.6.46的空环境
[root@db01 ~]# vim /etc/profile
export PATH=/data/app/mysql56/bin:$PATH
[root@db01 ~]# source /etc/profile
[root@db01 ~]# mysql -V
mysql Ver 14.14 Distrib 5.6.46, for linux-glibc2.12 (x86_64) using EditLine wrapper
[root@db01 ~]# mv /etc/my.cnf /etc/my.cnf.bak
mv: overwrite ‘/etc/my.cnf.bak’? y
[root@db01 data]# rm -rf /data/3316/data/*
[root@db01 data]# /data/app/mysql56/scripts/mysql_install_db --user=mysql --basedir=/data/app/mysql56 --datadir=/data/3316/data
[root@db01 data]# systemctl start mysqld3316
5. 恢复备份数据到5.6.46中
[root@db01 data]# mysql -S /tmp/mysql3316.sock
mysql> source /tmp/full.sql