在mysql5.6之前的版本支持传统的复制,即基于二进制文件和位置的复制。mysql5.6及其以后的版本支持基于GTID的复制,有了GTID复制不需要指定文件和位置了,复制会自动找二进制日志和位置
传统复制:
在做主从复制需要指定文件和位置,在做主从切换或者故障恢复时需要准确找到log_file和pos
CHANGE MASTER TO
MASTER_HOST='source2.example.com',
MASTER_USER='replication',
MASTER_PASSWORD='password',
MASTER_PORT=3306,
MASTER_LOG_FILE='source2-bin.001',
MASTER_LOG_POS=4,
MASTER_CONNECT_RETRY=10;
GTID复制:
GTID是全局事务标识符的简称,基于事务的复制,在mysql主库提交的事务会被分配GTID,事务在从库被应用时GTID不变,因此从库可以跟踪和识别主库的GTID,在使用GTID复制时或者故障转移切换时,会自动根据GTID来定位对应的二进制日志文件和位置在做主从复制时不需要指定file和pos
开启GTID:
## for gtid
gtid_mode = on
enforce_gtid_consistency = 1
CHANGE MASTER TO
MASTER_HOST='source2.example.com',
MASTER_USER='replication',
MASTER_PASSWORD='password',
MASTER_PORT=3306,
MASTER_AUTO_POSITION = 1;
GTID SET(gtid事务集合)在主库和从库都会保存,如果主库和从库的GTID SET一致就可以表名主从数据复制一致,主库提交的事务在从库上只应用一次,之后从库碰到重复的GTID时会自动跳过这个事务,这样有助保证主从数据的一致性。
GTID由UUID和TID(事务id)组成
GTID SET是一个或多个GTID列表,或者是一个GTID范围组成的集合
当主库事务被提交并将日志写入二进制文件时会为事务分配新的GTID,如果事务未写入二进制日志文件则不会为事务分配GTID(未开启binlog,事务被过滤,事务被回滚了,只读事务是不分配GTID的)
从库引用主库的二进制日志时会保留主库事务的GTID,即使从库进行了复制过滤,主库的GTID在从库中持久化
mysql系统库下的gtid_executed记录事务已经分配的GTID,当开启log_bin和log_slave_updates时表gtid_executed中的getid set不包括最后一个正在使用的二进制日志文件中的gtid
gtid_executed表的记录会定期进行压缩收参数gtid_executed_compression_period控制,二进制日志切换时表数据也会被压缩
GTID的生命周期: 1.在主库上执行事务并提交,在事务提交时会被分配一个GTID
# at 400
#210508 15:32:45 server id 2223306 end_log_pos 465 CRC32 0x20a45196 GTID last_committed=1 sequence_number=2 rbr_only=no
SET @@SESSION.GTID_NEXT= '6d89eaa7-9b6d-11eb-a48b-000c29129b6c:10'/*!*/;
如果未将事务写入二进制日志,不会分配GTID (例如主库过滤某个事务操作)
2.如果为事务分配了GTID,事务提交时,会通过二进制日志中的Gtid_log_event事件把GTID做原子保留,如果二进制日志切换或者server关闭会GTID持久化表mysql.gtid_executed
3.事务分配了GTID,提交之后会将gtid添加到系统变量gtid_executed(@@global.gtid_executed)
mysql> select @@global.gtid_executed;
+-------------------------------------------+
| @@global.gtid_executed |
+-------------------------------------------+
| 6d89eaa7-9b6d-11eb-a48b-000c29129b6c:1-14 |
+-------------------------------------------+
mysql>
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------------------------------+
| mysql-bin.000008 | 194 | | | 6d89eaa7-9b6d-11eb-a48b-000c29129b6c:1-14 |
+------------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)
mysql>
4.将二进制日志文件传输到从库的中继日志之后,从库读取GTID并将读取的GTID设置为系统变量gtid_next的值,告诉从库必须使用此GTID记录下一个事务
5.从库检查在gtid_next中获取的GTID,是否被应用过或者被其他线程占有 从库的系统变量gtid_owned 显示当前正在使用的每个GTID以及拥有它的线程id
6.如果检查发现GTID尚未被使用,则从库应用该事务,应用完毕会把GTID记录到系统变量gtid_executed
GTID自动定位:
GTID自动定位替代了传统复制的文件和位点,启动复制不需要指定MASTER_LOG_FILE和MASTER_LOG_POS
只需要指定MASTER_AUTO_POSITION =1就可以了,在初次建立复制连接时从库携带一个GTID SET其中包括从库已经接收到事务和已经提交的事务(Retrieved_Gtid_Set和Executed_Gtid_Set)主库通过发送未包含在从库携带GTID SET日志来响应,这样主库就知道发送那些日志了
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。