前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql复制系列3-传统复制和GTID复制

mysql复制系列3-传统复制和GTID复制

原创
作者头像
wangwei-dba
修改2021-05-11 18:09:05
9510
修改2021-05-11 18:09:05
举报
文章被收录于专栏:mysql-dba

在mysql5.6之前的版本支持传统的复制,即基于二进制文件和位置的复制。mysql5.6及其以后的版本支持基于GTID的复制,有了GTID复制不需要指定文件和位置了,复制会自动找二进制日志和位置

传统复制:

在做主从复制需要指定文件和位置,在做主从切换或者故障恢复时需要准确找到log_file和pos

代码语言:javascript
复制
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

代码语言:javascript
复制
开启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

代码语言:javascript
复制
# 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)

代码语言:javascript
复制
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 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档