mysql数据复制-gtid

一 、gtid简介

gtid(global transaction identifier,统一事务标志符),是MySQL 5.6 的新特性之一。全局事务 ID 的官方定义是:GTID = source_id:transaction_id,其中source_id表示执行事务的主库 uuid(server_uuid),数据保存在auto.cnf 文件 ,transaction_id 是一个从 1 开始的自增计数,表示在这个主库上执行的第 n 个事务,MySQL 会保证事务与 GTID 之间的 1 : 1 映射。

二、gtid方式和传统复制模式的区别

1)在传统的复制里面,当发生故障,需要主从切换,需要找到binlog和pos点,然后change master to指向新的master,比较麻烦,也容易出错;

2)gtid复制方式不用找binlog和pos点,只需要知道master的ip、端口、账号密码就行。因为复制是自动的,MySQL会通过内部机制GTID自动找点同步;

3)传统复制方式slave的复制是单线程的,一个事件一个事件的读取应用,但master是并发写入的,所以会造成从数据库的数据延时;

4)gtid复制方式多线程复制(基于库),可以把多个表放在多个库,这样就可以使用多线程复制,当只有1个库,多线程复制是没有用的。

三、搭建master-slave环境

1)准备安装3台mysql服务器,1台master、2台slave。master服务器的服务名为mysqlmaster,二台slave服务器的服务名分贝为mysqlslave、mysqlslave2;

2)修改master服务器的my.ini文件,我的配置文件的内容是

[mysqld]

innodb_buffer_pool_size = 128M

server-id=1

log-bin=master-bin.log

log-slave-updates=true

#开启gtid

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

#解决重启服务器时,数据重复问题

sync-master-info=1

#设置从服务器复制线程数

slave-parallel-workers=2

#设置binlog校验算法(循环冗余校验码)

binlog-checksum=CRC32

#设置主服务器是否校验

master-verify-checksum=1

#设置从服务器是否校验

slave-sql-verify-checksum=1

binlog-rows-query-log-events=1

 #mysql安装位置

 basedir=D:\mysqlcuster\mysqlmaster

#mysql数据存放位置

 datadir=D:\mysqlcuster\mysqlmaster\data

#mysql端口号

 port=3307

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

#服务端的编码方式

character-set-server=utf8

[client]

port=3307

default-character-set=utf8

3)修改slave服务器的my.ini文件,以mysqlslave为例

[mysqld]

innodb_buffer_pool_size = 128M

server-id=2

log-bin=slave-bin.log

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

sync-master-info=1

slave-parallel-workers=2

binlog-checksum=CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

binlog-rows-query-log-events=1

 basedir=D:\mysqlcuster\mysqlslave

 datadir=D:\mysqlcuster\mysqlslave\data

 port=3308

 #设置从节点只读,防止从节点写入数据,导致主从数据库数据不一致

 read_only=1

 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

#服务端的编码方式

character-set-server=utf8

[client]

port=3308

default-character-set=utf8

4)分别启动mysqlmaster、mysqlslave、mysqlslave2服务;

5)在mysqlmaster服务器执行grant replication slave on *.* to [email protected] identified by 'repl_password';创建数据同步使用的账号;

5)分别登录3台服务器。在mysqlslave、mysqlslave2服务器中设置主服务器信息,运行

change master to

master_host='127.0.0.1',

master_port=3307,

master_user='repl_user',

master_password='repl_password',

master_auto_position=0;

命令,之后再运行start slave;查看slave节点的状态show slave status;

mysql数据复制-gtid_第1张图片

不过在安装过程中遇到了一个问题,错误日志为

Last_IO_Error: 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 themaster has purged binary logs containing GTIDs that the slave requires.

通过修改slave服务器的gtid_executed、GTID_PURGED的值解决的

mysql数据复制-gtid_第2张图片

mysql数据复制-gtid_第3张图片

问题及解决方法的源url地址:https://www.percona.com/blog/2013/02/08/how-to-createrestore-a-slave-using-gtid-replication-in-mysql-5-6/

6)测试

mysql数据复制-gtid_第4张图片

你可能感兴趣的:(mysql数据复制-gtid)