萬盛學電腦網

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

MySQL 主從複製配置全流程:從零搭建到驗證與過濾規則

規劃與前提

角色IPServer ID
Master192.168.0.1001
Slave192.168.0.2002

版本一致、防火牆放行 3306、時間同步(NTP)。

Master 配置(/etc/my.cnf)

[mysqld]
server-id=1
log-bin=master-bin
log-bin-index=master-bin.index
binlog_format=ROW          # 推薦 ROW 格式
expire_logs_days=7
max_binlog_size=500M
# 可選:只同步特定庫
# binlog-do-db=repl_db
# binlog-ignore-db=mysql
systemctl restart mysqld

建立複製帳號

CREATE USER 'repl'@'192.168.0.%' IDENTIFIED BY 'strong_repl_pass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.%';
FLUSH PRIVILEGES;

獲取 Master 二進制座標

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| master-bin.000004| 224      |              |                  |
+------------------+----------+--------------+------------------+
UNLOCK TABLES;

記錄 File 與 Position。

Slave 配置(/etc/my.cnf)

[mysqld]
server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
read_only=1                # 防止誤寫入
# replicate-do-db=repl_db
# replicate-wild-ignore-table=mysql.%
# replicate-wild-ignore-table=information_schema.%
systemctl restart mysqld

初始化 Slave 資料(兩種方式)

方式 A:mysqldump 熱備份(小數據量)

# Master 上
mysqldump -uroot -p --all-databases --master-data=2 --single-transaction --flush-logs > full.dump
scp full.dump slave:/tmp/
# Slave 上
mysql -uroot -p < /tmp/full.dump

方式 B:物理複製(大數據量、停機窗口)

# Master:FLUSH TABLES WITH READ LOCK; 記錄座標
# 複製 datadir 到 Slave(rsync/tar+scp)
# Slave:修正權限、啟動、CHANGE MASTER TO...

配置並啟動複製

CHANGE MASTER TO
  MASTER_HOST='192.168.0.100',
  MASTER_USER='repl',
  MASTER_PASSWORD='strong_repl_pass',
  MASTER_LOG_FILE='master-bin.000004',
  MASTER_LOG_POS=224;

START SLAVE;

驗證狀態

SHOW SLAVE STATUS\G
-- 關鍵指標
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Last_IO_Error: 
Last_SQL_Error: 

資料同步驗證

# Master
CREATE DATABASE repl_test;
CREATE TABLE repl_test.t (id INT PRIMARY KEY, val VARCHAR(20));
INSERT INTO repl_test.t VALUES (1,'hello'),(2,'world');

# Slave
SHOW DATABASES LIKE 'repl_test';
SELECT * FROM repl_test.t;

過濾規則最佳實踐

  • Master 端 binlog-do-db / binlog-ignore-db 控制寫入 binlog 的庫(影響所有 Slave)。
  • Slave 端 replicate-do-db / replicate-ignore-db / replicate-wild-do-table / replicate-wild-ignore-table 靈活控制各 Slave 同步範圍。
  • 建議:Master 全量 binlog,Slave 端按需過濾,避免主庫配置變更影響其他從庫。

常見故障快速定位

現象可能原因處理
IO_Running=No網路不通、帳號密碼錯、MASTER_LOG_FILE/POS 錯檢查防火牆、SHOW MASTER STATUS 核對、重新 CHANGE MASTER
SQL_Running=No主從結構不一致、唯一鍵衝突、異常事務SHOW SLAVE STATUS 看 Last_SQL_Error,跳過錯誤 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; 或修復數據
Seconds_Behind_Master 偏大從庫硬體弱、長事務、大查詢阻塞、網路延遲優化從庫索引、調整 parallel replication (5.6+)、升級硬體
copyright © 萬盛學電腦網 all rights reserved