一、主从复制

1.)普通主从复制:

  普通主从复制主要是基于二进制日志文件位置的复制,因此主必须启动二进制日志记录并建立唯一的服务器ID,复制组中的每个服务器都必须配置唯一的服务器ID。如果您省略server-id(或者明确地将其设置为其默认值0),则主设备将拒绝来自从设备的任何连接。 
2.) GTID 主从: 

(1.)基本概念

  MySQL 5.6 的新特性之一,全局事务标识符(GTID)是创建的唯一标识符,并与在源(主)服务器上提交的每个事务相关联。此标识符不但是唯一的,而且在给定复制设置中的所有服务器上都是唯一的。所有交易和所有GTID之间都有一对一的映射关系 。它由服务器ID以及事务ID组合而成。这个全局事务ID不仅仅在原始服务器上唯一,在所有存在主从关系 的mysql服务器上也是唯一的。正是因为这样一个特性使得mysql的主从复制变得更加简单,以及数据库一致性更可靠。一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。

  一个GTID被表示为一对坐标,用冒号(:)分隔,如下所示:GTID = source_id:transaction_id,source_id标识的源服务器。通常情况下,服务器 server_uuid用于这个目的。这transaction_id是一个序列号,由在此服务器上提交事务的顺序决定 .

3E11FA47-71CA-11E1-9E33-C80AA9429562:

  在传统的主从复制slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。GTID用来代替classic的复制方法,不在使用binlog+pos开启复制。而是使用master_auto_postion=1的方式自动匹配GTID断点进行复制。

  mysql的主从复制是十分经典的一个应用,但是主从之间总会有数据一致性(data consistency )的问题,一般情况从库会落后主库几个小时,而且在传统一主多从(mysql5.6之前)的模型中当master down掉后,我们不只是需要将一个slave提成master就可以,还要将其他slave的同步目的地从以前的master改成现在master,而且bin-log的序号和偏移量也要去查看,这是十分不方便和耗时的,但mysql5.6引入gtid之后解决了这个问题。

红色代表GTID,绿色代表传统主从:

(2.)GTID的工作原理:

、当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
、binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。
、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
、如果有记录,说明该GTID的事务已经执行,slave会忽略。
、如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,
在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。
、在解析过程中会判断是否有主键,如果有就用二级索引,如果没有就用全部扫描。

二、GTID参数配置

1、主master:

[mysqld]
#GTID:
server_id= #服务器id
gtid_mode=on #开启gtid模式
log_slave_updates ## 表示即可以当从也可以当主
enforce_gtid_consistency=on #强制gtid一致性,开启后对于特定create table不被支持 #binlog
log_bin=master-binlog
#log-bin=/data/mysql/mysql-bin.log    //binlog日志文件,(文件名如果是绝对路径,必须指定索引文件)
#log_bin_index =    /var/lib/mysql/mysql-bin.index     //是binlog文件的索引文件,这个文件管理了所有的binlog文件的目录
log-slave-updates=
binlog_format=row #binlog日志格式,强烈建议,其他格式可能造成数据不一致
expire_logs_days=7            //binlog过期清理时间


#relay logskip_slave_start=

2、从slave:

与主的配置没有区别,仅仅只是server_id不一致。

三、配置主从

1.)master:

创建并授权salve远程访问的用户:

GRANT REPLICATION SLAVE ON *.* TO root@192.168.50.28 IDENTIFIED BY '';
flush privileges;

查看授权slave用户表:

show grants for user@localhost;

查看binlog信息:show master status;

2.)GTID—slave;(注意:GTID主从必须启用MASTER_AUTO_POSITION而且不能跟bin与pos同时配置。)

CHANGE MASTER TO MASTER_HOST='192.168.50.116',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='123456',MASTER_AUTO_POSITION=1;
start slave;
show slave status\G; #MASTER_AUTO_POSITION: (mysql5.6.5及其后续版本)进行change master to时使用MASTER_AUTO_POSITION = 1,slave连接master将使用基于 
GTID的复制协议。等于0则恢复到老的文件复制协议。

