GTID 核心原理:全局事務 ID = 精準定位 + 簡化運維
GTID (Global Transaction Identifier) 格式:source_id:transaction_id
source_id = 主庫 server_uuid (自動生成,auto.cnf 存儲)
transaction_id = 該主庫上執行的第 N 個事務 (從 1 遞增)
- 核心承諾: 事務與 GTID 1:1 映射,同一 GTID 在拓撲中至多執行一次
GTID vs 傳統複制 (文件+位置)
| 維度 | 傳統複制 | GTID 複制 |
| 定位方式 | MASTER_LOG_FILE + MASTER_LOG_POS | MASTER_AUTO_POSITION=1 |
| 故障切換 | 需手動計算新位置、易出錯 | 自動定位、CHANGE MASTER TO MASTER_AUTO_POSITION=1 |
| 多級複制 | 極其複雜 | 天然支援 |
| 數據一致性驗證 | 困難 | gtid_executed 集合比對即可 |
| 啟用條件 | 無 | gtid_mode=ON、enforce_gtid_consistency=ON、log_bin、log_slave_updates |
一、環境準備與規劃
| 角色 | 主機名 | IP | Server ID | MySQL 版本 |
| Master | masterdb.example.com | 172.16.88.200 | 1 | 5.6.23 |
| Slave | slavedb.example.com | 172.16.88.205 | 205 | 5.6.23 |
- OS: CentOS 6.5 64位
- 資料目錄:
/data/mysqldata
- 日誌目錄:
/data/mysqlLog/logs
- 用戶/組:
mysql:mysql
二、關鍵配置參數解析 (雙端必備)
## 1. 建立目錄與用戶
mkdir -p /data/mysqldata /data/mysqlLog/logs
groupadd -r mysql && useradd -g mysql -r -s /sbin/nologin -M -d /data/mysqldata mysql
chown -R mysql:mysql /data/mysqldata /data/mysqlLog
## 2. 解壓官方二進制包 (以 5.6.23 為例)
tar xf mysql-5.6.23-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
ln -s /usr/local/mysql-5.6.23-linux-glibc2.5-x86_64 /usr/local/mysql
## 3. 初始化系統表
cd /usr/local/mysql
./scripts/mysql_install_db --user=mysql --datadir=/data/mysqldata/
## 4. 註冊服務與環境
cp support-files/mysql.server /etc/init.d/mysqld
cp support-files/my-default.cnf /etc/my.cnf # 稍後覆蓋為生產配置
chkconfig --add mysqld && chkconfig mysqld on
echo 'export PATH=$PATH:/usr/local/mysql/bin' > /etc/profile.d/mysql.sh && source /etc/profile.d/mysql.sh
## 5. 載入庫/頭文件/Man
ln -s /usr/local/mysql/include /usr/include/mysql
echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf && ldconfig
echo 'MANPATH /usr/local/mysql/man' >> /etc/man.config
四、啟動雙端並建立複制關係
1. 啟動服務
mysql -uroot -p -e "
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'172.16.88.%' IDENTIFIED BY 'ReplPass123!';
FLUSH PRIVILEGES;
"
3. Slave 配置複制並啟動 (GTID 方式無需手動指定 File/Position)
4. 驗證複制狀態
:1-XX
## Executed_Gtid_Set: :1-XX, :1-YY
## Auto_Position: 1
五、測試驗證與常見故障處理
1. 基本寫入測試
2. 常見故障與解決
| 故障現象 | 原因 | 解決 |
| Slave_IO_Running: Connecting | 網絡不通/防火牆/用戶權限/密碼錯誤 | telnet master 3306、檢查防火牆、驗證 GRANT 主機匹配 |
| Slave_SQL_Running: No | SQL 執行錯誤 (主鍵衝突、外鍵失敗、表不存在) | SHOW SLAVE STATUS\G 看 Last_SQL_Error、按需跳過/修復 |
| GTID 集合不一致 | Slave 獨立寫入/誤操作/舊數據 | 重新搭建 Slave 或使用 SET GTID_PURGED 修正 (謹慎) |
| Seconds_Behind_Master 偏大 | 大事務/慢查詢/鎖等待/並行度不足 | 優化 SQL、調大 slave_parallel_workers、檢查主庫負載 |
| 啟用 GTID 報錯 | enforce_gtid_consistency 違規 (如 CREATE TEMPORARY TABLE 在事務中) | 修正應用 SQL 模式、避免非事務表混用 |
六、生產級運維建議
- 監控指標:
Seconds_Behind_Master、Slave_IO/SQL_Running、Relay_Log_Space、GTID 集合一致性
- 備份策略: Slave 停庫物理備份 (XtraBackup) 或邏輯備份 (mysqldump --master-data=2)
- 故障切換: 推薦 Orchestrator / MHA 自動化,利用 GTID 自動定位
- 版本升級: 5.6 → 5.7/8.0 可滾動升級 (Slave 先升、切換、Master 升),GTID 相容
- 安全: 複制專用用戶、最小權限、SSL 加密傳輸、防火牆限制來源 IP
總結
MySQL 5.6 GTID 複制核心優勢在於 自動定位 (MASTER_AUTO_POSITION=1) 與 事務級一致性保證。生產部署必須嚴格遵循:配置核心三件套 (gtid_mode/enforce_gtid_consistency/log_slave_updates) → ROW 格式 + 校驗 → TABLE 存儲庫 → 並行 SQL 線程。搭配 Orchestrator 實現自動故障切換,構建高可用 MySQL 集群。