1 MySQL5.6 升级到 5.7 版本

目前未在生产环境中升级过数据库版本, 倒是在测试环境跟开发环境升级过

可以通过 mysqldump sql 文件进行升级, 也可以通过 mysql_upgrade 升级, 前者耗时较长, 且需要足够量的磁盘空间, 本文暂不讨论, 升级使用 mysql_upgrade 方式

如果是线上环境升级, 常规来说分为以下几个步骤:

从库先升级

业务迁移, 从库上若有只读业务或者其他, 迁移到其他 DB 实例

从库备份

从库停止复制

升级

从库恢复复制 (升级后主库仍是 5.6 版本, 从库是 5.7 版本, 注意是否有异常)

主从恢复正常

主从切换

新从库升级

新从库停止复制

新从库备份

升级

新从库恢复复制

主从恢复正常

恢复相关业务

本文主要记录升级的详细步骤主库 5.6 从库 5.7 有哪些问题以及如何从传统模式转变为 GTID 模式

升级步骤简要如下:

安装新版本 mysql, 从库服务器安装 5.7 版本 mysql

修改安装目录配置参数, 修改从库的 mysql 配置文件, 把 mysql 安装目录修改为 5.7 版本的安装目录

关闭从库 mysql 服务

新版本 mysql 启动实例, 使用 5.7 版本 mysql 启动待升级实例

升级字典, 使用 mysql_upgrade 升级字典

检查, 查看 mysql log 日志#1 安装新版本 mysql

## 下载 mysql5.7.17, 拷贝到 server 下的 / opt 文件目录下

## 解压, 创建软连接, 授权

tar zvxf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

ln-s/opt/mysql-5.7.17-linux-glibc2.5-x86_64/usr/local/mysql57

chown-R mysql:mysql/usr/data/mysql57

#2 修改配置参数

## 检查配置文件中那些配置是使用到了 安装目录, 把使用到底都修改

旧:basedir=/usr/local/mysql56

plugin-dir=/usr/local/mysql56/lib/plugin/

新:basedir=/usr/local/mysql

plugin-dir=/usr/local/mysql/lib/plugin/

#3 关闭 mysql

[root@sutest244 mysqlup]#/usr/local/mysql56/bin/mysqladmin--socket=/tmp/mysql3399.sock-uroot-p shutdown

Enterpassword:

[root@sutest244 mysqlup]#ps axu|grep mysql3399|grep mysqld

[root@sutest244 mysqlup]#

#4 新版本启动 mysql

[root@sutest244 mysqlup]#/usr/local/mysql/bin/mysqld--defaults-file=/data/mysqlup/mysql3399.cnf&

[1]15477

[root@sutest244 mysqlup]#ps axu|grep mysql3399|grep mysqld

mysql1547737.126.7119316721037520pts/4Sl03:340:05/usr/local/mysql/bin/mysqld--defaults-file=/data/mysqlup/mysql3399.cnf

[root@sutest244 mysqlup]#

[root@sutest244 mysqlup]#vim/data/mysqlup/data/error.log

#4.1 检查

检查启动后的错误日志, 看下是否有配置参数报错, 如果有, 修改

错误日志会有大量的字典信息报错, 这个暂不处理, 下个步骤修复#5 升级字典

[root@sutest244 bin]#/usr/local/mysql/bin/mysql_upgrade--socket=/tmp/mysql3399.sock-uroot-p

Enterpassword:

Checkingifupdateisneeded.

Checkingserver version.

Runningqueries to upgradeMySQLserver.

Checkingsystem database.

mysql.columns_priv OK

mysql.db OK

mysql.engine_cost OK

mysql.eventOK

mysql.func OK

mysql.general_log OK

mysql.gtid_executed OK

mysql.help_category OK

mysql.help_keyword OK

mysql.help_relation OK

mysql.help_topic OK

mysql.innodb_index_stats OK

mysql.innodb_table_stats OK

mysql.ndb_binlog_index OK

mysql.plugin OK

mysql.proc OK

mysql.procs_priv OK

mysql.proxies_priv OK

mysql.server_cost OK

mysql.servers OK

mysql.slave_master_info OK

mysql.slave_relay_log_info OK

mysql.slave_worker_info OK

mysql.slow_log OK

mysql.tables_priv OK

mysql.time_zone OK

mysql.time_zone_leap_second OK

mysql.time_zone_name OK

mysql.time_zone_transition OK

mysql.time_zone_transition_type OK

mysql.user OK

Upgradingthe sys schema.