3.)传统复制—slave配置;(这里的bin与pos根据实际情况更换)

CHANGE MASTER TO MASTER_HOST='192.168.50.116',MASTER_PORT=,MASTER_USER='root',MASTER_PASSWORD='', master_log_file='mysql-bin.000003',master_log_pos=308;
start slave;
show slave status\G; 

关键:在配置文件中启用GTID的情况下,change语句才是决定启用GTID还是传统主从的关键。

进行主备切换的时候,一般都会先对主库进行只读操作(on),然后主备同步完成后,再把备库置为可读写(off)。这样可以避免切换的过程中双写引起脏数据。:set global read_only=on/off

四、特殊情况下,需要重置主从

stop slave;

reset slave all;  #重置全部的从信息

reset master;  #重置主

五、事物跳过(传统与GTID的跳过方法不同)

1.传统

set global sql_slave_skip_counter = 1;

#可以忽略N个事件(event),通常一个SQL是一个事件。

2.GTID跳过事务冲突

首先,我们需要先查看当前SLAVE复制的进度:SHOW SLAVE STATUS\G

Retrieved_Gtid_Set:aaa-bbb-ccc-ddd:N   (表示收到的事务)
Executed_Gtid_Set:aaa-bbb-ccc-ddd:N (表示已经执行完的事务)

看Executed_Gtid_Set 到了31这个事务GTID位置,在这下一个位置(32)上发生错误。这时候,我们需要手工调整SLAVE已清除的GTID列表 GTID_PURGED,人为通知SLAVE哪些事务已经被清除了,后续可以忽略:

 STOP SLAVE;
RESET MASTER;
SET @@GLOBAL.GTID_PURGED = “3a16ef7a-75f5-11e4--deadeb54b599:-,f2b6c829-9c87-11e4-84e8-deadeb54b599:-”;
START SLAVE;

上面这些命令的用意是,忽略 f2b6c829-9c87-11e4-84e8-deadeb54b599:32 这个GTID事务,下一次事务接着从 33 这个GTID开始,即可跳过上述错误。

从服务器上负责同步的有二类线程: 1) IO thread       2) SQL thread

Slave_IO_Running:从服务器正从主服务器上读取BINLOG日志,并写入从服务器的中继日志.
Slave_SQL_Running:进程正在读取从服务器的BINLOG中继日志,并转化为SQL执行

IO thread 决定了Retrieved_Gtid_Set
SQL thread 决定了Executed_Gtid_Set

IO thread负责获取master上的binary log, 然后多个sql threads负责执行。由于IO thread先于SQL thread,Retrieved_Gtid_Set可能会略多于Executed_Gtid_Set。比如: SHOW slave STATUS \G

.......
.......
Retrieved_Gtid_Set: 67cd9435-7cae-11e2-aa8d-00241db92e69:-
Executed_Gtid_Set: 67cd9435-7cae-11e2-aa8d-00241db92e69:-
Auto_Position:

1.)注入空事务:

stop  slave;

SET GTID_NEXT='aaa-bbb-ccc-ddd:N';    #要想跳过错误的GTID或则是想要跳过的GTID,就需要指定下一个事物的执行版本

BEGIN; COMMIT;    #注入一个空事务

SET GTID_NEXT='AUTOMATIC';  #自动寻找GTID事务

一旦所有事务标识符以这种方式使用空事务恢复后,您必须刷新并清除从属服务器的二进制日志,如下所示,其中 N是当前二进制日志文件名称 的非零后缀;或者reset  slave;
FLUSH LOGS;
PURGE BINARY LOGS TO 'master-bin.00000N'; start slave;

2.)重置master方法跳过错误

mysql> STOP SLAVE;
mysql> RESET MASTER;
mysql> SET @@GLOBAL.GTID_PURGED ='8f9e146f-0a18-11e7-810a-0050568833c8:1-4'
mysql> START SLAVE;

