224_mysql_复制技术_复制模式的切换_GTID_MODE&ANONYMOUS

举报
alexsully 发表于 2021/11/13 12:52:20 2021/11/13
【摘要】 GTID_MODE模式的切换

GTID & 传统复制 称为数据同步方法, 也叫复制模式; 依赖不同技术来识别记录的事务, 复制模式使用的事务类型如下:

1 GTID 事务

        GTID = source_id : transaction_id ; 每个GTID 事务使用 Gtid_log_event来记录 GTID信息;例:SET @@SESSION.GTID_NEXT = “xxx-xx-xx:488” 在记录begin语句的 query_log_event之前。 GTID 事务可以根据GTID信息自动寻找事务,也可以基于binlog来寻找 (gtid_mode = on)

 

2 匿名事务

        未启用GTID, 新事物不会分配GTID binlog中为每个匿名事务 使用 Anonymous_gtid_log_event 来记录匿名事务信息(SET @@SESSION.GTID_NEXT=’ANONYMOUS’), 位于BEGIN语句的query_log_event之前. 不具备GTID复制模式的自动定位功能,需要手动指定 binlog & position  (gtid_mode = off )

备注

  • 1 Gtid_mode 有两个附加值, off_permissive & on_permissive  
        gtid_mode = off_permissive时,master产生事务是匿名事务, 允许从库重放 GTID事务和匿名事务

        gtid_mode = on_permissive时,master产生事务是GTID事务时, 允许从库重放GTID 事务和匿名事务
  • 2 gtid_mode 的 有效值列表正向顺序:off, off_permissive, on_permissive, on; 只能按照该顺序逐一变更,不能跨着变更
  • 3 GTID 记录持久化在mysql.gtid_executed 表中 方便 gtid_mode发生变化,都可以追踪到 GTID相关信息
  • 4 其它信息配合 无论怎么变 gtid_mode, 都可以追到 gtid信息, 配合表如下

Performance_schema.replication_connection_status 新增 received_transaction_set

Mysql.gtid_executed 表和 系统变量 gtid_purged

Show slave status 新增: retrieve_gtid_set executed_gtid_set

Performance_schema.replication_applier_status_by_worker 新增 LAST_SEEN_TRANSACTION(启动时显示一个GTID字串,不启动显示anonymous)

主从 gtid_mode 兼容性 gtid_mode=on 可以自动定位, 如果碰到匿名事务 会报错 

                                              主

OFF

OFF_PERMISSIVE

ON_PERMISSIVE

ON

OFF

Y

Y

N

N

OFF_PERMISSIVE

Y

Y

Y

Y

ON_PERMISSIVE

Y

Y

Y

Y

ON

N

N

Y

Y

gtid_mode 影响 gtid_next值; SOURCE_ID:TRANSACTION:ID 表示可以通过指定gtid_next的值

SET @@SESSION.GTID_NEXT= 'e99ae99a-811d-11e9-9ca2-0050568cef02:9';

SET @@SESSION.GTID_NEXT='AUTOMATIC';

                                               gtid_next

gtid_mode

AUTOMATIC且

开启binlog

AUTOMATIC 且

关闭binlog

匿名事务

ANONYMOUS

指定一个

Source_id:transaction:id

OFF

ANONYMOUS

ANONYMOUS

ANONYMOUS

ERROR

OFF_PERMISSIVE

ANONYMOUS

ANONYMOUS

ANONYMOUS

SOURCE_ID:TRANSACTION_ID

ON_PERMISSIVE

NEW GTID

ANONYMOUS

ANONYMOUS

SOURCE_ID:TRANSACTION_ID

ON

NEW GTID

ANONYMOUS

ERROR

SOURCE_ID:TRANSACTION_ID

3 传统复制在线变更为GTID复制

前置条件:1 5.7.6以上版本,2 gtid_mode = OFF

1 主备:SET @@global.enfore_gtid_consistency = warn;
		show variables like "enforce_gtid_consistency";
		select sleep(60);
		grep -IE "warn|note" /data/mysqldata1/log/error.log | tail -100

 #OFF_PERMISSIVE模式下 GTID是匿名事务
 
 #主备都操作
2 set @@global.enforce_gtid_consistency = on;
3 set @@global.gtid_mode = OFF_PERMISSIVE;
  show global variables like "gtid_executed" #如果返回空,表示未出现GTID,正常