Checkingdatabases.

sys.sys_config OK

省略...

检查用户数据库及表格

省略...Upgradeprocess completed successfully.

Checkingifupdateisneeded.

#6 检查日志

查看 log 日志正常

2 主库 5.6 从库 5.7 存在问题

由于从库是 5.7 版本, mysqlperformancesys 等一些系统数据库对象有发生变化, 同时一些 SQL 也有所变动

2.1 修改用户密码失败

1). 问题

主库修改用户密码, update mysql.user set password=password('newpasswd') where ...2018-03-29T01:22:45.058927Z12[ERROR]SlaveSQLforchannel'':Column1of table'mysql.user'cannot be convertedfromtype'char(16)'to type'char(32)',Error_code:1677

2018-03-29T01:22:45.059066Z12[ERROR]Errorrunning query,slave SQL thread aborted.Fixthe problem,andrestart the slave SQL threadwith"SLAVE START".Westopped at log'bin_log.000003'position3208

2). 分析

修改导致从库复制异常停止, 因为 5.6 版本 mysql.user 表格的 password 字段, 在 5.7 没有该字段, 修改为 authentication_string

3). 处理

方案 1: 事先处理, 执行 update password 的前, 配置会话不记录 binlog:set session sql_log_bin=off, 然后单独到主从执行该 SQL

方案 2: 事后处理, 如果已经出现这个错误, 则在从库跳过该 sql 然后再开启复制同步, 最后从库修改密码setglobalsql_slave_skip_counter=1;

start slave sql_thread;

show slave status;

setsession sql_log_bin=off;

alter user suuser@'%'identifiedby'newpassword';

flush privileges;

setsession sql_log_bin=on;

2.2 SQL 语法问题

1). 问题

SELECT 字段超过 GROUP BY 字段报错

select id,name,age,count(*) from tbuser group by name;

其他一些 SQL 语法问题

2). 分析

5.7 跟 5.6 默认的 sql_mode 配置不一样, 如果 mysql 配置文件中没有说明 sql_mode, 升级后 sql_mode 将从 NO_ENGINE_SUBSTITUTION 修改为 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION, 该模式下会导致部分在 5.6 支持的 SQL 在 5.7 报语法错误

3). 处理

方案 1: 事先处理, 在测试环境中, 详细测试程序代码在新版本数据库上的兼容性, 若有异常, 则修复程序代码中的 SQL 操作逻辑

方案 2: 事先处理, mysql 配置文件中, 指定 sql_mode 与 5.6 版本一致

方案 3: 事后处理, 如果已经在出现这个错误, 有需要快速响应处理, 可以把 sql_mode 修改为跟 5.6 版本默认的 sql_mode 一致即可

3 切换 GTID 模式

3.1 何为 GTID

Global Transaction ID, 全局唯一标识, 简称 GTID, 一个 GTID 代表在 某个实例上发生的一个事务

GTID = source_id:transaction_id, 其中 source_id 代表执行该事务的实例的 server_uuid,transaction_id 是自增值, 从 1 开始, 故 GTID 实际表示为: 在 source_id 实例上面发生的 第 transaction_id 个事务

3.2 GTID 相关配置参数ENFORCE_GTID_CONSISTENCY

warn

如果出现 GTID 不兼容的语句用法, 在错误日志会记录相关信息, 那么需要调整应该程序避免不兼容的写法, 直到完全没有产生不兼容的语句, 可以通过应该程序去排查所有的 sql, 也可以设置后观察错误日志一段时间, 这一步非常重要

on

启动强制 GTID 一致性

GTID_MODE

说明

OFF

新事务是非 GTID, Slave 只接受不带 GTID 的事务, 传送来 GTID 的事务会报错

OFF_PERMISSIVE

新事务是非 GTID, Slave 只接受不带 GTID 的事务也接受带 GTID 的事务

ON_PERMISSIVE

新事务是 GTID, Slave 只接受不带 GTID 的事务也接受带 GTID 的事务

ON

新事务是 GTID, Slave 只接受带 GTID 的事务

切换顺序

需要严格按照以下顺序, 不可跳跃

OFF <= => OFF_PERMISSIVE <= => ON_PERMISSIVE <= => ON

3.3 传统复制切换 GTID 复制#step 1

# 修改 ENFORCE_GTID_CONSISTENCY 为 warn , 运行一段时间, 检查错误日志里边是否存在于 GTID 不兼容的语句用法, 并尽快修复

# 主从都执行, 先后顺序不要求

set@@global.enforce_gtid_consistency=warn;

