主從複寫採用非同步模式,主庫寫入二進位日誌,從庫透過 I/O 執行緒拉取並寫入中繼日誌,再由 SQL 執行緒重放。部署前請確認:
log_bin,配置唯一 server-idGRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.0.%' IDENTIFIED BY 'StrongPass#2024';
FLUSH PRIVILEGES;
※ MySQL 4.1+ 使用 REPLICATION SLAVE,舊版曾用 FILE 權限。
/etc/my.cnf(主庫)[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = target_db # 需同步的資料庫,多行重複設定
binlog-ignore-db = mysql,sys,performance_schema # 排除系統庫
/etc/my.cnf(從庫)[mysqld]
server-id = 2
log-bin = mysql-bin # 開啟從庫二進位日誌,利於鏈式複寫
relay-log = relay-bin
read-only = 1 # 防止誤寫入
replicate-do-db = target_db # 需同步的資料庫
CHANGE MASTER TO
MASTER_HOST='192.168.0.10',
MASTER_USER='repl_user',
MASTER_PASSWORD='StrongPass#2024',
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1; # GTID 模式,若無 GTID 請指定 MASTER_LOG_FILE/MASTER_LOG_POS
START SLAVE;
SHOW SLAVE STATUS\G
關鍵指標:Slave_IO_Running: Yes、Slave_SQL_Running: Yes、Seconds_Behind_Master: 0。
| 場景 | 指令 |
|---|---|
| 查看主庫狀態 | SHOW MASTER STATUS; |
| 查看從庫連線 | SHOW SLAVE HOSTS; |
| 暫停/恢複寫 | STOP SLAVE; / START SLAVE; |
| 單獨控制 I/O 或 SQL 執行緒 | STOP SLAVE IO_THREAD; START SLAVE SQL_THREAD; |
| 跳過錯誤事件 | SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; |
| 動態變更主庫 | CHANGE MASTER TO MASTER_HOST=..., MASTER_PORT=...; |
| 清理已同步 Binlog | PURGE BINARY LOGS BEFORE '2024-01-01'; |
| 重置從庫狀態 | RESET SLAVE ALL; |
FLUSH TABLES WITH READ LOCK 並備份完整資料目錄(含 ibdata1、*.ibd、*.frm 等),否則後續複寫會因資料差異報錯。my.cnf 版本一致:主從參數(如 sql_mode、字元集)不一致會導致複寫中斷。mysqld.log、relay-log.info、master.info 是排查複寫延遲、錯誤的關鍵。