MySQL 主從複制是高可用、讀寫分離、備份卸載的基石。本文以 **GTID 模式(MySQL 5.6+ 推薦)** 為核心,詳細演示:主庫配置、從庫配置、手動資料同步(xtrabackup/物理備份)、CHANGE MASTER TO 精確定位、啟動複制、驗證與常見故障處理。非 GTID 傳統模式(File+Position)亦標註差異。
# /etc/my.cnf [mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON
expire_logs_days = 7
sync_binlog = 1
binlog_expire_logs_seconds = 604800
重啟主庫:systemctl restart mysqld
CREATE USER 'repl_user'@'10.0.0.%' IDENTIFIED BY 'StrongPass@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'10.0.0.%';
FLUSH PRIVILEGES;
# /etc/my.cnf [mysqld]
server-id = 2
log_bin = mysql-bin # 從庫也開 Binlog,支援鏈式複制、備份
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON
relay_log = relay-bin
relay_log_index = relay-bin.index
max_relay_log_size = 1G
relay_log_purge = 1
relay_log_recovery = ON
read_only = ON # 從庫預設唯讀,防誤寫入
super_read_only = ON # 8.0+ 連 SUPER 權限也限制
重啟從庫:systemctl restart mysqld
# 1. 主庫備份
xtrabackup --backup --target-dir=/backup/full_$(date +%F) --user=root --password=xxx --datadir=/data/mysql
# 2. 備份檔傳輸到從庫(scp/rsync)
rsync -avz /backup/full_20231001/ 10.0.0.2:/data/mysql/
# 3. 從庫準備備份(應用 Redo Log)
xtrabackup --prepare --target-dir=/data/mysql
# 4. 修正權限、啟動
chown -R mysql:mysql /data/mysql
systemctl start mysqld
# 主庫導出(單線程、含 GTID)
mysqldump --single-transaction --master-data=2 --flush-logs --routines --triggers --events --all-databases -uroot -p > /backup/full.sql
# 傳輸到從庫導入
mysql -uroot -p < /backup/full.sql
關鍵:--master-data=2 會在輸出中註釋 CHANGE MASTER TO 位置(非 GTID 模式用);GTID 模式下 mysqldump 自動包含 SET @@GLOBAL.GTID_PURGED。
-- 從庫執行
CHANGE MASTER TO
MASTER_HOST = '10.0.0.1',
MASTER_PORT = 3306,
MASTER_USER = 'repl_user',
MASTER_PASSWORD = 'StrongPass@123',
MASTER_AUTO_POSITION = 1; -- GTID 模式核心參數,自動定位
-- 傳統模式(File+Position)需指定:
-- MASTER_LOG_FILE = 'mysql-bin.000001',
-- MASTER_LOG_POS = 12345,
START SLAVE; -- 或 START REPLICA (8.0.22+)
SHOW SLAVE STATUS\G
| 指標 | 正常值 | 異常含義 |
|---|---|---|
| Slave_IO_Running | Yes | No=IO 線程故障(網路、認證、Binlog 格式) |
| Slave_SQL_Running | Yes | No=SQL 線程故障(衝突、異常、長事務) |
| Last_IO_Error / Last_SQL_Error | 空 | 具體錯誤訊息 |
| Seconds_Behind_Master | 0 或極小 | 大=延遲(主庫寫入快、從庫重放慢、長事務) |
| Retrieved_Gtid_Set / Executed_Gtid_Set | 集合一致 | GTID 模式下核心一致性指標 |
| 故障 | 原因 | 處理 |
|---|---|---|
| IO 線程 No:Connect failed | 網路不通、防火牆、用戶 Host 不匹配、密碼錯誤 | telnet 測試、檢查 user 表、重設密碼 |
| SQL 線程 No:Duplicate entry | 主鍵/唯一鍵衝突(從庫誤寫入、多源複制) | 跳過錯誤 GTID:SET GTID_NEXT='...'; BEGIN; COMMIT; SET GTID_NEXT=AUTOMATIC; 或 pt-slave-restart |
| Seconds_Behind_Master 持續增大 | 從庫重放慢(大事務、無索引、IO 瓶頸、單線程) | 啟用多線程複制:slave_parallel_workers=4, slave_parallel_type=LOGICAL_CLOCK |
| Relay Log 損毀 | 磁碟故障、殺進程、網路中斷寫入不全 | STOP SLAVE; RESET SLAVE; 重新 CHANGE MASTER TO (GTID 自動定位) |
# 從庫 my.cnf
slave_parallel_workers = 4
slave_parallel_type = LOGICAL_CLOCK # 基於 Binlog 組提交並行,無衝突
slave_preserve_commit_order = 1 # 保證提交順序一致性
MySQL 8.0 預設開啟 MTS,效能大幅提升。
**GTID 模式 + xtrabackup 物理備份 + 多線程複制** 是現代 MySQL 主從部署的標準組合。核心流程:主庫開 Binlog/GTID → 從庫同 Server ID/GTID/Relay Log → 物理備份同步資料 → CHANGE MASTER TO ... MASTER_AUTO_POSITION=1 → START SLAVE → 驗證 Slave_IO/SQL_Running=Yes + Seconds_Behind_Master≈0。將部署步驟腳本化、納入 Ansible/Terraform,實現基礎設施即代碼。