首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 主從複製配置全流程:雙機熱備實戰指南

     編輯:MySQL 資料庫相關知識

核心原理

MySQL 複制基於二進制日志:主庫記錄數據變更 → 從庫 I/O 線程拉取 → 寫入 Relay Log → SQL 線程重放。支持單向、雙向、級聯多種拓撲。

版本兼容性原則

  • 主庫版本 ≤ 從庫版本(向前兼容)。
  • 主庫 5.7 → 從庫 8.0 支持;反向不支持。
  • 跨大版本升級建議:先升從庫,再升主庫。

主庫配置 (my.cnf)

[mysqld]
server-id = 1                          # 唯一,1~2^32-1
log-bin = mysql-bin                    # 啟用二進制日志
binlog-format = ROW                    # 推薦 ROW 格式,數據一致性最強
binlog-do-db = business_db             # 僅記錄指定庫 (可選)
binlog-ignore-db = mysql,test,sys      # 忽略系統庫 (可選)
expire_logs_days = 7                   # 自動清理舊日志
max_binlog_size = 1G                   # 單文件上限
sync_binlog = 1                        # 每次提交刷盤,最安全
innodb_flush_log_at_trx_commit = 1     # 配合 sync_binlog 保證不丟數據

創建複製賬號

-- MySQL 5.7+
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'StrongReplPass#2024';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;

-- 5.6 及之前 (無 REPLICATION SLAVE 權限)
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'pass';

從庫配置 (my.cnf)

[mysqld]
server-id = 2                          # 唯一,不可與主庫重複
relay-log = relay-bin                  # Relay Log 文件名
relay-log-index = relay-bin.index
read-only = 1                          # 防止誤寫入 (超級用戶除外)
skip-slave-start = 1                   # 啟動不自動啟動複製,手動控制
# 以下參數 5.6+ 建議用 CHANGE MASTER TO 設置,而非寫死配置文件
# master-host, master-port, master-user, master-password, master-connect-retry

初始化同步數據 (關鍵步驟)

  1. 主庫鎖定並備份:
    FLUSH TABLES WITH READ LOCK;
    SHOW MASTER STATUS;  -- 記錄 File (如 mysql-bin.000003) 和 Position (如 154)
    # 另開終端備份:tar czf /backup/db.tar.gz /var/lib/mysql/business_db
    UNLOCK TABLES;
  2. 傳輸並導入從庫:
    # 從庫解壓數據到 datadir
    tar xzf /backup/db.tar.gz -C /var/lib/mysql/
    chown -R mysql:mysql /var/lib/mysql/business_db
  3. 配置從庫複製座標並啟動:
    CHANGE MASTER TO
      MASTER_HOST='192.168.1.100',
      MASTER_PORT=3306,
      MASTER_USER='repl_user',
      MASTER_PASSWORD='StrongReplPass#2024',
      MASTER_LOG_FILE='mysql-bin.000003',
      MASTER_LOG_POS=154,
      MASTER_CONNECT_RETRY=60;
    
    START SLAVE;
  4. 驗證狀態:
    SHOW SLAVE STATUS\G
    # 關鍵指標:
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    Seconds_Behind_Master: 0
    Last_IO_Error: (空)
    Last_SQL_Error: (空)

日志清理與座標重置 (主庫日志過大時)

  1. 主庫:FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; 記錄新 File/Position。
  2. 從庫:STOP SLAVE;
  3. 主庫:UNLOCK TABLES; PURGE BINARY LOGS TO 'mysql-bin.000010';
  4. 從庫:CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000010', MASTER_LOG_POS=456; START SLAVE;

監控與告警指標

指標正常值異常處理
Seconds_Behind_Master0 或極小> 300 秒告警,檢查慢 SQL、網絡、從庫負載
Slave_IO_RunningYesNo → 檢查網絡、賬號、主庫日志是否被清理
Slave_SQL_RunningYesNo → Last_SQL_Error 分析,可能需跳過錯誤事務
Relay_Log_Space穩定持續增長說明 SQL 線程跟不上

GTID 複制 (MySQL 5.6+ 推薦)

# 主庫額外配置
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = 1

# 從庫 CHANGE MASTER TO 使用
CHANGE MASTER TO MASTER_AUTO_POSITION = 1;  -- 無需指定文件/位置

GTID 實現自動定位、故障轉移簡單、多源複製支持。

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