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

RedHat Linux 下 MySQL 主從複製與雙主熱備完整實戰部署

     編輯:MySQL 資料庫相關知識

前言

MySQL 3.23.15+ 引入複製功能,支援主從 (Master-Slave)與雙主 (Master-Master)架構,是高可用、讀寫分離、異地災備的基石。本文基於 RedHat Linux 9 + MySQL 4.0.18,給出生產級部署全流程。

一、環境規劃

角色IPServer ID數據目錄
Master (A)192.168.0.11/usr/local/mysql/data
Slave (B)192.168.0.102/usr/local/mysql/data

共同前提:版本一致、字符集一致、server-id 唯一、防火牆放行 3306。

二、Master (A) 配置

1. 建立複製賬號

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.*
TO 'repl_user'@'192.168.0.10' IDENTIFIED BY 'ReplPass123!';
FLUSH PRIVILEGES;

2. 修改 my.cnf ([mysqld] 區塊)

[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
binlog-do-db = business_db      # 僅同步指定庫
sync_binlog = 1
expire_logs_days = 7
max_binlog_size = 500M
innodb_flush_log_at_trx_commit = 1
sync_relay_log = 1

3. 重啟並獲取 Binlog 位置

systemctl restart mysqld
mysql -u root -p -e "SHOW MASTER STATUS;"
# 記下 File (如 mysql-bin.000001) 和 Position (如 154)

4. 導出基線數據 (停寫或加鎖)

# 方法一:全庫鎖定 (短暫)
mysql -u root -p -e "FLUSH TABLES WITH READ LOCK;"
mysqldump -u root -p --all-databases --master-data=2 --single-transaction > /tmp/full.sql
mysql -u root -p -e "UNLOCK TABLES;"

# 方法二:XtraBackup 熱備無鎖 (推薦生產)
# xtrabackup --backup --target-dir=/backup/full --user=root --password=xxx

三、Slave (B) 配置

1. 修改 my.cnf

[mysqld]
server-id = 2
relay-log = mysql-relay
relay-log-index = mysql-relay.index
log-slave-updates = 1
replicate-do-db = business_db
read-only = 1                  # 防止誤寫入
master-connect-retry = 60

2. 導入基線數據

scp root@192.168.0.1:/tmp/full.sql /tmp/
mysql -u root -p < /tmp/full.sql
# 或 XtraBackup 複製回 datadir 並 chown mysql:mysql

3. 配置複製源並啟動

CHANGE MASTER TO
    MASTER_HOST = '192.168.0.1',
    MASTER_USER = 'repl_user',
    MASTER_PASSWORD = 'ReplPass123!',
    MASTER_PORT = 3306,
    MASTER_LOG_FILE = 'mysql-bin.000001',
    MASTER_LOG_POS = 154,
    MASTER_CONNECT_RETRY = 60;

START SLAVE;
SHOW SLAVE STATUS\G
# 關鍵指標:Slave_IO_Running=Yes, Slave_SQL_Running=Yes, Seconds_Behind_Master=0

四、雙主熱備 (Master-Master) 擴展

在 Slave (B) 亦開啟 Binlog,並互為對方的 Master。

A 追加配置

[mysqld]
master-host = 192.168.0.10
master-user = repl_user
master-password = ReplPass123!
master-connect-retry = 10
replicate-do-db = business_db
auto-increment-increment = 2
auto-increment-offset = 1

B 追加配置

[mysqld]
log-bin = mysql-bin
binlog-do-db = business_db
auto-increment-increment = 2
auto-increment-offset = 2

關鍵: auto_increment_increment/offset 避免雙主自增 ID 衝突;僅對單向寫入應用推薦雙主,雙向寫入極易衝突,生產建議改用 MGR (MySQL Group Replication) 或 Galera Cluster。

五、監控與運維關鍵指標

  • Seconds_Behind_Master = 0 正常;> 300 告警。
  • Slave_IO_Running / Slave_SQL_Running 任一 No 立即告警。
  • Binlog 磁盤佔用、Relay Log 磁盤佔用。
  • 錯誤日志 .err 關鍵字:Duplicate entry, Deadlock, Table doesn't exist。

六、常見故障與修復

七、總結

MySQL 複製架構核心在於:唯一 server-id、Binlog 格式 ROW、基線數據一致、CHANGE MASTER TO 精確定位、監控告警全覆蓋。雙主熱備僅適用於「單向寫入、互為熱備」場景;多寫入節點請直接上 MGR/Galera,避免自增衝突、死鎖、分裂腦等棘手問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
故障修復步驟
SQL 線程報錯停止 (如主鍵衝突)STOP SLAVE; SET GLOBAL sql_slave_skip_counter=1; START SLAVE; (謹慎使用,可能導致數據不一致)
IO 線程連不上 Master檢查網絡、防火牆、賬號密碼、MASTER_LOG_FILE/POS 是否正確
Relay Log 損壞STOP SLAVE; RESET SLAVE; 重新 CHANGE MASTER TO ...; START SLAVE;
主從數據不一致pt-table-checksum 檢測 → pt-table-sync 修復 (需停寫或鎖表)