- GTID,全局事务ID globaltransaction identifiers
- GTID是一个事务对应一个全局唯一ID
- GTID 对应事务在一个服务器上只执行一次,避免重复执行导致数据不一致。
- GTID 用来代替传统的复制方法,不再使用传统的MASTER_LOG_FILE+ MASTER_LOG_POS,而是使用MASTER_AUTO+POSTION=1的方式
- 2 GTID优势
- 搭建主从比传统的方式更加简单,主从切换方便、快速。
- 比传统的复制更能保证数据一致性
- 3 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实现
- 主库:
- 修改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复制的步骤
- master和slave上分别执行
set@@global.enforce_gtid_consistency=warn;
查看错误日志中是否有错误信息
tail -fmysql-master.err
- master和slave上分别执行
set@@global.enforce_gtid_consistency=on;
- master和slave上分别设置GTID模式:
set@@global.gtid_mode=off_permissive;
查看主从错误日志中是否有错误信息
tail -fmysql-master.err
- master和slave上分别执行
set@@global.gtid_mode=on_permissive;
- 检查是否还有基于传统复制的信息
mysql> show status like 'ongoing_anonymouse_transcation_count';
Empty set (0.00 sec) #如果为空表示没有问题
- master和slave上分别执行
set @@global.gtid_mode=on;
- mysql> show variables like 'gtid_mode';
- +---------------+-------+
- | Variable_name | Value |
- +---------------+-------+
- | gtid_mode | ON |
+---------------+-------+
- 在slave上执行:
stop slave;
change master tomaster_auto_position=1;
start slave
show slave status\G;
- 将以下两个参数加入到my.cnf中,以便重启时生效
gtid_mode=on
enforce_gtid_consistency=on
- 四.在线将基于GTID复制变更为传统模式的复制
- master服务器
show master status; #查看master的日志文件及位置点
- slave服务器
stop slave;
change master to master_auto_position=0,master_log_file='master-binlog.000004', master_log_pos=194;
start slave;
- 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;
- slave上执行,查看复制状态
show slave status\G;
- 在my.cnf中,修改
gtid_mode=off
enforce_gtid_consistency=off