1. 程式人生 > >MySQL5.7 傳統復制到GTID復制

MySQL5.7 傳統復制到GTID復制

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=699 sequence_number=793

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

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

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

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

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

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


本文出自 “DBAspace” 博客,請務必保留此出處http://dbaspace.blog.51cto.com/6873717/1982765

MySQL5.7 傳統復制到GTID復制