224_mysql_复制技术_复制模式的切换_GTID_MODE&ANONYMOUS
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;
- 点赞
- 收藏
- 关注作者
评论(0)