mysql5.7gtid主从复制_mysql5.7基于GTID实现主从复制

本文详细介绍了MySQL5.7中基于GTID的主从复制机制,包括GTID的概念、构成、优势、工作原理,以及如何在线启用和切换GTID模式。GTID简化了复制过程,增强了数据一致性。同时,文中提供了新搭建主从复制的配置步骤和在线模式转换的方法。
摘要由CSDN通过智能技术生成

mysql5.7基于GTID实现主从复制

一.GTID概述

1.1 GTID的概念

GTID,全局事务ID globaltransaction identifiers

GTID是一个事务对应一个全局唯一ID,随事务记录到binlog中,用来标识事务。

GTID 对应事务在一个服务器上只执行一次,避免重复执行导致数据不一致。

GTID 用来代替传统的复制方法,不再使用传统的MASTER_LOG_FILE+ MASTER_LOG_POS,而是使用MASTER_AUTO+POSTION=1的方式

每个事务有一个Gtid_log_event

1.2 GTID的构成

UUID+Sequence Number

Sequence Number是MySQL服务器内部的一个事务顺序号.一个MySQL服务器上的事务不会有重复的顺序号(保证服务器内唯一)。

每个MySQL服务器有一个全局唯一的UUID.

1.3 GTID优势

1. 简化复制的使用过程和降低复制集群的维护难度。

2. 比传统的复制更能保证数据一致性

1.4 GTID的工作原理

1. 当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。

2. Slave连接到Master时,会把gtid_executed中的gtid发给Master。Master会自动跳过这些事务,只将没有复制的事物发送到Slave上。

3. binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。

4. sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。

5. 如果有记录,说明该GTID的事务已经执行,slave会忽略。

6. 如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,

7. 在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。

8. 在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

1.5 GTID在线启用条件

1. 新系统搭建时直接开启GTID功能。

2. 老系统需升级至mysql5.7后,开启GTID功能。

二.新搭建主从,基于GTID实现

主库:

修改vim /etc/my.cnf

#gtid

server_id=1 #主库与从库不能重复

gtid_mode=on,开启gtid模式

enforce_gtid_consistency=on #参数值包括off(不检测是否有GTID不支持的语句或事物),warn(当发现有支持的语句或事务时,返回警告,并记到日志中),on(当发现语句或事物不支持GTID时,返回错误)建议在启用GTID时,在测试环境中开始此参数,处理完GTID不支持的语句后,再启用GTID。

#binlog

log_bin=master-binlog #开启binlog

log-slave-updates=1

binlog_format=row #建议复制时开启row模式

#relay log

#skip_slave_start=1

从库:

修改vim /etc/my.cnf

#gtid

server_id=2 #主库与从库不能重复

gtid_mode=on,开启gtid模式

#binlog

log_bin=master-binlog #开启binlog,注意5.7版本以后可以不开启binlog了,可以节省空间提高性能,5.6版本必须开启binlog,因为GTID存储在binlog中,只有开启binlog才能使用GTID的功能。5.7中通过GTID系统表来记录GITD(表mysql.gtid.executed),每个事务提交时,将GTID插入到表中。

log-slave-updates=1

binlog_format=row #建议复制时开启row模式

#relay log

#skip_slave_start=1

二.在线将传统复制模式变更为基于GTID复制的步骤

1. master和slave上分别执行

set@@global.enforce_gtid_consistency=warn;

查看错误日志中是否有错误信息

tail -fmysql-master.err

2. master和slave上分别执行

set@@global.enforce_gtid_consistency=on;

3. master和slave上分别设置GTID模式:

set@@global.gtid_mode=off_permissive;

查看主从错误日志中是否有错误信息

tail -fmysql-master.err

4. master和slave上分别执行

set @@global.gtid_mode=on_permissive;

5. 检查是否还有基于传统复制的信息

mysql> show status like 'ongoing_anonymouse_transcation_count';

Empty set (0.00 sec) #如果为空表示没有问题

6. master和slave上分别执行

set@@global.gtid_mode=on;

mysql> show variables like 'gtid_mode';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| gtid_mode     | ON    |

+---------------+-------+

7. 在slave上执行:

stop slave;

change master tomaster_auto_position=1;

start slave

show slave status\G;

8. 将以下两个参数加入到my.cnf中,以便重启时生效

gtid_mode=on

enforce_gtid_consistency=on

四.在线将基于GTID复制变更为传统模式的复制

1. master服务器

show master status; #查看master的日志文件及位置点

2. slave服务器

stop slave;

change master to master_auto_position=0, master_log_file='master-binlog.000004',master_log_pos=194;

start slave;

3. master 和slave 上分别执行

set @@global.gtid_mode=on_permissive;

set @@global.gtid_mode=off_permissive;

select @@global.gtid_owned;#master和slave全为空字符串时执行下面操作

set @@global.gtid_mode=off;

enforce_gtid_consistency=off;

4. slave上执行,查看复制状态

show slave status\G;

5. 在my.cnf中,修改

gtid_mode=off

enforce_gtid_consistency=off

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值