从MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。通过 GTID 保证了每个在主库上提交的事务在集群中有一个唯一的ID。这种方式强化了数据库的主备一致性,故障恢复以及容错能力。 GTID (Global Transaction ID)是全局事务ID,当在主库上提交事务或者被从库应用时,可以定位和追踪每一个事务,对DBA来说意义就很大了,我们可以适当的解放出来,不用手工去可以找偏移量的值了,而是通过CHANGE MASTER TO MASTER_HOST='xxx', MASTER_AUTO_POSITION=1的即可方便的搭建从库,在故障修复中也可以采用MASTER_AUTO_POSITION=‘X’的方式。
master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
如果有记录,说明该GTID的事务已经执行,slave会忽略。
如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描
IP | 主机名 |
---|---|
192.168.1.77 | master |
192.168.1.78 | slave |
[mysqld]
user=mysql
port=3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server=utf8mb4
collation_server=utf8mb4_general_ci
server_id=77
log-bin=master-bin # 二进制日志文件名
binlog_format=row # 其他格式可能造成数据不一致
log-slave-updates=ON # 是否记录从服务器同步数据动作
gtid_mode=ON # 开启GTID功能
enforce-gtid-consistency=ON # 开启强制GTID一致性
master-info-repository=TABLE # 记录IO线程读取已经读取到的master binlog位置,用于slave宕机后IO线程根据文件中的POS点重新拉取binlog
relay-log-info-repository=TABLE # 记录SQL线程读取Master binlog的位置,用于Slave 宕机后根据文件中记录的pos点恢复sql线程
sync-master-info=1 # 启用确保无信息丢失;任何一个事务提交后, 将二进制日志的文件名及事件位置记录到文件中
slave-parallel-workers=2 # 设置从服务器的复制线程数,0表示关闭多线程复制功能
binlog-checksum=CRC32 # 设置binlog校验算法
master-verify-checksum=1 # 设置主服务器是否校验
slave-sql-verify-checksum=1 # 设置从服务器是否校验
binlog-rows-query-log_events=1 # 用于在二进制日志记录事件相关的信息,可降低故障排除的复杂度
sync_binlog=1 # 保证master crash safe,该参数必须设置为1
innodb_flush_log_at_trx_commit=1 # 保证master crash safe,该参数必须设置为1
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysqld]
user=mysql
port=3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server=utf8mb4
collation_server=utf8mb4_general_ci
server_id=78
log-bin=slave-bin
binlog_format=row
log-slave-updates=ON
gtid_mode=ON
enforce-gtid-consistency=ON
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
symbolic-links=0
log-slave-updates = 0 # crash safe slave 5.6版本需要开启
relay_log_recovery = 1 # crash safe slave
read_only = on # 设置一般用户为只读模式
super_read_only = on # 设置super(root)用户为只读模式
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Slave_IO_State # 从库的当前状态
Slave_IO_Running # 读取主服务器二进制日志的I/O线程是否正在运行
Slave_SQL_Running # 执行读取主服务器中二进制日志事件的SQL线程是否正在运行
Seconds_Behind_Master # 是否为0,为0就是已经同步了
如果Slave_IO_Running或Slave_SQL_Running不同时为YES,请尝试执行
mysql> stop slave;
mysql> reset slave;
mysql> start slave;
主服务器的Executed_Gtid_Set值和从服务器的Retrieved_Gtid_Set值是一样的,GTID每提交一次事务,最后一位值会自增1