首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 主從複制(Replication)配置實戰:GTID 模式、手動同步與故障切換

     編輯:MySQL 綜合教學

前言

MySQL 主從複制是高可用、讀寫分離、備份卸載的基石。本文以 **GTID 模式(MySQL 5.6+ 推薦)** 為核心,詳細演示:主庫配置、從庫配置、手動資料同步(xtrabackup/物理備份)、CHANGE MASTER TO 精確定位、啟動複制、驗證與常見故障處理。非 GTID 傳統模式(File+Position)亦標註差異。

架構與版本假設

  • 主庫:10.0.0.1,MySQL 5.7/8.0,Server ID=1
  • 從庫:10.0.0.2,MySQL 同版本,Server ID=2
  • 複制用戶:repl_user,密碼 StrongPass@123
  • 資料目錄:/data/mysql

第一部分:主庫配置


# /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

第三部分:資料同步(兩種主流方式)

方式 A:xtrabackup 物理熱備份(推薦、大表秒級、不阻塞主庫)


# 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

方式 B:mysqldump 邏輯備份(小表、跨版本、無 xtrabackup 環境)


# 主庫導出(單線程、含 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。

第四部分:配置複制連線(GTID 模式無需指定 File/Position)


-- 從庫執行
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_RunningYesNo=IO 線程故障(網路、認證、Binlog 格式)
Slave_SQL_RunningYesNo=SQL 線程故障(衝突、異常、長事務)
Last_IO_Error / Last_SQL_Error空具體錯誤訊息
Seconds_Behind_Master0 或極小大=延遲(主庫寫入快、從庫重放慢、長事務)
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 自動定位)

多線程複制(MTS)啟用建議


# 從庫 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,實現基礎設施即代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved