萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 主從複製配置實戰:自動備份與高可用架構搭建

MySQL 主從複製是實現讀寫分離、災備、高可用的基石。本文以雙節點(一主一從)為例,詳細記錄配置流程、關鍵參數、資料同步驗證與常見坑點,適用於 5.6/5.7/8.0 版本(部分參數名稱在 8.0 有變化,文中標註)。

架構與前置條件

  • 主庫:192.168.1.100(Server ID: 1)
  • 從庫:192.168.1.101(Server ID: 2)
  • 同一網段、可互通、版本盡量一致(從庫版本 ≥ 主庫版本更安全)
  • 已安裝 MySQL、知曉 my.cnf 路徑與啟停腳本

步驟 1:主庫建立複製賬號

GRANT REPLICATION SLAVE ON *.* TO 'backup'@'192.168.1.101' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

注意:多從庫需重複執行,或用 'backup'@'192.168.1.%' 批量授權。

步驟 2:主庫配置 my.cnf

[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW          # 推薦 ROW 格式,減少衝突
read-only = 0                # 主庫讀寫
binlog-do-db = test          # 僅同步指定庫(多行)
binlog-ignore-db = mysql     # 忽略系統庫(多行)

# 可選:過期清理、同步策略
expire_logs_days = 7
sync_binlog = 1              # 每次提交刷盤,最安全
innodb_flush_log_at_trx_commit = 1

步驟 3:從庫配置 my.cnf

[mysqld]
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
relay_log = /var/log/mysql/relay-bin.log
read-only = 1                # 從庫預設只讀,防誤寫

master-host = 192.168.1.100  # 5.6/5.7 風格,8.0 建議用 CHANGE MASTER TO
master-user = backup
master-password = 123456
master-port = 3306
master-connect-retry = 60    # 重連間隔秒

replicate-do-db = test       # 僅複製指定庫
replicate-ignore-db = mysql  # 忽略系統庫

# 可選:延遲從庫(災備用)
# slave-skip-errors = 1062   # 謹慎使用,跳過主鍵衝突
# slave-delay = 3600         # 延遲 1 小時

步驟 4:初始化從庫資料(關鍵)

兩種主流方式:

方式 A:mysqldump + 導入(適合中小庫)

# 主庫
mysqldump -u root -p --single-transaction --master-data=2 --databases test > /tmp/master_backup.sql

# 從庫
mysql -u root -p < /tmp/master_backup.sql

--master-data=2 會在導出文件中包含 CHANGE MASTER TO 註釋,記錄當前 Binlog 位置。

方式 B:Percona XtraBackup 物理熱備份(大庫/生產環境推薦)

# 主庫熱備份
xtrabackup --backup --target-dir=/backup/full --user=root --password=xxx

# 傳輸到從庫,準備並還原
xtrabackup --prepare --target-dir=/backup/full
rsync -av /backup/full/ /var/lib/mysql/
chown -R mysql:mysql /var/lib/mysql

步驟 5:啟動複製

重啟主從 MySQL 服務(先主後從),然後在從庫執行:

-- 若用方式 A 且導出含 CHANGE MASTER 註釋,可能已自動配置,仍建議顯式執行確認
CHANGE MASTER TO
  MASTER_HOST='192.168.1.100',
  MASTER_USER='backup',
  MASTER_PASSWORD='123456',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000001',  -- 從主庫 SHOW MASTER STATUS 獲取
  MASTER_LOG_POS=154,
  MASTER_CONNECT_RETRY=60;

START SLAVE;

步驟 6:驗證複製狀態

主庫

SHOW MASTER STATUS\G
-- 關鍵:File, Position, Binlog_Do_DB, Binlog_Ignore_DB

從庫

SHOW SLAVE STATUS\G
-- 關鍵指標:
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Seconds_Behind_Master: 0  (延遲秒數,0 為同步)
-- Last_IO_Error / Last_SQL_Error: 空

測試驗證

-- 主庫寫入
INSERT INTO test.t VALUES (1, 'replication test');

-- 從庫查詢
SELECT * FROM test.t;  -- 應可見新行

常見故障與排查

現象可能原因排查步驟
Slave_IO_Running: No網路不通/認證失敗/主庫 Binlog 位置錯誤檢查防火牆、賬號密碼、SHOW MASTER STATUS 位置
Slave_SQL_Running: NoSQL 執行錯誤(主鍵衝突、外鍵、字符集)看 Last_SQL_Error,手動修正或 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1 跳過
Seconds_Behind_Master 大/增長從庫執行慢/長事務/大事務/硬體瓶頸優化從庫索引/配置、並行複製、升級硬體
GTID 模式報錯GTID 集合不一致重新同步或 SET GTID_PURGED

MySQL 8.0 關鍵變化

  • 棄用 master-host 等配置文件參數,**必須用 CHANGE MASTER TO** 動態配置
  • 預設 binlog_format = ROW、GTID 模式更穩健
  • 支援多源複製、通道複製
  • replica 術語替代 slave(SHOW REPLICA STATUS)

高可用進階:MHA / Orchestrator / Group Replication

  • MHA:Manager for HA,自動故障切換(Perl,維護模式)
  • Orchestrator:拓撲管理、自動故障轉移、Web UI(Go,活躍維護)
  • Group Replication / InnoDB Cluster:官方多主同步複製、自動選主、MySQL Router 讀寫分離

主從複製配置看似簡單,但生產環境穩定運行需關注:監控告警、延遲治理、故障演練、備份驗證、版本升級兼容。建立標準化 SOP,讓複製成為可信賴的資料保護層。

copyright © 萬盛學電腦網 all rights reserved