MySQL 非同步複寫 (Replication) 是高可用、讀寫分離的基礎架構。本文以雙節點 (Master/Slave) 為例,記錄從設定檔修改、建立複寫帳號、資料同步到驗證的完整步驟。
[mysqld]
# Master
log_bin = master_bin
server_id = 11
# Slave
server_id = 111
# 可選:relay_log = slave_relay_bin
# 可選:read_only = 1
重啟:service mysql restart
CREATE USER 'repl'@'192.168.92.111' IDENTIFIED BY 'slavepass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.92.111';
FLUSH PRIVILEGES;
SHOW VARIABLES LIKE 'server_id'; -- 11
SHOW VARIABLES LIKE 'log_bin'; -- ON
SHOW MASTER STATUS\G
-- 記錄 File (master_bin.000001) 與 Position (589)
# Master 建立測試庫並匯出
CREATE DATABASE cddl;
mysqldump -h 192.168.92.11 -u root -p cddl > cddl.sql
# Slave 匯入
mysql -h 192.168.92.111 -u root -p cddl < cddl.sql
CHANGE MASTER TO
MASTER_HOST='192.168.92.11',
MASTER_USER='repl',
MASTER_PASSWORD='slavepass',
MASTER_PORT=3306,
MASTER_LOG_FILE='master_bin.000001',
MASTER_LOG_POS=589,
MASTER_CONNECT_RETRY=10;
START SLAVE;
SHOW SLAVE STATUS\G
-- 關鍵指標:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0 -- 0 表示追上
-- Master
CREATE TABLE TT (id INT, name VARCHAR(30));
INSERT INTO TT VALUES (1,'AAA'),(2,'BBB');
-- Slave
SELECT * FROM TT; -- 應立即出現兩筆
| 類型 | 特性 | 適用場景 |
|---|---|---|
| 非同步 (預設) | Master Commit 即回應,效能最好,可能丟失交易 | 一般讀寫分離、報表庫 |
| 半同步 (Semi-sync) | 至少一 Slave 收到 Relay Log 才 Commit,Google 貢獻 | 金融核心、不能丟資料 |
| 同步 (NDB Cluster) | 所有節點 Commit 才回應,延遲最高 | 極高一致性需求 |
Slave_IO_Running: No → 檢查網路、防火牆、帳號密碼、MASTER_LOG_FILE/POS 是否正確。Slave_SQL_Running: No → 查 Last_SQL_Error,通常為鍵衝突或結構不符,需手動修正後 START SLAVE。innodb_flush_log_at_trx_commit、網路頻寬、長交易阻塞。