1. 程式人生 > 實用技巧 >MYSQL之GTID的主從複製

MYSQL之GTID的主從複製

1.什麼是GTID

GTID(Global Transaction ID)是對於一個已提交事務的唯一編號,並且是一個全域性(主從複製)唯一的編號。
它的官方定義如下:
GTID = source_id :transaction_id
7E11FA47-31CA-19E1-9E56-C43AA21293967:29
什麼是sever_uuid,和Server-id 區別?
核心特性: 全域性唯一,具備冪等性

2.GTID主從複製的優點

1.GTID同步時開啟多個SQL執行緒,每一個庫同步時開啟一個執行緒
2.binlog在rows模式下,binlog內容比尋常的主從更加簡潔
3.GTID主從複製會記錄主從資訊,不需要手動配置binlog和位置點

3.GTID主從複製的缺點

1.備份時更加麻煩,需要額外加一個引數 --set-gtid=on
2.主從複製出現錯誤,沒有辦法跳過錯誤

4.GTID的核心引數

gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1

gtid-mode=on                        --啟用gtid型別,否則就是普通的複製架構
enforce-gtid-consistency=true               --強制GTID的一致性
log-slave-updates=1                 --slave更新是否記入日誌

5.搭建GTID主從複製

1.配置三臺資料庫

#配置第一臺主庫
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1
log_bin=/usr/local/mysql/data/mysql-bin

#配置第一臺從庫
[root@db02 ~]# vim /etc/my.cnf
[mysqld]
server_id=2

#配置第二臺從庫
[root@db03 ~]# vim /etc/my.cnf
[mysqld]
server_id=3

2.檢視是否開啟GTID

mysql> show variables like '%gtid%';
+---------------------------------+-----------+
| Variable_name                   | Value     |
+---------------------------------+-----------+
| binlog_gtid_simple_recovery     | OFF       |
| enforce_gtid_consistency        | OFF       |
| gtid_executed                   |           |
| gtid_mode                       | OFF       |
| gtid_next                       | AUTOMATIC |
| gtid_owned                      |           |
| gtid_purged                     |           |
| simplified_binlog_gtid_recovery | OFF       |
+---------------------------------+-----------+
8 rows in set (0.00 sec)

3.開啟GTID

#主庫配置
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1
log_bin=/usr/local/mysql/data/mysql-bin
gtid_mode=on
enforce_gtid_consistency
log-slave-updates

#從庫1的配置
[root@db02 ~]# vim /etc/my.cnf
[mysqld]
server_id=2
log_bin=/usr/local/mysql/data/mysql-bin
gtid_mode=on
enforce_gtid_consistency
log-slave-updates

#從庫2的配置
[root@db02 ~]# vim /etc/my.cnf
[mysqld]
server_id=3
log_bin=/usr/local/mysql/data/mysql-bin
gtid_mode=on
enforce_gtid_consistency
log-slave-updates

4.主庫建立使用者

mysql> grant replication slave on *.* to rep@'172.16.1.5%' identified by '123';

5.主庫資料同步到從庫

mysqldump -uroot -p -R --triggers --master-data=2 --single-transaction -A > /tmp/full.sql
scp /tmp/full.sql 172.16.1.51:/tmp
mysql < /tmp/full.sql

6.從庫配置主從

mysql> change master to
    -> master_host='172.16.1.51',
    -> master_user='rep',
    -> master_password='123',
    -> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

6.GTID 複製和普通複製的區別

CHANGE MASTER TO
MASTER_HOST='172.16.1.51',
MASTER_USER='rep',
MASTER_PASSWORD='123',
MASTER_PORT=3307,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=444,
MASTER_CONNECT_RETRY=10;

change master to 
master_host='172.16.1.51',
master_user='rep',
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;

(0)在主從複製環境中,主庫發生過的事務,在全域性都是由唯一GTID記錄的,更方便Failover
(1)額外功能引數(3個)
(2)change master to 的時候不再需要binlog 檔名和position號,MASTER_AUTO_POSITION=1;
(3)在複製過程中,從庫不再依賴master.info檔案,而是直接讀取最後一個relaylog的 GTID號
(4) mysqldump備份時,預設會將備份中包含的事務操作,以以下方式
    SET @@GLOBAL.GTID_PURGED='8c49d7ec-7e78-11e8-9638-000c29ca725d:1';
    告訴從庫,我的備份中已經有以上事務,你就不用運行了,直接從下一個GTID開始請求binlog就行。

7.GTID 從庫誤寫入操作處理

檢視監控資訊:
Last_SQL_Error: Error 'Can't create database 'oldboy'; database exists' on query. Default database: 'oldboy'. Query: 'create database oldboy'

Retrieved_Gtid_Set: 71bfa52e-4aae-11e9-ab8c-000c293b577e:1-3
Executed_Gtid_Set:  71bfa52e-4aae-11e9-ab8c-000c293b577e:1-2,
7ca4a2b7-4aae-11e9-859d-000c298720f6:1

注入空事物的方法:

stop slave;
set gtid_next='99279e1e-61b7-11e9-a9fc-000c2928f5dd:3';
begin;commit;
set gtid_next='AUTOMATIC';
    
這裡的xxxxx:N 也就是你的slave sql thread報錯的GTID,或者說是你想要跳過的GTID。
最好的解決方案:重新構建主從環境