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时,只会在错误日志提示,不会直接报错,

MySQL在线开启或禁用GTID模式

?

1

2

## 该操作在主从库均执行

set @@global.enforce_gtid_consistency = warn;

2. 设置gtid校验enforce_gtid_consistency为on

观测一段时间(严谨的情况可能观测一天以上),确认上一个步骤未在错误日志中出现相关warning信息后,正式开启gtid一致性校验,当设置为on后,如果再执行create table as select语句则会直接报错

MySQL在线开启或禁用GTID模式

?

1

2

## 该操作在主从库均执行

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

MySQL在线开启或禁用GTID模式

确保回放线程回放的事务都已是gtid事务

MySQL在线开启或禁用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 status\\g

在线关闭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

    10

    stop slave;

    show slave status\\g

    ## 取show slave status\\g中的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 status\\g

    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

    18

    set @@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 status\\g

    2. 在线关闭gtid

    自行判断命令在主库还是从库执行

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    stop slave;

    show slave status\\g

    ## 取show slave status\\g中的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 status\\g

    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

    版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/3882/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

    (0)
    上一篇 2022-07-20 10:15:36
    下一篇 2022-07-20 10:15:52

    软件定制开发公司

    相关阅读

    发表回复

    登录后才能评论
    通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!