1. GTID優缺點 MySQL傳統點位複製在5.7版本前是主要的主從複製模式,而隨著MySQL5.6版本引入GTID,並且MySQL5.7進行各方面的優化以後,在mySQL5.7(尤其是MySQL5.7.6)版本後GTID模式的主從複製方式成為一個新的選擇方式。要使用GTID模式,首先也需知其優缺 ...
1. GTID優缺點
MySQL傳統點位複製在5.7版本前是主要的主從複製模式,而隨著MySQL5.6版本引入GTID,並且MySQL5.7進行各方面的優化以後,在mySQL5.7(尤其是MySQL5.7.6)版本後GTID模式的主從複製方式成為一個新的選擇方式。要使用GTID模式,首先也需知其優缺點,其主要的優缺點如下:
1.1 優點
a) 更簡單的實現failover,無需找log_file和log_Pos。
b) 更簡單的搭建主從複製。
c) 複製集群有一個統一的方式識別複製位置,給集群管理帶來了便利。
d) 正常情況下,GTID是連續沒有空洞的,因此主從庫出現數據衝突時,可以用添加空事物的方式進行跳過
1.2 限制
a) 在一個事務裡面混合使用引擎如Innodb(支持事務)、MyISAM(不支持事務), 造成多個GTIDs和同一個事務相關聯出錯
b) CREATE TABLE…..SELECT 不能使用,該語句產生的兩個event在某一情況 會使用同一個GTID(同一個GTID在slave只能被使用一次),使用時會報如下錯誤:
錯誤代碼: 1786 Statement violates GTID consistency: CREATE TABLE ... SELECT.
需改為 create table like tb; insert into tb ... select 方式處理
c) CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE 不能在事務內使用 (啟用了--enforce-gtid-consistency參數)
2. 傳統點位複製線上轉為GTID模式複製
2.1 線上調整的條件
a) 要求MySQL 5.7.6及以後版本。
b) 所有組中節點的gtid_mode 為off狀態。
2.2 線上調整
2.2.1 查看當前狀態
/** 傳統複製下enforce_gtid_consistency gtid_mode 均為OFF **/
mysql> show global variables like 'enforce_gtid_consistency'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | enforce_gtid_consistency | OFF | +--------------------------+-------+ 1 row in set (0.00 sec) mysql> show global variables like 'gtid_mode'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | gtid_mode | OFF | +---------------+-------+ 1 row in set (0.00 sec)
2.2.2 修改enforce_gtid_consistency
所有節點均先將其修改為 WARN,同時註意查看日誌是否出現警告信息,生產環境想調整為GTID模式時,需提前一段時間調整此參數,觀察一段時間,確定無警告後再調整。
/** 所有節點均調整,主從無先後順序 **/ mysql> set global enforce_gtid_consistency =warn; Query OK, 0 rows affected (0.00 sec)
開啟後觀察資料庫日誌,只有在無警告的情況下才可以進行後續的操作。
2019-10-13T06:00:19.723310Z 10588 [Note] Changed ENFORCE_GTID_CONSISTENCY from OFF to WARN.
2.2.3 修改enforce_gtid_consistency = on
將各節點enforce_gtid_consistency 設置為 on,不分順序,但需要全部執行完畢後再進行下一步
mysql> set global enforce_gtid_consistency = on; Query OK, 0 rows affected (0.00 sec)
2.2.4 修改gtid_mode = off_permissive
將各節點gtid_mode設置為 off_permissive,不分順序,但需要全部執行完畢後再進行下一步
mysql> set global gtid_mode = off_permissive; Query OK, 0 rows affected (0.00 sec)
2.2.5 修改gtid_mode=on_permissive
建議先修改從庫的gtid_mode為on_permissive,之後再修改主庫的。此步驟執行完畢後生成的日誌是帶GTID的
mysql> set global gtid_mode=on_permissive; Query OK, 0 rows affected (0.01 sec)
2.2.6 查看狀態
/** 確定傳統方式複製完畢,此時各節點Ongoing_anonymous_transaction_count狀態為0 **/ mysql> show status like 'ongoing_anonymous_transaction_count'; +-------------------------------------+-------+ | Variable_name | Value | +-------------------------------------+-------+ | Ongoing_anonymous_transaction_count | 0 | +-------------------------------------+-------+ 1 row in set (0.00 sec)
/** 切換日誌 **/
mysql> flush logs;
Query OK, 0 rows affected (0.16 sec)
需要所有的節點ongoing_anonymous_transaction_count均為0.
2.2.7 啟用gtid_mode
前面的步驟確認正常後,各節點開啟GTID_MODE
mysql> set global gtid_mode=on; Query OK, 0 rows affected (0.01 sec)
2.3 將傳統複製轉為GTID模式
停止原有複製,切換為gtid模式後,設置為自動查找位置複製。
ql> stop slave; Query OK, 0 rows affected (0.00 sec) mysql> change master to master_auto_position=1; Query OK, 0 rows affected (0.01 sec) mysql> start slave; Query OK, 0 rows affected (0.01 sec)
修改後複製即變為gtid模式。
mysql> SHOW GLOBAL VARIABLES LIKE '%gtid%'; +----------------------------------+--------------------------------------------------------------------------------------------+ | Variable_name | Value | +----------------------------------+--------------------------------------------------------------------------------------------+ | binlog_gtid_simple_recovery | ON | | enforce_gtid_consistency | ON | | gtid_executed | e29d3917-9dbb-11e9-8b64-e4434b6e2c80:1-93632, e595a4ee-9dbb-11e9-a0f5-e4434b6e3094:1-30042 | | gtid_executed_compression_period | 1000 | | gtid_mode | ON | | gtid_owned | | | gtid_purged | e29d3917-9dbb-11e9-8b64-e4434b6e2c80:1-4803, e595a4ee-9dbb-11e9-a0f5-e4434b6e3094:1-30042 | | session_track_gtids | OFF | +----------------------------------+--------------------------------------------------------------------------------------------+ 8 rows in set (0.01 sec)
3. 修改配置文件
在配置文件中添加GTID相關參數,涉及到gtid的參數如下:
server-id:每個MySQL 實例的ID值,不能相同。必選項 gtid_mode = ON: MySQL是開啟GTID模式. enforce-gtid-consistency=on:開啟GTID複製是,保證GTID的一致性. log-bin:MySQL 必須開啟binlog. binlog_format=row: MySQLbinlog 的事實標準,其他格式會導致數據丟失. log-slave-updates=on:級聯複製,當slave接受到master的更新且執行完畢之後,執行的binlog是否寫入slave的binlog記錄中.