MySQL 5.7引入了GTID (Global Transaction Identifier) 來替代傳統(tǒng)的基于文件名和位置的復(fù)制方式。GTID可以唯一標(biāo)識(shí)一個(gè)事務(wù),使得在主庫(kù)上發(fā)生的所有事務(wù)變化都能夠被追蹤到從庫(kù)上,并且不需要考慮主庫(kù)上的binlog文件被輪換或丟失。
GTID采用了兩個(gè)概念 - GTID域和GTID集。GTID域標(biāo)識(shí)一個(gè)事務(wù)的來源,通常對(duì)應(yīng)著主庫(kù)的一個(gè)獨(dú)立實(shí)例或主從復(fù)制組。GTID集是一個(gè)由多個(gè)GTID域組成的序列,代表了從庫(kù)已經(jīng)執(zhí)行過的所有事務(wù)。
啟用GTID主從復(fù)制需要以下步驟:
1. 在主庫(kù)和從庫(kù)上都將gtid_mode參數(shù)設(shè)置為ON:
mysql> SET gtid_mode=ON;
2. 在主庫(kù)上開啟binlog,并設(shè)置binlog_format為ROW:
[mysqld]
log-bin=mysql-bin
binlog-format=ROW
3. 為主庫(kù)上的每個(gè)可復(fù)制表創(chuàng)建一個(gè)唯一的server_uuid:
mysql> ALTER TABLE table_name ADD COLUMN server_uuid CHAR(36) DEFAULT '${uuid}';
其中$ {uuid}應(yīng)該被替換為一個(gè)全局唯一的字符串。
4. 使用CHANGE MASTER語(yǔ)句在從庫(kù)上指定主庫(kù)的地址以及用于復(fù)制的憑證,并啟用gtid_mode:
mysql> CHANGE MASTER TO
MASTER_HOST='master_host_name',
MASTER_PORT=3306,
MASTER_USER='replication_user_name',
MASTER_PASSWORD='replication_password',
MASTER_AUTO_POSITION=1;
上述步驟完成后,從庫(kù)會(huì)自動(dòng)連接主庫(kù)并開始復(fù)制數(shù)據(jù)。如果從庫(kù)上原來已有數(shù)據(jù),會(huì)將之清空并重新從主庫(kù)上拉取數(shù)據(jù)。
在GTID主從復(fù)制中,如果從庫(kù)發(fā)生了錯(cuò)誤斷開連接,其可以嘗試重新連接主庫(kù)并自動(dòng)從斷點(diǎn)開始復(fù)制。
此外,在出現(xiàn)主從同步延遲(如網(wǎng)絡(luò)故障等)時(shí),GTID能夠更快的修復(fù)該問題。在傳統(tǒng)的基于文件名和位置的復(fù)制方式下,需要手動(dòng)定位到兩個(gè)庫(kù)之間的文件位置進(jìn)行同步修復(fù),而GTID則能夠自動(dòng)查找需要修復(fù)的事務(wù)。