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

MySQL主從GTID複製

一、GTID簡介

GTID是對於一個已提交事務的唯一編號,並且是一個全域性(主從複製)唯一的編號!

GTID官方定義如下:

GTID = source_id :transaction_id
7E11FA47-31CA-19E1-9E56-C43AA21293967:29

什麼是sever_uuid,和Server-id 區別?
核心特性: 全域性唯一,具備冪等性!

二、GTID重要引數

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

三、實驗環境

OS IP hostname service
centos 7.5 192.168.1.1 db01 mysql 5.7.29
centos 7.5 192.168.1.2 db02 mysql 5.7.29
centos 7.5 192.168.1.3 db03 mysql 5.7.29

搭建mysql過程略!

四、清理環境

[root@db01 ~]# systemctl stop mysqld
[root@db01 ~]# rm -rf /usr/local/mysql/data/*
#刪除原始資料庫下的目錄,並且保證資料庫是停止狀態

五、準備配置檔案

master(db01)
[root@db01 ~]# cat > /etc/my.cnf << EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
server_id=1
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/usr/local/mysql/data/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db01[\\d]>
EOF

slave1(db02)
[root@db02 ~]# cat > /etc/my.cnf << EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
server_id=2
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/usr/local/mysql/data/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db02[\\d]>
EOF

slave2(db03)
[root@db03 ~]# cat > /etc/my.cnf << EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
server_id=3
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/usr/local/mysql/data/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db03[\\d]>
EOF

六、初始化資料、啟動資料庫

[root@db01 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql  --datadir=/usr/local/mysql/data
[root@db01 ~]# systemctl start mysqld
#三臺資料都需進行操作

七、構建主從

db01[(none)]>grant replication slave on *.* to repl@'192.168.1.%' identified by '123';
#主庫建立主從複製專用使用者
db02[(none)]>change master to
  master_host='192.168.1.1',
  master_user='repl',
  master_password='123',
  master_auto_position=1;
db02[(none)]> start slave;  
db03[(none)]>change master to
  master_host='192.168.1.1',
  master_user='repl',
  master_password='123',
  master_auto_position=1;
db03[(none)]> start slave;    

八、驗證主從複製

db01[(none)]>show master status;
+------------------+----------+--------------+------------------+----------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                      |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000002 |      447 |              |                  | 8365c1b0-813e-11ea-a031-000c29667213:1 |
+------------------+----------+--------------+------------------+----------------------------------------+
#注意GTID號
db02[(none)]>show slave status \G
           Retrieved_Gtid_Set: 8365c1b0-813e-11ea-a031-000c29667213:1   #需要恢復的GTID號
            Executed_Gtid_Set: 8365c1b0-813e-11ea-a031-000c29667213:1   #已經執行的GTID號
db03[(none)]>show slave status \G
           Retrieved_Gtid_Set: 8365c1b0-813e-11ea-a031-000c29667213:1
            Executed_Gtid_Set: 8365c1b0-813e-11ea-a031-000c29667213:1
#從庫上的GTID號與主庫上的GTID號保持一致,表示同步沒有問題			

九、GTID 複製和普通複製的區別

CHANGE MASTER TO
MASTER_HOST='192.168.1.1',
MASTER_USER='repl',
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='192.168.1.1',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;

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就行。

注意:gtid的主從複製,第一次開啟時,讀取relaylog的最後gtid+gtid_purge引數,確認複製起點!