各位用户为了找寻关于MySQL在线开启或禁用GTID模式的资料费劲了很多周折。这里教程网为您整理了关于MySQL在线开启或禁用GTID模式的相关资料,仅供查阅,以下为您介绍关于MySQL在线开启或禁用GTID模式的详细内容
目录
基本概述 在线开启gtid 1. 设置gtid校验enforce_gtid_consistency为warn 2. 设置gtid校验enforce_gtid_consistency为on 3. 设置gtid_mode为off_permissive 4. 设置gtid_mode为on_permissive 5. (关键点)确保匿名事务回放完毕 6. 触发一轮日志切换flush logs 7. 正式开启gtid_mode为on 8. 修改配置文件确保gtid参数持久化 9. 修改复制模式为gtid方式 在线关闭gtid 1. 将复制改为基于pos点方式 2. 设置gtid_mode为on_permissive 3. 设置gtid_mode为off_permissive 4. (关键点)确保gtid事务回放完毕 5. 触发flush logs 6. 设置gtid_mode为off 7. 设置enforce_gtid_consistency为off 8. 修改my.cnf配置文件中gtid相关参数为off 命令简版 1. 在线开启gtid 2. 在线关闭gtid 参考链接
基本概述
我们知道mysql有2种方式指定复制同步的方式,分别为:
基于binlog文件名及位点的指定方式- 匿名事务(anonymous_gtid_log_event)
基于gtid(全局事务id)的指定方式- gtid事务(gtid_log_event)
而基于gtid的方式一方面在一主多从的架构下主从切换有着明显优势外,对于日常复制异常的故障诊断方面也更为方便,从mysql 5.7.6之后便开始支持动态开启和关闭gtid模式,其参数gtid_mode有以下取值
off - 只允许匿名事务被复制同步 off_permissive - 新产生的事务都是匿名事务,但也允许有gtid事务被复制同步 on_permissive - 新产生的都是gtid事务,但也允许有匿名事务被复制同步 on - 只允许gtid事务被复制同步
在线开启gtid
1. 设置gtid校验enforce_gtid_consistency为warn
该操作的目的是允许在主库执行的sql语句违反gtid一致性校验,且只在主库的错误日志中输出warning级别日志以作提醒,目的是为了考虑如果复制方式改为gtid模式后应用程序不会因为gtid的一些限制导致异常报错,
如:使用create table as select语法在gtid模式下不支持,而enforce_gtid_consistency设置为warn时,只会在错误日志提示,不会直接报错,
## 该操作在主从库均执行
set
@@
global
.enforce_gtid_consistency = warn;
2. 设置gtid校验enforce_gtid_consistency为on
观测一段时间(严谨的情况可能观测一天以上),确认上一个步骤未在错误日志中出现相关warning信息后,正式开启gtid一致性校验,当设置为on后,如果再执行create table as select语句则会直接报错
## 该操作在主从库均执行
set
@@
global
.enforce_gtid_consistency =
on
;
3. 设置gtid_mode为off_permissive
该操作是一个过渡属性,表示新产生的事务依旧是匿名事务,但也允许有gtid事务被复制同步
? 1 2## 该操作在主从库均执行
set
@@
global
.gtid_mode = off_permissive;
4. 设置gtid_mode为on_permissive
该操作依旧是一个过渡属性,而其表示的则是新产生的都是gtid事务,但也允许有匿名事务被复制
? 1 2## 该操作在主从库均执行
set
@@
global
.gtid_mode = on_permissive;
5. (关键点)确保匿名事务回放完毕
该步骤的目的是确保在正式转换为完整的gtid模式前,老的匿名事务均以被回放完毕,确保gtid_mode设置为on时,不会因为残留的匿名事务导致复制同步报错,有以下2种方式进行校验
? 1 2 3 4 5 6 7## 该操作仅在从库执行即可
## 方式1:确保该状态值输出的匿名事务数显示为0(注意:只要出现过0即可表示已经转换完成,即使后续该状态值从0变为了大于0的值也不影响)
show status
like
'ongoing_anonymous_transaction_count'
;
## 在从库上多次执行该语句
## 方式2: 查询该视图中last_seen_transaction可以观测当前同步的事务是否还存在anonymous事务
select
*
from
performance_schema.replication_applier_status_by_worker;
确保匿名事务数为0
确保回放线程回放的事务都已是gtid事务
6. 触发一轮日志切换flush logs
该操作的目的是为了在主库触发binlog的轮换,使新生成的binlog都是包含gtid的事务(防止一个binlog中包含2种类型的事务日志)
? 1 2## 该操作仅在主库执行即可
flush logs;
7. 正式开启gtid_mode为on
正式开启gtid
? 1 2 3## 该操作在主从库均执行
set
@@
global
.gtid_mode =
on
;
select
@@gtid_mode,@@enforce_gtid_consistency;
8. 修改配置文件确保gtid参数持久化
在my.cnf配置文件中增加gtid参数,确保重启不会失效,该操作也可在第一步进行
? 1 2 3## 该操作在主从库均执行
gtid-mode =
on
enforce-gtid-consistency = 1
9. 修改复制模式为gtid方式
将复制模式从基于pos点改为基于gtid
? 1 2 3 4 5 6 7 8 9 10 11## 停止复制
stop slave;
## 修改为gtid模式
change master
to
master_auto_position = 1;
## 开启复制
start slave;
## 观测复制同步状态
show slave statusg
在线关闭gtid
方式类似于在线开启gtid的逆向操作,以下只写出步骤和具体命令,不做详细解释
先将gtid模式的复制改为基于pos点的复制 设置gtid_mode为on_permissive 设置gtid_mode为off_permissive 观测gtid_owned状态变量变为空值及replication_applier_status_by_worker表中事务均转为匿名事务 触发flush logs 设置gtid_mode为off 设置enforce_gtid_consistency为off 修改my.cnf配置文件中gtid相关参数为off
1. 将复制改为基于pos点方式
? 1 2 3 4 5 6 7 8 9 10stop slave;
show slave statusg
## 取show slave statusg中的master_log_file和exec_master_log_pos填入
change master
to
master_auto_position = 0,
master_log_file=
'mysql-bin.000017'
,
master_log_pos=224126137;
start slave;
show slave statusg
2. 设置gtid_mode为on_permissive
? 1 2## 该操作在主从库均执行
set
@@
global
.gtid_mode = on_permissive;
3. 设置gtid_mode为off_permissive
? 1 2## 该操作在主从库均执行
set
@@
global
.gtid_mode = off_permissive;
4. (关键点)确保gtid事务回放完毕
观测gtid_owned状态变量变为空值及replication_applier_status_by_worker表中事务均转为匿名事务
? 1 2 3## 该操作在从库执行即可
select
@@
global
.gtid_owned;
select
*
from
performance_schema.replication_applier_status_by_worker;
5. 触发flush logs
? 1 2## 该操作在主库执行即可
flush logs;
6. 设置gtid_mode为off
? 1 2## 该操作在主从库均执行
set
@@
global
.gtid_mode =
off
;
7. 设置enforce_gtid_consistency为off
? 1 2## 该操作在主从库均执行
set
@@
global
.enforce_gtid_consistency =
off
;
8. 修改my.cnf配置文件中gtid相关参数为off
? 1 2 3## 该操作在主从库均执行
gtid-mode =
off
enforce-gtid-consistency = 1
命令简版
1. 在线开启gtid
自行判断命令在主库还是从库执行
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18set
@@
global
.enforce_gtid_consistency = warn;
set
@@
global
.enforce_gtid_consistency =
on
;
set
@@
global
.gtid_mode = off_permissive;
set
@@
global
.gtid_mode = on_permissive;
show status
like
'ongoing_anonymous_transaction_count'
;
select
*
from
performance_schema.replication_applier_status_by_worker;
flush logs;
set
@@
global
.gtid_mode =
on
;
## 配置文件修改
gtid-mode =
on
enforce-gtid-consistency = 1
## 将复制模式从基于pos点改为基于gtid
stop slave;
change master
to
master_auto_position = 1;
start slave;
show slave statusg
2. 在线关闭gtid
自行判断命令在主库还是从库执行
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22stop slave;
show slave statusg
## 取show slave statusg中的master_log_file和exec_master_log_pos填入
change master
to
master_auto_position = 0,
master_log_file=
'mysql-bin.000017'
,
master_log_pos=224126137;
start slave;
show slave statusg
set
@@
global
.gtid_mode = on_permissive;
set
@@
global
.gtid_mode = off_permissive;
select
@@
global
.gtid_owned;
select
*
from
performance_schema.replication_applier_status_by_worker;
flush logs;
set
@@
global
.gtid_mode =
off
;
set
@@
global
.enforce_gtid_consistency =
off
;
## 修改my.cnf配置文件中gtid相关参数为
off
gtid-mode =
off
enforce-gtid-consistency = 1
参考链接
https://dev.mysql.com/doc/refman/5.7/en/replication-mode-change-online.html
https://dev.mysql.com/doc/refman/5.7/en/replication-mode-change-online-enable-gtids.html
https://dev.mysql.com/doc/refman/5.7/en/replication-mode-change-online-disable-gtids.html
以上所述是小编给大家介绍的mysql在线开启或禁用gtid模式,希望对大家有所帮助。在此也非常感谢大家对网站的支持!
原文链接:https://www.cnblogs.com/zhenxing/p/15612793.html