MySQL 主备同步技术演化
主库出问题了,从库怎么办?
备库:同步主库的binlog,当主库出问题时,备库切换为主库。一般不提供读服务。
从库:同步主库的binlog,只对外提供读服务。

一主多从主备切换 方法
基于位点的主备切换
首先我们知道,设置从库时的命令
CHANGE MASTER TO
MASTER_HOST=$host_name
MASTER_PORT=$port
MASTER_USER=$user_name
MASTER_PASSWORD=$password
MASTER_LOG_FILE=$master_log_name
MASTER_LOG_POS=$master_log_pos
master_log_file和master_log_pos 表示从主库的这个文件的pos位置开始同步,
那如何获取这个pos位置呢?
一种取同步位点的方法是这样的:
- 等待新主库 A’把中转日志(relay log)全部同步完成;
- 在 A’上执行 show master status 命令,得到当前 A’上最新的 File 和 Position;
- 取原主库 A 故障的时刻 T;
- 用 mysqlbinlog 工具解析 A’的 File,得到 T 时刻的位点。
通过命令show master status 可以得到file和pos。这里的pos是最新的,从库同步的话,是需要找故障时刻T的位点,执行 mysqlbinlog File --stop-datetime=T --start-datetime=T 获取到end_log_pos 作为同步的位点。
这种取同步位点的方法是不精确的,往往在执行的时候,需要执行一些辅助命令来跳过某些错误。
- 主动跳过一个事务
set global sql_slave_skip_counter=1;
start slave;
缺点是没遇到一个错误,就需要手动执行一次。
- 指定错误码跳过
set slave_skip_errors = "1032,1062";
start slave;
在执行主备切换时,有这么两类错误,是经常会遇到的:
- 1062 错误是插入数据时唯一键冲突;
- 1032 错误是删除数据时找不到行。
千万注意,主备切换后,要将这个参数设置为空
GTID
MySQL 5.6版本引入了GTID,将自动找位点的这一步骤完全自动化了。
那什么是GTID?
GTID 的全称是 Global Transaction Identifier,也就是全局事务 ID,是一个事务在提交的时候生成的,是这个事务的唯一标识。
GTID=server_uuid:gno
1, server_uuid 是一个实例第一次启动时自动生成的,是一个全局唯一的值
2. gno 是一个整数,初始值是 1,每次提交事务的时候分配给这个事务,并加 1。
gtid_next=automatic 代表使用默认值。
如果设置gtid_next=current_gtid, 如果current_gtid已经在实例的gtid集合中,接下来这个事务会被直接跳过,否则分配current_gtid给接下来的事务执行。注意:每个MySQL实例都维护了一个GTID集合,用来对应执行过的所有事务
基于GTID的主备切换
命令差不多
CHANGE MASTER TO
MASTER_HOST=$host_name
MASTER_PORT=$port
MASTER_USER=$user_name
MASTER_PASSWORD=$password
master_auto_position=1
主要是master_auto_position 表示这个主备关系使用的是GTID协议。
模拟以下GTID的主备切换。实例A的gtid集合为set_a, 实例B的gtid集合为set_b.
- 实例B使用change master 设置主库,使用master_auto_position参数。
- 实例B将set_b 发送给主库A
- 实例A算出set_a 与 set_b 之间的差集,即只在set_a的gtid,然后判断A的binlog是否有这个差集的所有事务,如果少了一些,则会返回错误给B,拒绝实例B建立主从同步,否则找出差集中的第一个gtid给实例B,完成主动找pos的过程
- 之后就从binlog这个位置将事务发给B取执行。
利用GTID主动跳过导致从库同步失败的事务
set gtid_next='aaaaaaaa-cccc-dddd-eeee-ffffffffffff:10';
begin;
commit;
set gtid_next=automatic;
start slave;
aaaaaaaa-cccc-dddd-eeee-ffffffffffff:10 是主库已经存在的事物id,该事务id会导致从库同步失败,通过设置gtid_next并提交一个空事务,将其加入从库的gtid集合中,从而跳过执行该事务
最后一个问题:基于gtid的主备切换,怎么解决主库因为binlog缺少某些事务而拒绝建立主从同步呢?
- 如果业务允许主从不一致的情况,那么可以在主库上先执行 show global variables like ‘gtid_purged’,得到主库已经删除的 GTID 集合,假设是 gtid_purged1;然后先在从库上执行 reset master,再执行 set global gtid_purged =‘gtid_purged1’;最后执行 start slave,就会从主库现存的 binlog 开始同步。binlog 缺失的那一部分,数据在从库上就可能会有丢失,造成主从不一致。
- 如果需要主从数据一致的话,最好还是通过重新搭建从库来做。
- 如果有其他的从库保留有全量的 binlog 的话,可以把新的从库先接到这个保留了全量 binlog 的从库,追上日志以后,如果有需要,再接回主库。
- 如果 binlog 有备份的情况,可以先在从库上应用缺失的 binlog,然后再执行 start slave。
MySQL 主备同步技术演化的更多相关文章
- LVS+MYCAT+读写分离+MYSQL主备同步部署手册
LVS+MYCAT+读写分离+MYSQL主备同步部署手册 1 配置MYSQL主备同步…. 2 1.1 测试环境… 2 1.2 配置主数据库… 2 1.2.1 ...
- 【转载】LVS+MYCAT+读写分离+MYSQL主备同步部署手册(邢锋)
LVS+MYCAT+读写分离+MYSQL主备同步部署手册 1 配置MYSQL主备同步…. 2 1.1 测试环境… 2 1.2 配置主数据库… 2 1.2.1 ...
- MySQL主备同步延迟
今天看到mycat的日志,发现在wrapper.log中频繁warning:slave延迟23006秒 查看数据指标: show engine innodb status正常,而且slave的拷贝点在 ...
- MySQL高可用(一)主备同步:MySQL是如何保证主备一致的
主备同步,也叫主从复制,是MySQL提供的一种高可用的解决方案,保证主备数据一致性的解决方案. 在生产环境中,会有很多不可控因素,例如数据库服务挂了.为了保证应用的高可用,数据库也必须要是高可用的. ...
- MySQL主备模式的数据一致性解决方案
根据阿里交易型业务的特点,以及在双十一这样业内罕有的需求推动下,我们在官方的MySQL基础上增加了非常多实用的功能.性能补丁.而在使用MySQL的过程中,数据一致性是绕不开的话题之一.本文主要从阿里 ...
- MySQL主备复制原理、实现及异常处理
复制概述 MySQL支持三种复制方式:基于行(Row)的复制.基于语句(Statement)的复制和混合类型(Mixed)的复制. 基于语句的复制早在3.23版本中就存在,而基于行的复制方式在5.1版 ...
- mysql主备搭建
mysql主备搭建参考文档https://www.cnblogs.com/clsn/p/8150036.html前提条件:系统:Ubuntu 16.04.6 LTSMySQL版本:5.7.24主库IP ...
- mysql主备切换canal出现的问题解析
通过配置VIP,在进行主备切换时,出现的报错信息: 1.当主备节点当前binlog文件名称相同时,原主节点的position小于主备切换后的position,出现如下报错: 2020-07-02 15 ...
- LVS+Keepalived+Mysql+主备数据库架构[4台]
这是一个坑...磨了不少时间.见证自己功力有待提升... 架构图 数据库 1.安装数据库 这块不难, 直接引用:mysql安装 2.数据库主备 这块不难, 直接引用: mysql主备 虚拟VIP 重点 ...
- mysql主备配置
目录 mysql主备2 一.master配置:2 1. 修改配置文件 2 2. 登录添加账号并赋权限 2 3. 查看master信息 2 二.slave配置:2 1. 修改配置文件 2 2. 重启登录 ...
随机推荐
- AI应用实战课学习总结(7)聚类算法分析实战
大家好,我是Edison. 最近入坑黄佳老师的<AI应用实战课>,记录下我的学习之旅,也算是总结回顾. 今天是我们的第7站,一起了解下聚类算法基本概念 以及 通过聚类算法辅助用户画像的案例 ...
- Eclipse所遇问题1
新建动态页面出现Dynamic Web Module 3.0 requires Java 1.6 or newer.错误 主要有两步: 确认自己的jdk是1.6以上的. 别忘了在这个选项里面打钩. 就 ...
- Excel图中的横/纵坐标轴逆序并修改轴交叉值
↓↓↓欢迎关注我的公众号,在这里有数据相关技术经验的优质原创文章↓↓↓ 在Excel中作图时坐标轴是默认以0为坐标轴原点的且从从下到上数值逐渐增大的.例如当纵坐标大于0时: 而当纵轴数值小于0时时这样 ...
- 小米手机4 rom 下载链接
简介 https://krunk.cn/kblog563.html
- 我的毕设总结所用的技术和只是要点 基于stm32F4的AGV嵌入式控制系统的设计
小疑惑 TP[num]这种应该是测试端口 OR应该是磁珠或者是.. Altium Designer shift+s 切换单双面 T+ C 查找对应的元器件 J+ C 查找编号 J+L 查找原点 T+M ...
- 如何打开超过20G的sql文件
最近在导项目中数据的流程时,对原数据库做了备份,备份好的sql文件有40G左右,通过一番折腾把数据库拿到本地PC,发现PC机直接弄不行: 平时经常使用的NotePad++,提示文本太大无法打开: PC ...
- spring 的aop面试题
- linux 解压方式
1.*.tar 用 tar –xvf 解压 2.*.gz 用 gzip -d或者gunzip 解压 3.*.tar.gz和*.tgz 用 tar –xzf 解压 4.*.bz2 用 bzip2 ...
- C# 多线程记录
开发中经常遇到不同的业务访问同一个数据源,而每一个业务的执行流就是一个线程,此时线程一多就会产生多线程最容易遇到的问题--并发. 什么是并发? 举个很经典的例子:程序中我们经常要操作一些对象,尤其 ...
- consul命令行
consul命令行 advertise:广告地址用于将我们通告的地址更改为群集中的其他节点.默认情况下,-bind通告地址.但是,在某些情况下,可能存在无法绑定的可路由地址.此标志允许闲聊不同的地址以 ...