4 set @@global.gtid_mode = ON_PERMISSIVE;
  SHOW global variables like "gtid_executed" # 此时 主备GTID_EXECUTED 会产生GTID SET 

  主备都操作 #等待ONGOING_ANONYMOUS_TRANSACTION_COUNT 变为0 
5 show status like "ongoing_anonymous_transaction_count"  #等其变为0,才能进入下一步

6 如果备机承担备份任务,手动触发一次 flush logs,在做一次全备,然后清理处当前binlog外所有的binlog,保证在下一步之前 binlog中没有匿名事务
 主库: show master status; #查看file  &  position
 从库: select master_pos_wait("file", "position")  # 必须返回0,不为0 重复执行这个查询 直到0
        FLOSH LOGS # 触发将GTID 记录到 mysql.gtid_executed表中

 主库: Flush logs 
		show master status ;  # file  &  position
 
 从库: flush logs
        show  master status ; # file & position
		备份server 执行备份数据 &  binlog 操作
		
 # 清除binlog 最新的除外
  主库: purge binary logs to "file"
  从库: purge binary logs to "file"

7 主备:set @@global.gtid_mode = on

8 主备 添加配置文件:gtid_mode = on & enforce_gtid_consistency = on 

9 此时主备所有事物都具体GTID
  stop slave 
  change master to  master_auto_position = 1
  start slave 
  show slave status  #主从延迟不会过大, 如果过大使用pt_table_checksum校验主从数据的一致性
  

4  GTID 复制在线变更为传统复制

1 前置条件:5.7.6以上版本 & gtid_mode = on 

2 过程
  1 slave:show global variables like "gtid_executed" #找到gtid set
		 stop slave
 		 show slave status \G; #找到master_log_file, read_master_log_pos; relay_log_file; relay_log_pos值
         change master to relay_log_file = "file" , relay_log_pos = "pos", master_auto_position = 0
		 start slave ; 
		 show slave status \G;
	
  2 主从:set @@global.gtid_mode = ON_PERMISSIVE;
  3 主从:set @@global.gtid_mode = OFF_PERMISSIVE;
    主:  show global variables like "gtid_executed"   # gtid_set 
	从:  show global variables like "gtid_executed"   # gtid_set 
	
4 主从上等待 @@GLOBAL.GTID_OWNED值变为空串
	主从: select @@global.gtid_owned 

5 等待主binlog日志同步到从库 且应用完成
	主:show master status ;  # file & position 
	从: select master_pos_wait ("file", "pos")  #必须返回0 ,表示主的所有GTID事务已经到从库
	
6 清除binlog 
	主: select * from mysql.gtid_executed;
		 flush logs;
		 show master status ; # file1 & position
	
	从: flush logs;
		 show master status ;  #file2& position
		 
	主: purge binary logs to "file1"
    从: purge binary logs to "file2"

7 主从: set  @@global.gtid_mode = OFF

8  主从改配置文件 gitd_mode = OFF  & ENFORCE_GTID_CONSISTENCY = OFF	

5 GTID 复制离线变更为传统复制

1 停业务 等待从库追上主库的数据
	show slave status \G 
	比较master_log_file和relay_master_log_file 
	比较read_master_log_pos 和 exec_master_log_pos
	如果相等 则代表已经追上
	
2 配置文件:gtid_mode = OFF  & enforce_gtid_consistency = OFF

3 清理相关日志
	主从: Flush binary logs;
	主 : show master status ;  #file & position & executed_gtid_set
		  purge binary logs to "file"
		  service mysqld restart 
	从 : stop slave 
		  show slave status \G #获取 relay_log_file & relay_log_pos值 
		  change master to relay_log_file = "file" , relay_log_pos = "xxx" , master_auto_position=0;
		  start slave ;
		  show slave status \G;

6 传统复制离线变更为GTID 复制

1 停业务 等待从库追上主库的数据
	show slave status \G 
	比较master_log_file和relay_master_log_file 
	比较read_master_log_pos 和 exec_master_log_pos
	如果相等 则代表已经追上
	
2 配置文件:gtid_mode = ON  & enforce_gtid_consistency = ON 

3 清理相关日志
	主从: Flush binary logs;
	主 : show master status ;  #file & position & executed_gtid_set
		  purge binary logs to "file"
		  service mysqld restart 
	从 : stop slave 
		  change master  master_auto_position=1;
		  start slave ;
		  show slave status \G;

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。