基於 Docker 1.11.2 + CentOS 7.1 + MySQL 5.7.13,記錄雙物理機主從複制部署全流程:鏡像拉取、容器啟動、複制賬戶、配置修改、資料同步、複制啟動、狀態驗證。
Master (192.168.2.108) ──────────────► Slave (192.168.2.103) Binlog (Row + GTID) Relay Log Server ID = 1 Server ID = 2 Rep User: rep1@192.168.2.103
# 兩台機器均執行
docker pull mysql:5.7.13
docker run --name anuo-mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=qaz.00JK \
-d mysql:5.7.13
# 進入主庫容器
docker exec -it anuo-mysql mysql -u root -p
# 執行
GRANT REPLICATION SLAVE ON *.* TO 'rep1'@'192.168.2.103' IDENTIFIED BY 'qaz.00JK';
FLUSH PRIVILEGES;
⚠️ 限定從庫 IP:'rep1'@'192.168.2.103',提高安全性。
# 1. 複製配置檔到宿主機
docker cp anuo-mysql:/etc/mysql/my.cnf /root/
# 2. 編輯 /root/my.cnf,在 [mysqld] 區塊新增
[mysqld]
log-bin = mysql-bin
server-id = 1
gtid_mode = on
enforce_gtid_consistency = on
binlog_format = row
# 3. 複製回容器覆蓋
docker cp /root/my.cnf anuo-mysql:/etc/mysql/my.cnf
# 4. 重啟容器生效
docker restart anuo-mysql
# 同步驟 3,唯一差異:
server-id = 2
# 從庫不需 log-bin (除非做級聯從庫)
# 主庫執行
FLUSH TABLES WITH READ LOCK;
# 保持該會話開啟,不要關閉!
使用 Navicat for MySQL 或 mysqldump:
# 主庫導出 (另開終端)
mysqldump -h 192.168.2.108 -u root -p --all-databases --master-data=2 --single-transaction --routines --triggers > master_backup.sql
# 從庫導入
mysql -h 192.168.2.103 -u root -p < master_backup.sql
--master-data=2 會在導出檔中包含 CHANGE MASTER TO 所需的 Binlog 位置資訊 (註釋形式)。
# 步驟 5 的會話執行
UNLOCK TABLES;
# 從庫執行 (從 SHOW MASTER STATUS 獲取)
CHANGE MASTER TO
MASTER_HOST = '192.168.2.108',
MASTER_PORT = 3306,
MASTER_USER = 'rep1',
MASTER_PASSWORD = 'qaz.00JK',
MASTER_LOG_FILE = 'mysql-bin.000002',
MASTER_LOG_POS = 898,
MASTER_AUTO_POSITION = 1; -- GTID 模式啟用
⚠️ GTID 模式:MASTER_AUTO_POSITION = 1 替代傳統檔案+位置定位,自動計算同步點。
START SLAVE;
SHOW SLAVE STATUS\G
關鍵指標:
| 欄位 | 正常值 | 異常含義 |
|---|---|---|
| Slave_IO_Running | Yes | No = IO 執行緒故障 (網路、認證、Binlog 缺失) |
| Slave_SQL_Running | Yes | No = SQL 執行緒故障 (衝突、錯誤、資料不一致) |
| Slave_IO_State | Waiting for master to send event | 其他 = 等待/連線/錯誤狀態 |
| Seconds_Behind_Master | 0 或極小 | 大 = 延遲嚴重 |
| Last_IO_Error / Last_SQL_Error | 空 | 非空 = 具體錯誤資訊 |
-v /data/mysql:/var/lib/mysql 避免容器刪除丟失資料-v /etc/mysql/my.cnf:/etc/mysql/my.cnf 避免 cp 來回--network host 或自定義 bridge,避免 NAT 效能損耗--memory=4g --cpus=2 防止容器佔盡宿主資源--log-driver=json-file --log-opt max-size=100m --log-opt max-file=5| 現象 | 排查方向 |
|---|---|
| IO_Running=No | 網路通訊、防火牆、MASTER_HOST/PORT/USER/PASS、Binlog 是否開啟 |
| SQL_Running=No | SHOW SLAVE STATUS \G 看 Last_SQL_Error;常見:主鍵衝突、外鍵失敗、字符集不匹配 |
| Seconds_Behind_Master 偏大 | 從庫硬體較弱、長事務阻塞、並行複制未開啟 (5.7+ slave_parallel_workers) |
| GTID 不一致 | RESET MASTER + 重新備份、或 SET GLOBAL gtid_purged=... |
Docker 化部署極大簡化了 MySQL 主從環境搭建,配合 GTID 自動定位,運維效率顯著提升。生產環境建議引入 Orchestrator、MHA、ProxySQL 實現高可用自動化。