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

MySQL 5.0 官方手冊深度解讀:複寫部署標準流程與拓撲實戰 (第二篇)

     編輯:MySQL 資料庫相關知識

部署前提與版本相容性

  • Master/Slave 版本**相近且相容** (詳見手冊 6.5 節版本相容性矩陣)
  • 已知問題版本勿上生產
  • 需 SUPER 權限 (4.0.2 前為 PROCESS)

標準部署流程 (完全同步、需停 Master 寫入)

1. Master 建立複寫帳號

GRANT REPLICATION SLAVE ON *.*
  TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
-- 僅授予複寫權限,遵循最小權限原則

-- 若需支援 LOAD TABLE/DATA FROM MASTER (已棄用)
GRANT SUPER, RELOAD ON *.* TO 'repl'@'%.mydomain.com';
GRANT SELECT ON *.* TO 'repl'@'%.mydomain.com';  -- 目標表需 SELECT

2. Master 靜態備份 (FLUSH TABLES WITH READ LOCK)

-- Session 1 (保持連線,鎖才有效)
FLUSH TABLES WITH READ LOCK;

-- Session 2 (打包資料目錄)
tar -cvf /tmp/mysql-snapshot.tar /var/lib/mysql
# 或單庫:tar -cvf /tmp/mysql-snapshot.tar /var/lib/mysql/this_db

-- Session 1 記錄二進位日誌座標
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.003    | 73       | test         | manual,mysql     |
+------------------+----------+--------------+------------------+

-- Session 1 釋放鎖
UNLOCK TABLES;

關鍵點:File + Position 為 Slave 起始同步座標。**必須在 UNLOCK TABLES 前記錄**。

3. InnoDB 表的熱備份替代方案

  • InnoDB Hot Backup (商業工具):無需鎖表、一致性快照、自動記錄日誌座標。官網
  • 關機冷備份:FLUSH TABLES WITH READ LOCK → SHOW MASTER STATUS → 記錄座標 → mysqladmin shutdown → 複製 ibdata*、ib_logfile*、*.frm
  • 邏輯備份:mysqldump --master-data --single-transaction → 匯入 Slave。較慢但通用,無需鎖表 (InnoDB)。

4. Master 配置啟用二進位日誌與 server-id

[mysqld]
log-bin
server-id=1  # 1 ~ 2^32-1,唯一

修改後重啟 Master。

5. Slave 配置 server-id 並啟動

[mysqld]
server-id=2  # 唯一,不可與 Master 及其他 Slave 重複

# 多 Slave 每個唯一 server-id,視同 IP 定址

啟動參數建議:--skip-slave-start (不自動連線)、--log-warnings (詳細日誌)。

6. 載入備份資料 (物理備份情況)

# 解壓至 Slave 資料目錄
tar -xvf /tmp/mysql-snapshot.tar -C /var/lib/mysql
# 權限修正
chown -R mysql:mysql /var/lib/mysql

邏輯備份 (mysqldump) 則直接啟動 Slave 後匯入:mysql -u root -p < dump.sql。

7. 設定複寫座標並啟動

CHANGE MASTER TO
  MASTER_HOST='master_host',
  MASTER_USER='repl',
  MASTER_PASSWORD='slavepass',
  MASTER_LOG_FILE='mysql-bin.003',
  MASTER_LOG_POS=73;

START SLAVE;

參數長度限制:MASTER_HOST 60、MASTER_USER 16、MASTER_PASSWORD 32、MASTER_LOG_FILE 255 字元。

8. 驗證複寫狀態

SHOW SLAVE STATUS\G
-- 關鍵欄位
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Last_Error: (空)

資料目錄下會產生 master.info、relay-log.info,**勿手動修改**,改用 CHANGE MASTER TO。

擴充至多 Slave 架構

同一份 Master 快照可部署無數 Slave:

  1. 複製快照檔至各 Slave
  2. 各 Slave 設定唯一 server-id
  3. 各自執行 CHANGE MASTER TO + START SLAVE

無需再次鎖定 Master 或重新備份。

常見部署陷阱與解決

現象原因解決
Slave 無法連線 MasterMaster 未設 server-id 或 log-bin檢查 Master 配置並重啟
Slave 錯誤日誌:server-id not setSlave 未設 server-id設定唯一 server-id 重啟
複寫延遲大Slave 查詢慢、單執行緒 SQL、網路慢優化 Slave 查詢、升級 5.6+ 多執行緒複寫、壓縮協議
主從資料不一致Slave 直接寫入、非確定性函數、跳過錯誤read-only、binlog_format=ROW、定期 pt-table-checksum 校驗
中繼日誌損壞磁碟滿、強制關機STOP SLAVE → 刪除 relay-log* → CHANGE MASTER TO 重設座標 → START SLAVE

現代化部署建議 (5.6/5.7/8.0)

  • GTID 複寫:gtid_mode=ON、enforce_gtid_consistency=ON,自動定位座標,故障切換零配置
  • 多執行緒 Slave:slave_parallel_workers=4 (5.6+)、slave_parallel_type=LOGICAL_CLOCK (5.7+)
  • 半同步複寫:rpl_semi_sync_master=ON,Master 等待至少一 Slave 收到才提交,降低資料遺失風險
  • 自動故障轉移:MHA、Orchestrator、MySQL Router、ProxySQL
  • 容器化編排:Kubernetes + Operator (Oracle MySQL Operator, Presslabs Operator)

總結:複寫部署的鐵律

  1. 唯一 server-id (拓撲身分證)
  2. Master 必須 log-bin (變更記錄源頭)
  3. 一致性快照 + 精確座標 (同步起點)
  4. CHANGE MASTER TO 管理連線 (動態、持久、優先於配置檔)
  5. 監控 Seconds_Behind_Master = 0 (健康度金標準)
  6. 定期校驗主從一致性 (pt-table-checksum / checksum table)

複寫不是備份,也不替代備份。複寫解決高可用與讀擴展,備份解決邏輯錯誤、惡意破壞、災難恢復。兩者皆不可缺。

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