1、MySQL5.7 新特性:gtid複制
①:GTID是什麼
是事務的ID,唯一識别号,全局唯一。
随事務記錄到Binary Log中,用來辨別事務。
每個事務有一個Gtid_log_event。
②:GTID的構成
UUID + Sequence Number
注意:Sequence Number是MySQL伺服器内部的一個事務順序号.一個MySQL伺服器上的事務不會有重複的順序号(保證伺服器内唯一)。
每個MySQL伺服器有一個全局唯一的UUID.
③:GTID的目的
簡化複制的使用過程和降低複制叢集維護的難度:不再依賴Master的binlog檔案名和檔案中的位置。
由 CHANGE MASTER TO MASTER_LOG_FILE=‘Master-bin.000010’, MASTER_LOG_POS=‘214’; 改為:CHANGE MASTER TO AUTO_POSITION=1;
④:AUTO_POSITION的原理
*:MySQL Server 記錄了所有已經執行了的事務的GTID,包括複制過來的。
可用過系統變量Gtid_executed檢視。
*:Slave記錄了所有從master接收過來的事務的GTID。
可通過Retrieve_gtid_set檢視
*:Slave連接配接到Master時,會把gtid_executed中的gtid發給master. Master會自動跳過這些事務,隻将沒有複制的事物發送到Slave去。
⑤:MySQL5.7GTID線上啟用GTID功能的優點
不需要重新開機MySQL伺服器.
配置過程線上,整個複制叢集仍然對外提供讀和寫的服務.
不需要改變複制拓撲結構.
可以在任何結構的複制叢集中線上啟用GTID功能.
更簡單的搭建主從複制。
比傳統的複制更加安全。
GTID是連續的沒有空洞的,保證資料的一緻性,零丢失。
⑥:GTID的開啟場景
新系統搭建時直接開啟GTID功能
老系統更新到MySQL5.7後開啟GTID功能
老系統開啟GTID的複雜性
複制叢集中有的開啟了GTID,有的沒有開啟。
開啟前的BINLOG中的事務沒有GTID,開啟後的有GTID
GTID啟動過程中的模式:
全局系統變量GTID_MODE
OFF 不産生GTID, Slave隻接受不帶GTID的事務
OFF_PERMISSIVE 不産生GTID, Slave即接受不帶GTID的事務也接受帶GTID的事務
ON_PERMISSIVE 産生GTID, Slave即接受不帶GTID的事務也接受帶GTID的事務
ON 産生GTID, Slave隻接受帶GTID的事務
⑦:簡化的配置過程
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE; (在每一個伺服器上設定)
SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE; (在每一個伺服器上設定)
等一段時間, 讓不帶GTID的binlog events在所有的伺服器上執行完畢。
SET @@GLOBAL.GTID_MODE = ON; (在每一個伺服器上設定)
存儲GTID到表中的目的:
支援Slave不開啟Binlog的場景
有些Slave永遠不會被切換成Master.不開啟binlog,可以節省空間,提高性能。
MySQL5.6上GTID隻能存儲在binlog中,是以必須開啟Binlog才能使用GTID功能。
MySQL5.7則不需要開啟binlog了。
如何記錄GTID到表中
如果開啟了binlog,在切換binlog時,将目前binlog的所有GTID插入gtid_executed表中。插入操作等價于一個或多個INSERT語句。
INSERT INTO mysql.gtid_executed(UUID, 1, 100)
如果沒有開啟binlog,每個事務在送出之前,會執行一個等價的INSERT的操作。此操作是該事務的一部分,和事務的其他操作整體保持原子性。
BEGIN;
…
INSERT INTO mysql.gtid_executed(UUID, 101, 101);
COMMIT;
gtid_executed表的壓縮:
壓縮前
+--------------------------------------+----------------+--------------+
| source_uuid | interval_start | interval_end |
| xxxxxxxx-4733-11e6-91fe-507b9d0eac6d | 1 | 1 |
| xxxxxxxx-4733-11e6-91fe-507b9d0eac6d | 2 | 2 |
| xxxxxxxx-4733-11e6-91fe-507b9d0eac6d | 3 | 3 |
壓縮後
| xxxxxxxx-4733-11e6-91fe-507b9d0eac6d | 1 | 3 |
控制壓縮頻率
mysql> SET GLOBAL gtid_executed_compression_period = N; (N – 事務的數量)
GTID的受限語句檢測:
GTID不支援的語句/事務:
CREATE TABLE … SELECT
事務中同時使用了支援事務和不支援事務的引擎。
BEGIN;
INSERT INTO innodb_tbl(…);
INSERT INTO myisam_tbl(…);
COMMIT;
在事務中使用CREATE/DROP TEMPORARY TABLE
CREATE TEMPORARY TABLE temp1;
...
啟用GTID前,檢測系統中是否有GTID不支援的語句/事務,提前處理。
全局系統變量enforce-gtid-consistency
OFF :不檢測是否有GTID不支援的語句/事務
WARN :當發現不支援的語句/事務時,傳回警告,并在日志中記錄警告資訊。
ON :當發現語句/事務不支援GTID時,傳回錯誤。
+---------+------+---------------------------------------------------------------+
| Level | Code | Message |
| Warning | 1786 | Statement violates GTID consistency: CREATE TABLE ... SELECT. |
線上上的資料庫伺服器或測試環境中,開啟WARN模式。
處理完GTID不支援的語句後,再啟用GTID。
本文轉自一個笨小孩51CTO部落格,原文連結:http://blog.51cto.com/fengfeng688/1924994 ,如需轉載請自行聯系原作者