注意:在GTID主从的建立初期,slave的数据一定要是从master mysqldump过去的并且更加--all-databases参数。否则手动补齐的数据会出现slave_sql_running为NO的情况,这是因为主的操作记录会保存在GTID与binlog中,然后slave会同步主的GTID与binlog并进行相应的操作,这时两边的数据虽然是一致的,但是同步过来master的GTID中包含了主做过的一些sql操作,而此时slave的环境不满足sql语句的执行就会冲突。解决办法是:1.)不断的执行跳过事务的操作直到没有报错。2.)刷新master的GTID“reset master”然后重新再slave执行change同步。

六、报错案例:

1.)

2017-10-12T09:59:27.660287Z 4 [ERROR] Slave I/O for channel '': Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593
解决方法:
如果是copy的data目录可能会出现这个错,将data目录里auto.cnf 文件中的uuid改为与master不一样的即可。

2.)传统主从

2017-10-12T10:09:15.365312Z 4 [ERROR] Slave I/O for channel '': Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file', Error_code: 1236
解决办法:
是因为找不到master的二进制文件,查看master的binlog二进制文件、pos位置是否与slave相同,不相同关闭salve并在slave执行CHANGE MASTER TO MASTER_LOG_FILE='mysqld-bin.000011',MASTER_LOG_POS=106;更改,然后开启start slave;并进行查看show slave status\G

3.) GTID主从

Got fatal error 1236 from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.'

解决办法:忽略purged的部分,强行同步
master确认已经purge的部分:show global variables like '%gtid%';
stop slave,在slave上通过set global gtid_purged='xxxx'的方式,跳过已经purge的部分

4.)

主从不同步,但slave显示双yes,日志无报错问题。

这个解决方法是下下策,我不知道不同步的原因是什么,如果有知道的T友,请评论告知。

重置主从:reset master                reset slave

备份主的全库到slave:
mysqldump -h 192.168.50.116 -uroot -p123456 --all-databases --skip-lock-tables --set-gtid-purged=off > qk.sql

然后从导入:mysql -uroot -p123456 <aaa.sql

导入时若提示:ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.则在本地执行reset master即可。导入成功后重新开启slave同步,如若slave需要重新挂载在master端,则执行命令change时忽略MASTER_AUTO_POSITION即可。

注意:

开启主从复制之后,就不可以在从的上面进行操作,否则会出现slave_sql_running为NO的提示。
当已经在从库进行删除或则添加数据时,挽救的方法就是关闭slave,然后将删除的数据创建回来或将添加的数据删除,目的是为了与master一致,然后开启slave。最好是将从库设置为只读模式,但是无法对super的用户起效。

5.)

Got fatal error 1236 from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.'

解决办法:

这类报错往往是因为master清除了相关的GTID事务导致无法同步的。通常是因为从库因为某些原因需要重新接受master的GTID事务,比如像slave导入备份重新指向master。这时就需要在master执行:show global variables like '%gtid%';  找出被purged的条目,然后再slave执行本文中 “GTID跳过事务冲突”的步骤即可。


优秀文章分享:

http://www.cnblogs.com/luckcs/articles/6295992.html

http://blog.csdn.net/leshami/article/details/50630691

