mysql主从复制原理
1 master的dump线程从二进制日志中读取事件,发送给IO线程
2 slave的IO线程接受到事件,写入relay log
3 slave的SQL线程从relay log中读取事件并执行
GTID是mysql5.6的新功能
UUID(服务器ID)+GTID(全局事物ID),可以唯一标识一个事务
事务从master复制到slave时,二进制pos位置可能会发生变化,由于slave配置可能与master不同,这个位置差别可能很大。但是GTID是一样的。
GTID存在于二进制日志中,关闭二进制日志就不会记录GTID。
开启GTID:
1.binlog
2.gtid-mode=on --这个就够了,开启GTID
3.log-slave-updates --保障master的事物也会写入slave的binlog,默认关闭
4.enforce-gtid-consistency --如果语句记录与GTID不一致,报错
change master方式略有不同,不需要记录master的
change master to
master_host='127.0.0.1',
master_port=3306,
master_user='replicator',
master_password='oracle',
master_log_file='master-bin.000002',
master_log_pos=154;
change master to
master_host='127.0.0.1',
master_port=3306,
master_user='replicator',
master_password='oracle',
master_auto_postion=1 --不需要指定master bin文件和postion。slave与master自动协商发送什么事务
show slave status的GTID描述
Retrieved_Gtid_Set=存储在relay log一组GTID
Executed_Gtid_Set=slave已经执行,且已经写入bin log的一组GTID
mysql> show variables like '%GTID%';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | OFF |
| gtid_executed_compression_period | 1000 |
| gtid_mode | OFF |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
8 rows in set (0.02 sec)
在没有GTID的情况下,主备切换要保证数据一致性,需要先把master,slave停下来,
使用start slave until命令启动slave到指定的position,这个时候主从就一致了。