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