#step 2

# 修改 ENFORCE_GTID_CONSISTENCY 为 on , 确定没有不兼容语法后, 可以修改为 ON

# 主从都执行, 先后顺序不要求

set@@global.enforce_gtid_consistency=on;

#step 3

# 设置 GTID_MODE 为 off_permissiv

# 主从都执行, 先后顺序不要求

SET@@GLOBAL.GTID_MODE=OFF_PERMISSIVE;

#step 4

# 设置 GTID_MODE 为 off_permissiv=on_permissiv

# 主从都执行, 先后顺序不要求

SET@@GLOBAL.GTID_MODE=ON_PERMISSIVE;

#step 5

# 检查全部实例 正在进行的匿名交易数目, 也就是非 GTID 事务有没有都传送到从库上了, 需要等到这个变量为 0 才是可以进行下面操作

# 主从都执行, 先后顺序不要求

SHOW STATUS LIKE'ONGOING_ANONYMOUS_TRANSACTION_COUNT';

#step 6

# 检查所有实例上面的 slave 的非 GTID 是否都执行完了

show master status;#取file跟pos到从库去执行查看

SELECT MASTER_POS_WAIT('bin_log.000003',88748605);#返回结果大于等于 0 则说明事务已经完全复制完成

#step 7

# 清理 binlog, 切换到新的 binlog 上面

# 主从都执行, 先后顺序不要求

flush logs;

#step8

# 启动 GTID

# 主从都执行, 先后顺序不要求

SET@@GLOBAL.GTID_MODE=ON;

#step 9

# 修改 cnf 文件

# 主从都执行, 先后顺序不要求

gtid_mode=on

enforce-gtid-consistency=on

binlog_gtid_simple_recovery=1

3.4 GTID 复制切换传统复制#step 1

# 停止从库

# 所有从库都执行, 先后顺序不要求

stop slave;

#step 2

# 重置 chanage master to 语句, 关闭 master_auto_position

# 所有从库都执行, 先后顺序不要求

show slave status \G;#取 sql_thread 的 file 跟 position 位置, Relay_Master_Log_File Exec_Master_Log_Pos

change master to master_log_file='mysql-bin.000003',master_log_pos=4563,master_auto_position=0;

#step 3

# 测试同步是否正常

# 主库对数据进行操作, 看从库的 position 有没有变化, 同时看数据是否变更

#step 4

# 修改 GTID_MODE 为 ON_PERMISSIVE

# 主从都执行

SET@@GLOBAL.GTID_MODE=ON_PERMISSIVE;

#step 5

# 修改 GTID_MODE 为 OFF_PERMISSIVE

# 主从都执行

SET@@GLOBAL.GTID_MODE=OFF_PERMISSIVE;

#step 6

# 修改 GTID_MODE 为 OFF

# 主从都执行

SET@@GLOBAL.GTID_MODE=OFF;

#step 7

# 清理 binlog, 切换到新的 binlog 上面

# 主从都执行, 先后顺序不要求

flush logs;

#step8

# 禁用 GTID, 其中 enforce-gtid-consistency 可以不关闭, 还是进行 GTID 的一致性检查

# 主从都执行, 先后顺序不要求

SET@@GLOBAL.GTID_MODE=OFF;

#step9

# 检验同步情况

#10

# 修改 cnf 文件, 注释 GTID 的参数

# 主从都执行, 先后顺序不要求

#gtid_mode=on

#enforce-gtid-consistency=on

#binlog_gtid_simple_recovery=1

来源: https://www.cnblogs.com/xinysu/p/8675286.html

