天天看點

MySQL5.7新特性——gtid基礎

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 ,如需轉載請自行聯系原作者