MySQL升级-5.6升级到5.7版本&切换GTID模式
目前未在生产环境中升级过数据库版本,倒是在测试环境跟开发环境升级过。- 从库先升级
- 业务迁移,从库上若有只读业务或者其他,迁移到其他DB实例
- 从库备份
- 从库停止复制
- 升级
- 从库恢复复制(升级后主库仍是5.6版本,从库是5.7版本,注意是否有异常)
- 主从恢复正常
- 主从切换
- 新从库升级
- 新从库停止复制
- 新从库备份
- 升级
- 新从库恢复复制
- 主从恢复正常
- 恢复相关业务
1 MySQL5.6升级到5.7版本
- 安装新版本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
Enter password:
[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
mysql 15477 37.1 26.7 11931672 1037520 pts/4 Sl 03:34 0: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
Enter password:
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv OK
mysql.db OK
mysql.engine_cost OK
mysql.event OK
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
Upgrading the sys schema.
Checking databases.
sys.sys_config OK
省略...
检查用户数据库及表格
省略...
Upgrade process completed successfully.
Checking if update is needed. #6 检查日志
查看log日志正常。
2 主库5.6从库5.7存在问题
2.1 修改用户密码失败
- 2018-03-29T01:22:45.058927Z 12 [ERROR] Slave SQL for channel '': Column 1 of table 'mysql.user' cannot be converted from type 'char(16)' to type 'char(32)', Error_code: 1677
- 2018-03-29T01:22:45.059066Z 12 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'bin_log.000003' position 3208
- set global sql_slave_skip_counter=1;
- start slave sql_thread;
- show slave status;
- set session sql_log_bin=off;
- alter user suuser@'%' identified by 'newpassword';
- flush privileges;
- set session sql_log_bin=on;
2.2 SQL语法问题
- SELECT字段超过GROUP BY字段报错
- select id,name,age,count(*) from tbuser group by name;
- 其他一些SQL语法问题
3 切换GTID模式
3.1 何为GTID
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
MySQL升级-5.6升级到5.7版本&切换GTID模式的更多相关文章
- (5.12)mysql高可用系列——复制中的在线切换GTID模式/增加节点/删除节点
目录 [0]需求 前提,已经假设好基于传统异步复制的主库和从库1. [0.1]传统异步切换成基于GTID的无损模式 [0.2]增加特殊要求的从库 [1]操作环境 [2]构建 复制->半同步复制 ...
- MySQL传统点位复制在线转为GTID模式复制
1. GTID优缺点 MySQL传统点位复制在5.7版本前是主要的主从复制模式,而随着MySQL5.6版本引入GTID,并且MySQL5.7进行各方面的优化以后,在mySQL5.7(尤其是MySQL ...
- MySQL 从 5.5 升级到 5.6,启动时报错 [ERROR] Plugin 'InnoDB' init function returned error
MySQL 从 5.5 升级到 5.6,启动时报错: [ERROR] Plugin 'InnoDB' init function returned error. [ERROR] Plugin 'Inn ...
- MySQL 5.1.73升级为MySQL 5.5.35详解
一.前言 二.概述 三.安装MySQL 5.1.73 四.升级为MySQL 5.5.35 五.总结 注,测试环境 CentOS 6.4 x86_64,MySQL 版本(5.1.73.5.5.35)目前 ...
- MySQL/MariaDB/Percona数据库升级脚本
MySQL/MariaDB/Percona数据库升级脚本截取<OneinStack>中upgrade_db.sh, 一般情况下不建议升级数据库版本,该脚本专提供给各位版本控们.为防止大版本 ...
- CentOS6.5把MySQL从5.1升级到5.6后,MySQL不能启动
解决了:进入mysql安装目录 cd /var/lib/mysql删除了如下三个文件:ibdata1 ib_logfile0 ib_logfile1 CentOS6.5把MySQL从5.1升级到5 ...
- 24.Mysql高级安装和升级
24.Mysql高级安装和升级24.1 Linux/Unix平台下的安装 24.1.1 安装包比较Linux下的Mysql安装包分为RPM包.二进制包.源码包3种.RPM包优点是安装简单,适合初学者: ...
- Ubuntu 12.04.1 mysql从5.5升级到5.6
Ubuntu 12.04.1 mysql从5.5升级到5.6 1 2 3 4 5 apt-cache search mysql-server sudo apt-add-repository ppa: ...
- mysql 5.6.15升级到5.6.43
今天闲来无事,观察测试环境的zabbix服务器,发现内存泄漏严重,于是重启了,想起了前几天写的帖子发生了严重的内存泄漏可以把mysql升级到最新的小版本 于是乎就试着升级 old version:5. ...
随机推荐
- Flex中怎么给表格中的滚动条定位
1.问题背景 如果表格中的字段过多,会出现滚动条,在将滚动条滚到一定的位置时,重新刷新表格,滚动条会回到原处,原来查看的字段还得继续滚动,才能查看到. 2.实现实例 <?xml version= ...
- linq根据传入数据集合查询对应子级数据
工作中经常用到的linq根据传入数据集合查询对应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点对应ID数据集合,再根据ID数据集合查询全部子级数据. //获取缓存数据 ...
- 关于ios手机游览器针对overflow:hidden设置无效的解决办法
Ordinarily, overflow: hidden; on the body tag is sufficient to prevent scrolling a web page, if for ...
- Educational Codeforces Round37 E - Connected Components?
#include <algorithm> #include <cstdio> #include <iostream> #include <queue> ...
- pat1051-1060
1051 自己写的非常麻烦 http://blog.csdn.net/biaobiaoqi/article/details/9338397 的算法比较好,我的就贴下吧,主要对入栈出栈不够理解 #inc ...
- JDBCTemplate简化JDBC的操作(一)
接触过JAVA WEB开发的朋友肯定都知道Hibernate框架,虽然不否定它的强大之处,但个人对它一直无感,总感觉不够灵活,太过臃肿了. 今天来说下Spring中关于JDBC的一个辅助类(JDBC ...
- 在vue中使用css modules替代scroped
前面的话 css modules是一种流行的模块化和组合CSS的系统. vue-loader提供了与css modules的集成,作为scope CSS的替代方案.本文将详细介绍css modules ...
- wso2ESB - 在eclipse中启用调试模式
最近在使用wso2ESB,记录一下使用过程中碰到的坑,先写一篇调试的(前面的工具安装就不介绍了,既然想用调试了说明你已经看过一部分文档了),以后可能会介绍其他功能的使用. 在wso2 ei的文档中,介 ...
- jquery pjax 用法总结
以前我们点击a链接的时候总是会刷新整个页面并跳转到新页面,中间可以很明显的看到短暂的白屏.pjax就很好的解决了这问题. pjax的原理很简单,就是发送一个ajax请求,获取html代码,再把相关代码 ...
- 使用CMD命令编译和运行Java程序
对于初学者来说,使用CMD命令(Unix以及类Unix系统采用Termial)来编译和运行Java的好处是让初学者直观地体会到编译(Compile)这一步骤,加深记忆.所谓编译就是将文本文件xxx.j ...