当前场景:

某些业务场景还未开启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