• 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
  • 相关阅读:
    NPOIHelper
    NPOI.dll 用法:单元格、样式、字体、颜色、行高、宽度 读写excel
    SQL中的循环、for循环、游标
    .net mvc datatables中orderby动态排序
    MVC中给TextBoxFor设置默认值和属性
    定义实体系列-@JsonIgnoreProperties注解
    微信公众号登录与微信开放平台登录区别
    http-Post请求,Post Body中的数据量过大时出现的问题
    .net core Linux 安装部署
    二、微信公众号开发-获取微信用户信息(.net版)
  • 原文地址:https://www.cnblogs.com/VicLiu/p/15508463.html
Copyright © 2020-2023  润新知