GTID主从 与 传统主从复制的更多相关文章

  1. GTID主从与传统主从复制

    目录 1.主从复制 2.靠什么同步 3.pos与GTID的什么区别 4.GTID的工作原理 5.GTID参数配置 5.1 在主数据库里创建一个同步账号授权给从数据库使用 5.2 配置主数据库 5.3配 ...

  2. GTID复制模式切换与传统主从复制间切换

    GTID复制模式切换到传统主从复制主从复制环境:主库:10.18.10.11从库:10.18.10.12MySQL5.7.22 切换之前查看下主从gitd_mode参数值主服务器:gtid_mode值 ...

  3. MySQL的GTID复制与传统复制的相互切换

    MySQL的GTID复制与传统复制的相互转换 1. GTID复制转换成传统复制 1.1 环境准备 1.2 停止slave 1.3 查看当前主从状态 1.4 change master 1.5 启动主从 ...

  4. GTID主从和lamp架构运行原理

    目录 GTID主从 GTID概念介绍 GTID工作原理 GTID主从配置 lamp lamp简介 web服务器工作流程 cgi与fastcgi http协议 是什么? lamp架构运行的原理 Apac ...

  5. Mysql5.7的gtid主从半同步复制和组复制

    (一)gtid主从半同步复制 一.半同步复制原理 mysql默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主库如果cr ...

  6. GTID主从

    GTID主从 目录 GTID主从 GTID概念介绍 GTID工作原理 GTID主从配置 GTID概念介绍 GTID即全局事务ID (global transaction identifier), 其保 ...

  7. 解决mysql开启GTID主从同步出现1236错误问题【转】

    最近遇到mysql开启gtid做复制时,从库出现1236错误,导致同步无法进行,本文就这问题记录下处理步骤,有关gtid知识在这里不做介绍,mysql版本为5.7.16. 一.错误原因分析 错误信息如 ...

  8. 解决mysql开启GTID主从同步出现1236错误问题

    解决mysql开启GTID主从同步出现1236错误问题     最近遇到mysql开启gtid做复制时,从库出现1236错误,导致同步无法进行,本文就这问题记录下处理步骤,有关gtid知识在这里不做介 ...

  9. MySQL的GTID复制与传统复制的相互转换

    主库:192.168.225.128:3307从库1:192.168.225.129:3307 Gtid作为5.6版本以来的杀手级特性,却因为不支持拓扑结构内开关而饱受诟病.如果你需要从未开启GTID ...

随机推荐

  1. c# 方法传递参数

    一.参数的使用方法: 1.值参数(Value Parameter ) 格式:方法名称(参数类型 参数名称[,参数类型 参数名称]) 2.引用参数(Reference Parameter ) 格式:方法 ...

  2. Jmeter(十)Linux下配置安装Jmeter及执行测试任务

    一.安装JDK7.0版本 1.先卸载服务器自带的jdk软件包 # java -version #查看服务器是否安装过 # rpm -qa |grep gcj #查看服务器安装的jdk软件包信息 # y ...

  3. Jmeter(六)文件上传和下载文件

    一.Jmeter上传文件 编写脚本:               首先添加一个线程组,然后在线程组里面添加一个http请求,因为是发送数据,所有是post请求,写好上传的地址,然后写好文件路径     ...

  4. 【zabbix】自定义监控项key值

    说明: zabbix自带的默认模版里包括了很多监控项,有时候为了满足业务需求,需要根据自己的监控项目自定义监控项,这里介绍一种自定义监控项的方式. 1,首先编写自定义监控脚本,本文以监控httpd进程 ...

  5. yield的表达式形式的应用(待补充)

    1.yield的表达式形式应用的定义: 在一个生成器函数内,将yield赋值给一个变量,这就是yield的表达式形式.也叫生成器的表达式形式 2.send方法的定义: (1)定义: yield的表达式 ...

  6. Linux_Vi_命令

    Linux Vi 命令 ************************************************************************* 在vi中使用命令的方法是:冒 ...

  7. Mysql 压力测试工具 mysqlslap

    转载至文章作者:杜亦舒 链接:https://www.sdk.cn/news/4512 来源:SDK.cn 摘要:mysqlslap 是 Mysql 自带的压力测试工具,可以模拟出大量客户端同时操作数 ...

  8. HDU 3081 Marriage Match II (二分+并查集+最大流)

    题意:N个boy和N个girl,每个女孩可以和与自己交友集合中的男生配对子;如果两个女孩是朋友,则她们可以和对方交友集合中的男生配对子;如果女生a和女生b是朋友,b和c是朋友,则a和c也是朋友.每一轮 ...

  9. eclipse调整字体大小

    window->preferences->general->appearance->colors and fonts-> 双击Text Font 就调整字体大小了

  10. jxl.jar包,应该把它放在哪个文件下

    ①把鼠标放到自己的工程上右键 ②点击Properties or Build Path >> Configure Build Path, 然后弹出一个窗口,click AddExternal ...