Master (寫入) --binlog--> Slave (讀取/備份)
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = db_name # 要同步的庫,多行重複
binlog-ignore-db = mysql # 不同步的庫
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'repl_pass';
FLUSH PRIVILEGES;
[mysqld]
server-id = 2
master-host = 10.0.0.1
master-user = repl_user
master-password = repl_pass
master-port = 3306
replicate-do-db = db_name
replicate-ignore-db = mysql
log-bin = mysql-bin # Slave 也開啟 binlog,支援鏈式複制
master-connect-retry = 30
skip-start-slave # 啟動不自動複制,手動控制
SHOW MASTER STATUS; 記錄 File、Position。STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='10.0.0.1',
MASTER_USER='repl_user',
MASTER_PASSWORD='repl_pass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=12345;
START SLAVE;
SHOW SLAVE STATUS\G 確認 Slave_IO_Running: Yes、Slave_SQL_Running: Yes。| 指令 | 用途 |
|---|---|
| SHOW SLAVE STATUS\G | 完整複制狀態,重點看 IO/SQL 執行緒、Last_Error、Seconds_Behind_Master |
| SHOW MASTER STATUS | Master 當前 binlog 檔案與位置 |
| SHOW SLAVE HOSTS | Master 端查看已連線 Slave 列表 |
| 欄位 | 正常值 | 異常處理 |
|---|---|---|
| Slave_IO_Running | Yes | No → 檢查網路、帳號、防火牆、MASTER_LOG_FILE 是否存在 |
| Slave_SQL_Running | Yes | No → 查看 Last_Error,修正資料衝突後 STOP SLAVE; START SLAVE; |
| Seconds_Behind_Master | 0 或極小 | 大 → 網路延遲、Slave 執行緒阻塞、大交易回放慢 |
| Slave_IO_State | Waiting for master to send event | Connecting to master → 網路/認證問題 |
STOP SLAVE;
START SLAVE;
SHOW SLAVE STATUS\G; -- 記錄 Last_Error
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; -- 跳過 1 條錯誤事件
START SLAVE;
-- Slave 端
STOP SLAVE;
-- Master 端完整備份(mysqldump --master-data=2)導入 Slave
-- 或使用 LOAD DATA FROM MASTER(僅 MyISAM、需 SUPER/RELOAD 權限)
START SLAVE;
兩台皆設為 Master 與 Slave,server-id 不同,互為對方 Master。需設定 auto_increment_offset、auto_increment_increment 避免主鍵衝突。
slave-net-timeout=60:網路中斷後等待秒數再重連,防止長時間假死。relay-log、relay-log-index:自訂中繼日誌路徑。sync_binlog=1、innodb_flush_log_at_trx_commit=1:雙 1 配置保證不丟資料。server-id 全域唯一。REPLICATION SLAVE 權限。log_slow_queries 監控複制延遲大交易。依此流程配置,即可建立穩定可監控的 MySQL 主從複制環境。