作者:俊達
MySQL從5.6版本開始支援GTID複製。開啟GTID之後,主庫上執行的每一個事務都有一個全域性唯一的ID。GTID由兩部分組成:server_uuid和事務序列號。初始化資料庫時,會生成一個全域性唯一的server_uuid,server_uuid儲存在datadir下的auto.cnf中:
# cat auto.cnf
[auto]
server-uuid=e7ce5684-09b8-11ee-9dd0-fa8338b09400
如果刪除auto.cnf,重啟例項時會重新生成。事務序列號在事務提交時按順序生成。
GTID事務複製到備庫時,GTID保持不變。開啟GTID有很多優點:
1、MySQL會記錄執行過的GTID事務,這樣就可以避免重複執行同一個事務。如果沒有開啟GTID,change master時如果指定的位點不對,可能會重複執行事務,引起主備資料不一致或複製中斷。
2、change master時支援自動定位,mysql會根據當前例項已經執行過的GTID事務,自動判斷需要同步哪些binlog。
1、主庫開啟GTID
除了常規的引數,主庫需要配置
enforce_gtid_consistency和gtid_mode
enforce_gtid_consistency=ON
gtid_mode=ON
log_bin=/data/mysql5.6/binlog/binlog
log_slave_updates=ON
binlog_format=ROW
server_id=234
2、主庫建立複製賬號
在進行主庫和備庫之間的複製前,需要在主庫上建立一個專用於複製的賬號,並授予相應的許可權。以下是建立複製賬號的步驟:
-- 建立複製賬號
CREATE USER 'rep'@'%' IDENTIFIED BY 'rep123';
-- 授予複製賬號必要的許可權
GRANT REPLICATION SLAVE ON *.* TO 'rep'@'%';
建立完複製賬號後,備庫可以使用這個賬號連線到主庫,並透過複製賬號進行資料同步。在備庫上配置複製時,將會使用這個賬號的憑證資訊。
3、備庫配置
5.6版本開啟GTID時,備庫也必須開啟log-bin和log-slave-updates,否則無法啟動例項。
enforce_gtid_consistency=ON
gtid_mode=ON
log_bin=/data/mysql5.6/binlog/binlog
log_slave_updates=ON
binlog_format=ROW
server_id=236
5.6版本開啟GTID,不設定log-bin和log-slave-updates,例項無法啟動:
2023-06-14 14:56:35 23275 [ERROR] --gtid-mode=ON or UPGRADE_STEP_1 or UPGRADE_STEP_2 requires --log-bin and --log-slave-updates
2023-06-14 14:56:35 23275 [ERROR] Aborting
從5.7版本開始,備庫不開啟binlog和log-slave-updates也可以使用GTID。
4、備庫初始化
這一步和非GTID的步驟基本一樣。不過開啟GTID後,通常需要記錄GTID_PURGED,作為複製的起點。
/opt/mysql5.7/bin/mysqldump -uroot -h127.0.0.1 -P3357 -pabc123 --all-databases \
--master-data=2 --routines --flush-privileges --triggers --events > /tmp/mysql57_dump.sql
--gtid-mode=auto:如果資料庫開啟了GTID,則備份檔案中會加入set global GTID_PURGED=xxx;
5、備庫建立複製通道
change master to master_host='172.16.121.234',master_port=3356,\
master_user='rep',master_password='rep123', master_auto_position=1;
開啟GTID之後,可以在change master時指定master_auto_position=1,啟用自動定位。這樣就不需要指定具體的binlog位點。slave會根據gtid_executed自動計算需要同步主庫的哪些binlog。
更多技術資訊請檢視雲掣官網https://yunche.pro/?t=yrgw