[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
gtid-mode = OFF
enforce-gtid-consistency = OFF
[mysqld]
server-id = 2
log-bin = mysql-bin
relay-log = relay-bin
read-only = 1
gtid-mode = OFF
enforce-gtid-consistency = OFF
關鍵點:server-id 唯一、log-bin 啟用、Slave 設置 read-only=1 防誤寫。
# 創建配置目錄
mkdir -p /docker/mysql/{master,slave}/conf
# 將上述 cnf 文件放入對應 conf 目錄
# 啟動 Master
docker run -d \
--name mysql-master \
-e MYSQL_ROOT_PASSWORD=RootPass123! \
-v /docker/mysql/master/conf/my-m.cnf:/etc/mysql/my.cnf \
-v /docker/mysql/master/data:/var/lib/mysql \
-p 3307:3306 \
mysql:5.7
# 啟動 Slave
docker run -d \
--name mysql-slave \
-e MYSQL_ROOT_PASSWORD=RootPass123! \
-v /docker/mysql/slave/conf/my-s.cnf:/etc/mysql/my.cnf \
-v /docker/mysql/slave/data:/var/lib/mysql \
-p 3308:3306 \
mysql:5.7
docker exec -it mysql-master mysql -uroot -pRootPass123!
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'ReplPass123!';
mysql> FLUSH PRIVILEGES;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 312 | | |
+------------------+----------+--------------+------------------+
記錄 File 和 Position 值,配置 Slave 時使用。
docker exec -it mysql-slave mysql -uroot -pRootPass123!
mysql> CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl_user',
MASTER_PASSWORD='ReplPass123!',
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=312,
MASTER_PORT=3306;
注意:MASTER_HOST 使用容器名 mysql-master,Docker 內部 DNS 自動解析。
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: mysql-master
Master_User: repl_user
Master_Port: 3306
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
關鍵指標:Slave_IO_Running: Yes、Slave_SQL_Running: Yes、Seconds_Behind_Master: 0 表示同步正常無延遲。
# Master 創建測試數據
docker exec -it mysql-master mysql -uroot -pRootPass123! -e "
CREATE DATABASE test_sync;
USE test_sync;
CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO t VALUES (1, 'master_data');
"
# Slave 查詢驗證
docker exec -it mysql-slave mysql -uroot -pRootPass123! -e "
USE test_sync;
SELECT * FROM t;
"
| 問題 | 排查方向 |
|---|---|
| IO_Running: No | 網絡不通、賬號密碼錯、MASTER_HOST 錯誤、防火牆 |
| SQL_Running: No | 數據衝突、表結構不一致、主鍵衝突、Last_SQL_Error 詳情 |
| Seconds_Behind_Master 大 | Slave 性能弱、大事務、網絡延遲、並行復制未開啟 |
| 容器重啟同步中斷 | 配置 master-auto-position=1 (GTID) 或腳本自動重連 |
gtid-mode=ON) 簡化故障切換rpl_semi_sync_master=ON) 保證數據不丟失Seconds_Behind_Master、Slave_IO_Running、Slave_SQL_Runningpt-table-checksum)Docker 部署 MySQL 主從核心步驟:差異化配置 server-id/log-bin → 容器互聯 → Master 創建 repl 賬號 → 獲取 binlog 位置 → Slave CHANGE MASTER → START SLAVE → 驗證雙 Yes。容器化帶來環境一致性與快速部署優勢,生產環境建議引入編排工具 管理。