1. 程式人生 > >MySQL5.7新特性——gtid基礎

MySQL5.7新特性——gtid基礎

mysql 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 |

+--------------------------------------+----------------+--------------+

壓縮後

+--------------------------------------+----------------+--------------+

| source_uuid | interval_start | interval_end |

+--------------------------------------+----------------+--------------+

| 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

BEGIN;

INSERT INTO innodb_tbl(…);

CREATE TEMPORARY TABLE temp1;

...

COMMIT;



啟用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。


本文出自 “笨小孩的dba之路” 博客,請務必保留此出處http://fengfeng688.blog.51cto.com/4896812/1924994

MySQL5.7新特性——gtid基礎