mysql5.1.7升级到5.6_1 MySQL5.6 升级到 5.7 版本相关推荐

  1. mysql4.0升级_再遇MySQL4.0升级到MySQL5.1的时候

    已经好久没搞过MySQL4.0升级到MySQL4.1/MySQL5.0/MySQL5.1的操作了.昨天晚上一个朋友的服务器有几个数据库需要做这样的操作. 冷不丁再遇到这样的情况的确有点楞,不过好在之前 ...

  2. mysql5.6.24配置日志_windows下mysql5.6.x的日志正确配置方法(my.ini) (网上的都是5.6之前的版本)...

    感谢楼主,找了好久,试了一下楼主的,果然是对的,网上的日志配置都是5.6之前的版本: 对于版本5.6.21 可行 加入: [mysqld] #log #错误日志 log-error=D:/Progra ...

  3. 阿里云安装mysql5.7_同一服务器上二进制安装mysql5.7和mysql5.6

    一.二进制包与源码包的区别 二进制包和源码包是软件包的两种形式.源码包里面包含程序原始的代码,需要在计算机上进行编译后才可以产生可运行程序,所以源码安装时间会比较长:而二进制包里面包含已经编译过.可马 ...

  4. Centos7 卸载mysql5.7详细步骤,Linux删除Mysql5.7详细操作

    ================================ ©Copyright 蕃薯耀 2021-12-30 ​​蕃薯耀的博客_CSDN博客 一.查看有没有安装Mysql 1.yum 安装方式 ...

  5. oracle 云服务器cpu升级,Oracle 10g RAC 升级(CPU Update)之--升级CRS

    Oracle 10g RAC 升级(CPU Update)之--升级CRS 发布时间:2020-07-16 09:13:19 来源:51CTO 阅读:593 作者:客居天涯 Oracle 10g RA ...

  6. centos7 python3.6升级到3.7_Centos7下把python 2.7升级到python 3.6(升级过程遇到的一些相关问题)...

    Centos 7 默认安装的Python 的版本是2.7的,现在不少人用的是3.x上的版本,故而需要了解下如何从Python2.7升级到Python 3.6. 在虚拟机安装时,网络不通会先遇到一个错误 ...

  7. zookeeper平滑升级_zookeeper从3.4.8升级到3.4.14

    升级背景说明: 最近在做系统安全扫描时,扫出来zookeeper存在安全漏洞 Apache Zookeeper 缓冲区溢出漏洞(CVE-2016-5017) 官方给出的升级建议: 地址:https:/ ...

  8. 服务器升级中不能修改信息,服务器升级页面

    服务器升级页面 内容精选 换一换 请使用Mind Studio的安装用户进行升级操作,在升级前请先登录到后台服务器,切换到root用户在/usr/bin目录下执行./add_sudo.sh usern ...

  9. 手环升级鸿蒙设备名单,鸿蒙2.0升级名单已确认-可首批升级的42款机型推荐

    原标题:鸿蒙2.0升级名单已确认-可首批升级的42款机型推荐 鸿蒙系统2.0已确认有42款机型可以首批升级,比安卓快60%,那么鸿蒙系统2.0已确认的升级机型都有哪些?不少小伙伴们还不是很了解,小编为 ...

最新文章

  1. SPSiteManager 2.3可以下载了
  2. Codeforces Round #481 (Div. 3)【完结】
  3. 在Android初次的前期学习中的二个小例子(2)
  4. 哈啰单车突发网络故障 网友上班迟到狂吐槽
  5. XenApp/XenDesktop 7.11 对于HDX 3D pro的2点增强
  6. 存储ic载板_【行业亮点】看好载板供不应求趋势,深南/兴森/越亚积极布局
  7. PHP直播聊天室源码/财经直播源码/房间多开/游客互动/聊天审核
  8. 蓝桥杯官网题库【简单题解析】持续更新
  9. 国产全志T3+Logos FPGA开发板(4核ARM Cortex-A7)规格书
  10. 类的加载、连接和初始化
  11. 在wamp使用tp5框架开发,连接数据库
  12. 安科瑞ACX电瓶车智能充电桩,支付方式可选择刷卡、扫码、免费充电使用,设备内部可引出10路出线至专用插座
  13. 0.96OLED图标取模,包括信号图标,蓝牙图标,闹钟,电池
  14. 计算数据集的均值、方差
  15. 【复杂句的逻辑练习题】规则变化的过去分词
  16. Solaris 11中配置基于link的IPMP
  17. PDF无法打印 提示输入文件名
  18. JavaScript之JSON
  19. VScode软件入门:用户自定义代码块+常用快捷键+常用扩展插件
  20. java三角形有关面积及周长的计算

热门文章

  1. 多Kinect下WaitNoneUpdateAll老是报错,烦躁……
  2. (2) 第二章 WCF服务与数据契约 服务契约详解(三)- [ServiceContract]特性
  3. C#将图片白色背景设置为透明
  4. 【会议】2009-11-13
  5. 实战干货!Spring Cloud Gateway 整合 OAuth2.0 实现分布式统一认证授权!
  6. 成就架构师,到底是怎样的一种体验?
  7. 漫话:如何给女朋友解释什么是BIO、NIO和AIO?
  8. 阿里云MVP:如何设计实现一个通用的微服务架构?
  9. Myeclipse8.5 反编译插件 jad 安装
  10. Appfuse2学习笔记--GzipFilter的应用