GTID定義
GTID( Global Transaction Identifier)全域性事務標識。GTID是5.6 版本引入的一個有關於主從複製的重大改進,相對於之前版本基於Binlog檔案+Position的主從複製,基於GTID的主從複製,資料一致性更高,主從資料複製更健壯,主從切換、故障切換不易出錯,很少需要人為介入處理。
表示方式
GTID = server_uuid:transaction_id
其GTID通常會記錄在MySQL的系統變數@@GLOBAL.gtid_executed 以及系統表mysql.gtid_executed中,系統變數@@GLOBAL.gtid_executed 在記憶體中,屬於非持久化儲存,而系統表mysql.gtid_executed屬於持久化儲存。
GTID比傳統複製的優勢
- 更簡單的搭建主從複製
- 更簡單的實現failover (主從切換),不用以前那樣一步一步的去找log_file和log_pos
- GTID是連續的沒有空洞的,保證資料的一致性,零丟失。
- 複製叢集有一個統一的方式識別複製位置,給叢集管理帶來了便利
GTID的限制
- 在一個事務裡面混合使用引擎如Innodb,myisam,造成多個GTIDS
- CREATE TABLE…..SELECT 不能使用
- CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE 不能在事務內使用
主從複製流程圖
GTID生命週期
- 當一個事務在一個主庫上被執行和提交,那麼這個事務就會被分配一個和該主庫uuid相關聯的gtid,這個gtid被寫入到主庫的binlog檔案中。
- 當這個binlog檔案達到最大值發生輪轉,或者MySQL Server關閉時,上一個binlog檔案中的事務GTID將會被寫入到mysql.gtid_executed表中。
- 事務提交時,該事務的gtid會很快的新增到系統變數@@GLOBAL.gtid_executed,但是系統表 mysql.gtid_executed 則不會,應為有部分gtid還在binlog中,需要等到binlog輪轉或者mysqlServer關閉時才會寫入到mysql。gtid_executed表中.
- 主庫上的binlog透過主從複製協議傳送到從庫,並寫入到從庫的relay log(中繼日誌), 從庫讀取relay log中的gtid和對應的事務資訊,把gtid_next設定為該gtid值,使得從庫使用該gtid值應用其對應的事務
- 如果多個執行緒併發應用同一個事務,比如多個執行緒設定gtid_next為同一個值,MySQL Server 只允許其中一個執行緒執行,gtid_owned系統變數記錄著誰擁有該GTID.
傳統更換GTID複製模式
- 配置GTID
- 所有伺服器設定global.read_only引數,等待主從伺服器同步完畢;
mysql> SET @@global.read_only = ON;
- 依次重啟主從伺服器;
- 使用change master 更新主從配置;
5、開啟複製mysql> CHANGE MASTER TO MASTER_HOST = host, MASTER_PORT = port, MASTER_USER = user, MASTER_PASSWORD = password, MASTER_AUTO_POSITION = 1;
6、驗證主從複製mysql> START SLAVE;
mysql> show slave status \G
主庫已有資料的解決方案
對主庫資料進行備份,然後將主資料庫中匯出的資料匯入到從資料庫,然後再開啟主從複製,以此保證主從資料庫一致性。
- 鎖定主資料庫,只允許讀取不允許寫入,這樣做的目的是防止備份過程中或備份完成之後有新資料插入,導致備份資料和主資料資料不一致。
mysql> flush tables with read lock;
- 透過mysql主伺服器上的全備初始化從伺服器上資料:
[root@localhost data]# cd /data/db_backup/ [root@localhost db_backup]# mysqldump -uroot -p --master-data=1 --single-transaction --routines --triggers --events --all-databases > all.sql Enter password:
- 解鎖主資料庫:
unlock tables;
- 把資料全量匯入slave資料庫,保證主從資料一致
本作品採用《CC 協議》,轉載必須註明作者和本文連結