全域交易識別碼(GTID)是 MySQL 5.6 版本引入的重要特性,它為每個已提交的事務分配一個全域唯一的 ID,由伺服器 UUID 與事務序號組成。這項機制徹底改變了傳統基於二進制日誌檔案與位置的復制方式,讓主從架構的部署、故障切換與數據一致性保證變得更加簡單可靠。本文將系統性地介紹 GTID 的核心概念、優勢、工作原理,並提供生產環境可用的完整配置步驟。
source_id:transaction_id,其中 source_id 即伺服器的 server_uuid,transaction_id 為該伺服器上已提交事務的遞增序號(從 1 開始)。MASTER_AUTO_POSITION=1,無需手動指定 MASTER_LOG_FILE 與 MASTER_LOG_POS。log_bin 並設置 log_slave_updates=1,以記錄已執行的 GTID 集合。GTID = source_id:transaction_id
source_id:來源伺服器標識,即 server_uuid(例如 3E11FA47-71CA-11E1-9E33-C80AA9429562)
transaction_id:該伺服器上已提交事務的序號(例如 23)
示例:3E11FA47-71CA-11E1-9E33-C80AA9429562:23
CHANGE MASTER TO ... MASTER_AUTO_POSITION=1 即可。enforce_gtid_consistency 可杜絕非事務性操作導致的數據不一致。gtid_next 變量,告知下一個待執行的 GTID。[mysqld]
# GTID 核心
server_id=135
gtid_mode=ON
enforce_gtid_consistency=ON
# Binlog 設置
log_bin=master-binlog
log_slave_updates=1
binlog_format=ROW # 強烈建議 ROW 格式,避免數據不一致
# Relay Log
skip_slave_start=1 # 防止意外自動啟動 Slave
[mysqld]
# GTID 核心
gtid_mode=ON
enforce_gtid_consistency=ON
server_id=143
# Binlog 設置(從庫必開)
log_bin=slave-binlog
log_slave_updates=1
binlog_format=ROW
# Relay Log
skip_slave_start=1
說明:enforce_gtid_consistency=ON 會限制部分語法(如 CREATE TABLE ... SELECT、臨時表與事務表混用等),請提前評估業務兼容性。
my.cnf 並重啟 MySQL。CREATE USER 'repl'@'%' IDENTIFIED BY 'strong_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';CHANGE MASTER TO
MASTER_HOST='192.168.1.135',
MASTER_USER='repl',
MASTER_PASSWORD='strong_password',
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1;
START SLAVE;SHOW SLAVE STATUS\G 確認 Slave_IO_Running 與 Slave_SQL_Running 均為 Yes。SET GLOBAL read_only = ON;START SLAVE; SHOW SLAVE STATUS\GROW 格式,STATEMENT 或 MIXED 在特定場景下會導致 GTID 不一致。server_id 必須唯一,否則會導致 GTID 衝突。Retrieved_Gtid_Set、Executed_Gtid_Set 差異,及時發現延遲或斷點。mysqldump --set-gtid-purged=ON 或 Percona XtraBackup 保證備份包含 GTID 資訊,便於快速構建新從庫。GTID 通過全域唯一事務標識,將 MySQL 複製從「基於位置」升級為「基於事務」,極大地降低了運維複雜度,提升了數據一致性保障。遵循本文的配置規範與部署流程,可快速構建穩健、易維護的高可用 MySQL 架構。