MySQL主從GTID複製
阿新 • • 發佈:2020-12-27
一、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引數,確認複製起點!