[toc]
## 什么是GTID Replication
從 MySQL 5.6.5 開始新增了一種基于 GTID 的復制方式。**通過 GTID 保證了每個在主庫上提交的事務在集群中有一個唯一的ID**。這種方式強化了數據庫的**主備一致性,故障恢復以及容錯能力。** (推薦)
在原來基于二進制日志的復制中,從庫需要告知主庫要從哪個偏移量進行增量同步,如果指定錯誤會造成數據的遺漏,從而造成數據的不一致。借助GTID,在發生主備切換的情況下,MySQL的其它從庫可以自動在新主庫上找到正確的復制位置,這大大簡化了復雜復制拓撲下集群的維護,也減少了人為設置復制位置發生誤操作的風險。另外,基于GTID的復制可以忽略已經執行過的事務,減少了數據發生不一致的風險。
**什么是GTID**
GTID (Global Transaction ID) 是對于一個已提交事務的編號,并且是一個全局唯一的編號。 GTID 實際上 是由 UUID+TID 組成的。其中 UUID 是一個 MySQL 實例的唯一標識。TID 代表了該實例上已經提交的事務數量,并且隨著事務提交單調遞增。下面是一個GTID的具體形式:
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
一組連續的事務可以用`-`連接的事務序號范圍表示。例如:
e6954592-8dba-11e6-af0e-fa163e1cf111:1-5
GTID 集合可以包含來自多個 MySQL 實例的事務,它們之間用逗號分隔。如果來自同一 MySQL 實例的事務序號有多個范圍區間,各組范圍之間用冒號分隔。例如:
e6954592-8dba-11e6-af0e-fa163e1cf111:1-5:11-18,
e6954592-8dba-11e6-af0e-fa163e1cf3f2:1-27
可以使用`SHOW MASTER STATUS`實時看當前的事務執行數。
## 配置步驟
MySQL 版本都為 5.7.26。
master: 172.31.0.2
slave: 172.31.0.3
**GTID主從復制的配置思路:**

1\. **修改MySQL主配置文件**
配置 MySQL 基于GTID的復制
在前文**基于日志點的主從復制**的配置文件`[mysqld]`段中添加以下內容即可:
~~~
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
~~~
在 MySQL 5.6 版本時,基于 GTID 的復制中`log-slave-updates`選項是必須的。但是其增大了從服務器的IO負載, 而在 MySQL 5.7 中該選項已經不是必須項。
2\. **創建具有復制權限的用戶**
~~~
mysql@master> grant replication slave on *.* to 'repl'@'172.31.0.%' identified by '123456';
mysql@master> flush privileges;
~~~
>[danger] 基于 GTID 的復制會自動地將沒有在從庫執行過的事務重放,所以不要在其它從庫上建立相同的賬號。 如果建立了相同的賬戶,有可能造成復制鏈路的錯誤。
3\. **查看主庫與從庫的GTID是否開啟**
```
# 如下圖就代表開啟了
mysql> show variables like "%gtid%";
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | ON |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
```
4\. **查看服務器server\_uuid**
```
mysql> show global variables like '%uuid%';
+---------------+--------------------------------------+
| Variable_name | Value |
+---------------+--------------------------------------+
| server_uuid | 2879c33d-9707-11e9-9d60-0242ac1f0003 |
+---------------+--------------------------------------+
```
5\. **查看主服務器狀態**
```
mysql> show master status;
```
6\. **從庫連接至主庫,開啟復制**
~~~
mysql> CHANGE MASTER TO MASTER_HOST='172.31.0.2',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_AUTO_POSITION=1;
mysql> START SLAVE;
~~~
7\. **啟動成功后查看SLAVE的狀態**
~~~
mysql> SHOW SLAVE STATUS\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
~~~
8\. **驗證主從是否一致**
略
- 【mysql的編程專題①】流程控制與其他語法
- 【mysql的編程專題②】觸發器
- 【mysql的編程專題③】內置函數
- 【mysql的編程專題④】存儲過程
- 【mysql的編程專題⑤】自定義函數
- 【mysql的編程專題⑥】視圖
- 【mysql的設計與優化專題(1)】ER圖,數據建模與數據字典
- 【mysql的設計與優化專題(2)】數據中設計中的范式與反范式
- 【mysql的設計與優化專題(3)】字段類型與合理的選擇字段類型
- 【mysql的設計與優化專題(4)】表的垂直拆分和水平拆分
- 【mysql的設計與優化專題(5)】慢查詢詳解
- 【mysql的設計與優化專題(6)】mysql索引攻略
- 【Mysql問題集錦(1)】mysql不能使用innodb存儲引擎
- 【Mysql進階技巧(2)】利用mysql生成唯一序號
- 【Mysql進階技巧(1)】MySQL的多表關聯與自連接
- 【Mysql高可用架構(1)】基于日志點的主從復制
- 【Mysql高可用架構(2)】主從管理的系統視圖
- 【Mysql高可用架構(3)】基于GTID的主從復制
- 【Mysql高可用架構(4)】在線變更復制類型
- 【Mysql高可用架構(5)】多源復制(多主一從)
- 【Mysql高可用架構(6)】多線程復制
- 【Mysql高可用架構(7)】在線設置復制過濾
- 【Mysql高可用架構(8)】解決主從不一致
- 【Mysql高可用架構(9)】初識mycat以及制作mycat鏡像
- 【Mysql高可用架構(10)】mycat配置mysql讀寫分離
- MyCat 集群部署(HAProxy + MyCat)
- 常用復雜sql語句整理