MySQL5.7传统快速切换GTID方法
admin
2023-05-13 09:22:01
0次

本文主要给大家介绍MySQL5.7传统快速切换GTID方法,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下MySQL5.7传统快速切换GTID方法吧。

当前场景:

某些业务场景还未开启GTID服务组,在最新版本中,BINLOG组提交也基于GTID方式,因此如何检测是否符合开启GTID条件,在线切换使用GTID,以及如何快速回滚:

gtid_mode参数新选项:MySQL提供两个额外的选项off_permissive和on_permissive

    gtid-mode的几种状态说明:
        off :不产生gtid,基于binlog+position,slave也不能接受gtid的日志;
        off_permissive:不产生gtid,但做为slave可以识别gtid事务也可以识别非gtid事务;
        on_permissive:产生gtid事务,slave可以处理gtid事务和非gtid事务;
        on:产生gtid事务,slave只接受gtid事务

GTID三个限制

enforce-gtid-consistency=ON时,以下三类语句时不支持的

  • CREATE TABLE ... SELECT statements

  • CREATE TEMPORARY TABLE or DROP TEMPORARY TABLE statements inside transactions

  • Transactions or statements that update both transactional and nontransactional tables. There is an exception that nontransactional DML is allowed in the same transaction or in the same statement as transactional DML, if all nontransactional tables are temporary.

而实际上这个限制没有必要这么严格,

  • CREATE TABLE ... SELECT statements

    对于binlog_format=row, gtid_next='automatic'时可以放开限制。
    生成的binlog包含两个GTID, 一个是建表语句,一个是包含多个insert的事务。

  • 事务中包含事务表和非事务表

    对于gtid_next='automatic'时可以放开限制。
    生成的binlog包含两个GTID, 一个是所有非事务表的,一个是所有事务表的。
    对update多表(包含事务表和非事务表)此时需额外要求binlog_format=row。   

在线开启GTID过程如下:

① 所有的server上执行

    set @@global.enforce_gtid_consistency = warn; 特别注意: 这一步是关建的一步使用不能出现警告。会将不符合的语句记入错误日志

② 所有的server上执行:

    set @@global.enforce_gtid_consistency = on;

③ 所有的Server上执行(不关心最先最后,但要执行完):

    set @@global.gtid_mode = off_permissive;

④ 所有的server上执行: 

  set @@global.gtid_mode=on_permissive;

  实质在这一步骤生成的日志都是带GTID的日志了,这个步骤号称是不关心任何节点,但从实际管理上推荐在slave上先执行,然后再去master上执行。

⑤ 确认传统的binlog复制完毕,该值为0

  show status like 'ongoing_anonymous_transaction_count';

  所有节点进行判断 show status like 'ongoing_anonymous_transaction_count’; 为零

⑥ 所有的节点执行: flush logs; 用于切换一下日志。  

⑦ 所有的节点启用gtid_mode

    set @@global.gtid_mode=on;

⑧ 启用Gtid的自动查找节点复制:

    stop slave;

    change master to master_auto_position=1;

    start slave;

⑨ 把gtid_mode = on相关配置写入配置文件

gtid_mode=on

enforce_gtid_consistency=on

最后可以看到传统复制的一个变化,通过BINLOG观察:

#171116 19:16:57 server id 2  end_log_pos 16188 CRC32 0x75584212 Anonymous_GTIDlast_committed=50sequence_number=51

#171116 19:17:03 server id 2  end_log_pos 16522 CRC32 0x3b42637e Anonymous_GTIDlast_committed=51sequence_number=52

#171116 19:19:54 server id 2  end_log_pos 16851 CRC32 0x08383e43 Anonymous_GTIDlast_committed=52sequence_number=53

#171116 19:19:59 server id 2  end_log_pos 17185 CRC32 0xd3445edc Anonymous_GTIDlast_committed=53sequence_number=54

#171116 19:21:06 server id 2  end_log_pos 17514 CRC32 0xcfd6ac97 Anonymous_GTIDlast_committed=54sequence_number=55

#171116 19:21:11 server id 2  end_log_pos 17802 CRC32 0xee11dc12 Anonymous_GTIDlast_committed=55sequence_number=56

GTID复制数据:

#171117 13:40:00 server id 2  end_log_pos 456322 CRC32 0xf7074b53 GTIDlast_committed=1036sequence_number=1132

#171117 13:40:00 server id 2  end_log_pos 456725 CRC32 0xcb86f0b2 GTIDlast_committed=1036sequence_number=1133

#171117 13:40:00 server id 2  end_log_pos 457128 CRC32 0x8b14303e GTIDlast_committed=1036sequence_number=1134

#171117 13:40:00 server id 2  end_log_pos 457533 CRC32 0x4f492e18 GTIDlast_committed=1036sequence_number=1135

#171117 13:40:00 server id 2  end_log_pos 457940 CRC32 0xf0b078b6 GTIDlast_committed=1036sequence_number=1136

#####从GTID模式到传统模式过程:

① 在SLAVE:

stop slave;

    mysql> show slave status\G;

    *************************** 1. row ***************************

                   Slave_IO_State: 

                      Master_Host: 192.168.1.130

                      Master_User: dlan

                      Master_Port: 3306

                    Connect_Retry: 60

                  Master_Log_File: mysql-bin.000010

              Read_Master_Log_Pos: 458282

               同时执行:

    change master to master_auto_position=0,MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=458282;

    start slave;

②在MS上执行:

SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

③在MS上执行

SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

④在MS上执行

SELECT @@GLOBAL.GTID_OWNED;  ##都为空就可以

⑤关闭GTID

SET @@GLOBAL.GTID_MODE = OFF;

最后观察又GTID又是匿名:

#171117 14:32:38 server id 2  end_log_pos 319730 CRC32 0xc26f13a7 Anonymous_GTID last_committed=699sequence_number=793

#171117 14:32:38 server id 2  end_log_pos 320133 CRC32 0xf480c415 Anonymous_GTIDlast_committed=699sequence_number=794

#171117 14:32:38 server id 2  end_log_pos 320538 CRC32 0xa65ed8f1 Anonymous_GTIDlast_committed=699sequence_number=795

#171117 14:32:38 server id 2  end_log_pos 320945 CRC32 0xb7330b5e Anonymous_GTIDlast_committed=699sequence_number=796

#171117 14:32:38 server id 2  end_log_pos 321348 CRC32 0x619e04bb Anonymous_GTIDlast_committed=699sequence_number=797

#171117 14:32:38 server id 2  end_log_pos 321751 CRC32 0x250f903c Anonymous_GTIDlast_committed=699sequence_number=798

#171117 14:32:38 server id 2  end_log_pos 322156 CRC32 0x247a96f9 Anonymous_GTIDlast_committed=699sequence_number=799

看完以上关于MySQL5.7传统快速切换GTID方法,很多读者朋友肯定多少有一定的了解,如需获取更多的行业知识信息 ,可以持续关注我们的行业资讯栏目的。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...