| 角色 | IP | Server ID | 備註 |
|---|---|---|---|
| Master | 192.168.137.12 | 1 | 讀寫、啟用 Binlog |
| Slave | 192.168.137.13 | 2 | 唯讀、同步指定庫 |
sudo apt-get update && sudo apt-get install -y mysql-server
# 設定 root 密碼、移除匿名帳號、禁止 root 遠端登入、移除 test 庫
sudo mysql_secure_installation
# /etc/mysql/mysql.conf.d/mysqld.cnf (或 my.cnf)
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
skip-character-set-client-handshake
重啟:sudo systemctl restart mysql
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW # 推薦 ROW 格式,減少主從不一致
binlog-do-db = s3 # 僅同步 s3 庫(可多行或用 replicate-do-db 在 Slave 控制)
expire_logs_days = 7 # 自動清理舊 Binlog
max_binlog_size = 100M
重啟 Master:sudo systemctl restart mysql
CREATE USER 'repl'@'192.168.137.%' IDENTIFIED BY 'StrongReplPass!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.137.%';
FLUSH PRIVILEGES;
安全提示:限制來源 IP 段、使用強密碼、專用帳號最小權限。
FLUSH TABLES WITH READ LOCK; # 短暫鎖定確保一致性座標
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000007 | 106 | s3 | |
+------------------+----------+--------------+------------------+
UNLOCK TABLES;
記錄 File 與 Position,後續 Slave 配置需用。
[mysqld]
server-id = 2
relay-log = relay-bin
read-only = ON
replicate-do-db = s3
master-connect-retry = 60
重啟 Slave:sudo systemctl restart mysql
# Master
mysqldump -u root -p --single-transaction --master-data=2 --databases s3 > s3_dump.sql
# 複製到 Slave
mysql -u root -p < s3_dump.sql
# Master 停服務或 FLUSH TABLES WITH READ LOCK
tar czf /tmp/mysql_data.tar.gz /var/lib/mysql
# 複製到 Slave 解壓覆蓋 /var/lib/mysql,修正權限 chown -R mysql:mysql /var/lib/mysql
CHANGE MASTER TO
MASTER_HOST='192.168.137.12',
MASTER_USER='repl',
MASTER_PASSWORD='StrongReplPass!',
MASTER_LOG_FILE='mysql-bin.000007',
MASTER_LOG_POS=106,
MASTER_CONNECT_RETRY=60;
START SLAVE;
SHOW SLAVE STATUS\G
關鍵指標均為 Yes:
Slave_IO_Running: Yes(I/O 執行緒連線 Master 正常)Slave_SQL_Running: Yes(SQL 執行緒重放 Relay Log 正常)Seconds_Behind_Master: 0(無延遲)Last_IO_Error、Last_SQL_Error 為空| 現象 | 可能原因 | 處置 |
|---|---|---|
| IO_Running=Connecting | 網路不通、防火牆、帳號密碼錯、Master 未啟用 Binlog | telnet master 3306、檢查錯誤日誌 /var/log/mysql/error.log |
| SQL_Running=No | 主從資料不一致、觸發器/存儲過程非確定性、DDL 衝突 | 檢查 Last_SQL_Error、若非關鍵可 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; 跳過 |
| Seconds_Behind_Master 偏大 | Slave 機能不足、長事務、大量 DML、網路延遲 | 升級 Slave 硬體、優化慢 SQL、改用並行複寫 slave_parallel_workers |
| Binlog 格式不一致 | Master ROW、Slave 無法解析 | 統一 binlog-format=ROW |
gtid_mode=ON, enforce_gtid_consistency=ON,自動定位座標、支援故障自動轉移(MHA/Orchestrator)。rpl_semi_sync_master=ON,降低資料遺失風險(RPO 近乎 0)。mysqld_exporter 采集 Slave_running、Seconds_Behind_Master、Slave_last_io_error,配置 Grafana 儀表板與 Alertmanager 告警。主從複寫是 MySQL 高可用與讀寫分離的基石。嚴格遵循Server ID 唯一、Binlog 格式統一、專用同步帳號、資料一致性初始化、關鍵指標監控五大原則,並引入 GTID、半同步、自動故障轉移工具鏈,即可構建穩健可靠的 MySQL 叢集。