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

MySQL 主從同步備份策略落地指南:配置、啟動、故障處理、運維命令大全

     編輯:MySQL 資料庫相關知識

環境基線

項目MasterSlave
IP192.168.0.1192.168.0.2
MySQL 版本5.1.34
Server ID12

Master 配置 (/etc/my.cnf)

[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = business_db
binlog-ignore-db = mysql,test
log-slave-updates = 1
slave-skip-errors = 1062,1032  # 謹慎使用

Slave 配置 (/etc/my.cnf)

[mysqld]
server-id = 2
log-bin = mysql-bin
master-host = 192.168.0.1
master-user = slave_user
master-password = slave_pass
master-port = 3306
replicate-do-db = business_db
replicate-ignore-db = mysql,test
master-connect-retry = 60
log-slave-updates = 1
slave-skip-errors = 1062,1032

標準啟動流程(SOP)

  1. Master 創建同步賬號
    GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'192.168.0.2' IDENTIFIED BY 'slave_pass';
  2. Master 鎖表備份
    FLUSH TABLES WITH READ LOCK;
    SHOW MASTER STATUS; 記錄 File, Position
    tar czf /backup/master.tar.gz /var/lib/mysql
    UNLOCK TABLES;
  3. Slave 導入備份
    scp 192.168.0.1:/backup/master.tar.gz .
    tar xzf master.tar.gz -C /var/lib/mysql
    chown -R mysql:mysql /var/lib/mysql
  4. Slave 配置同步起點
    STOP SLAVE;
    CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='slave_user', MASTER_PASSWORD='slave_pass', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
  5. 啟動並驗證
    START SLAVE;
    SHOW SLAVE STATUS\G 確認 Slave_IO_Running: Yes、Slave_SQL_Running: Yes

核心運維命令速查表

分類命令用途
Master 端SHOW MASTER STATUS查看當前 Binlog 文件/位點
SHOW SLAVE HOSTS查看連接的 Slave 列表
SHOW BINLOG EVENTS解析 Binlog 內容
PURGE LOGS TO 'file'清理指定文件前的 Binlog
RESET MASTER清空所有 Binlog(謹慎)
SET SQL_LOG_BIN=0/1動態關閉/開啟 Binlog 記錄
Slave 端START SLAVE啟動同步
STOP SLAVE停止同步
START SLAVE IO_THREAD單獨啟動 IO 線程
STOP SLAVE SQL_THREAD單獨停止 SQL 線程
RESET SLAVE清空同步位點、重建 master.info
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=N跳過 N 個錯誤事件
CHANGE MASTER TO ...動態修改同步源配置
SHOW SLAVE STATUS查看同步狀態(核心巡檢)
LOAD TABLE FROM MASTER重新同步單表(需 RELOAD/SUPER 權限)
LOAD DATA FROM MASTER全量重新同步(慎用,鎖表久)

線程狀態解讀(SHOW PROCESSLIST)

Master Binlog Dump 線程

  • Sending binlog event to slave:正常發送
  • Has sent all binlog to slave; waiting for binlog to be updated:空閒等待新寫入

Slave IO 線程

  • Waiting for master to send event:正常等待
  • Connecting to master:連接中
  • Waiting to reconnect after failed binlog dump:重試中

Slave SQL 線程

  • Reading event from the relay log:解析執行中
  • Has read all relay log; waiting for slave I/O thread to update it:追上進度,等待新事件

故障處理決策樹

Slave 無法啟動

  1. 查錯誤日志、master.info、relay-log.info
  2. 停服務 → 刪除 master.info、relay-log.info
  3. 啟服務 → 重新 CHANGE MASTER TO → START SLAVE

主從不同步 (SQL_Running: No)

STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
-- 觀察 Seconds_Behind_Master 歸零

性能優化參數

[mysqld]
skip-name-resolve = 1          # 跳過 DNS 解析,加速連接
max_connections = 1000         # 提高最大連接數 (默認 100)
max_connect_errors = 1000      # 防止誤封禁 (默認 10)
slave_net_timeout = 60         # Slave 判定 Master 超時時間
relay_log_space_limit = 2G     # 限制 Relay Log 總大小

巡檢腳本(納入 Crontab 每 5 分鐘)

#!/bin/bash
# slave_monitor.sh
HOST=192.168.0.2
USER=monitor
PASS=xxx

STATUS=$(mysql -h$HOST -u$USER -p$PASS -e "SHOW SLAVE STATUS\G")
IO=$(echo "$STATUS" | awk '/Slave_IO_Running:/ {print $2}')
SQL=$(echo "$STATUS" | awk '/Slave_SQL_Running:/ {print $2}')
LAG=$(echo "$STATUS" | awk '/Seconds_Behind_Master:/ {print $2}')

if [ "$IO" != "Yes" ] || [ "$SQL" != "Yes" ]; then
    echo "CRITICAL: Slave thread down!" | mail -s "MySQL Slave Alert" dba@company.com
elif [ -n "$LAG" ] && [ "$LAG" -gt 300 ]; then
    echo "WARNING: Slave lag ${LAG}s" | mail -s "MySQL Slave Lag" dba@company.com
else
    echo "OK: Slave healthy"
fi

關鍵提醒

⚠️ 啟動 Slave 前必須刪除舊 master.info/relay-log.info,否則 my.cnf 修改不生效!
⚠️ binlog-do-db 建議在 Master 不設置,在 Slave 用 replicate-do-db 過濾,避免跨庫操作不同步。
⚠️ slave-skip-errors 僅限明確知道錯誤原因且業務允許不一致時使用,濫用會掩蓋真實問題。

總結

MySQL 主從同步的穩定性來自於:標準化部署 SOP、全方位監控覆蓋、故障處理預案、定期一致性校驗。將上述命令、腳本、參數固化為團隊運維手冊,新人也能從容應對突發故障。

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