基於 RHEL 5.4 + MySQL 5.0.77,雙節點異步複製:
[mysqld]
server-id=1 # 全局唯一,Slave 設 2、3...
log-bin=mysql-bin # 啟用 Binlog,文件名前綴
binlog-do-db=test # 只同步指定庫 (多行可配多庫)
binlog-do-db=wo
binlog-do-db=wo_icmdp
# binlog-ignore-db=mysql # 互斥:二選一,建議用 do-db 白名單
skip-locking # 5.0 舊參數,5.5+ 建議 skip-external-locking
key_buffer=16M # MyISAM 索引緩存
max_allowed_packet=1M
table_cache=64
sort_buffer_size=512K
read_buffer_size=256K
read_rnd_buffer_size=512K
myisam_sort_buffer_size=8M
default-character-set=utf8
init_connect='SET NAMES utf8'
lower_case_table_names=1 # 表名不區分大小寫 (Windows 兼容)
datadir=/opt/MySQL_M/
socket=/opt/mysql_M/mysql.sock
log=/opt/mysql_M/logs/mysql.log
long_query_time=2
log-slow-queries=/opt/mysql_M/logs/slowquery.log
[client]
port=3306
socket=/opt/mysql_M/mysql.sock
[mysqld]
server-id=2
master-host=192.168.1.243 # Master IP (5.1+ 建議用 CHANGE MASTER TO)
master-user=slave # 複製賬號
master-password=123456 # 明文風險,5.6+ 支持 master_info_repository=TABLE
master-port=3306
master-connect-retry=60 # 重試間隔
replicate-do-db=test # 只同步指定庫
# replicate-do-db=wo
# replicate-do-db=wo_icmdp
# replicate-ignore-db=mysql
log-bin=mysql-bin # Slave 也開 Binlog 便於級聯/備份
log=/opt/mysql_S/logs/mysql.log
long_query_time=2
log-slow-queries=/opt/mysql_S/logs/slowquery.log
# 其他緩存參數同 Master
[client]
port=3306
socket=/opt/mysql_S/mysql.sock
| 參數 | Master | Slave | 說明 |
|---|---|---|---|
| server-id | 1 | 2 | 集群內全局唯一,極其重要 |
| log-bin | ✅ 必開 | 建議開 | Binlog 是複製數據源 |
| binlog-do-db | 白名單 | — | Master 端過濾,減少網傳 |
| replicate-do-db | — | 白名單 | Slave 端過濾,靈活但多傳數據 |
| sync_binlog | 1 (推薦) | — | 每提交刷盤,最安全,性能略損 |
| innodb_flush_log_at_trx_commit | 1 | 1 | 雙 1 配置,保證不丟事務 |
mkdir -p /opt/MySQL_M /opt/MySQL_S && chown -R mysql:mysql /opt/MySQL_*GRANT REPLICATION SLAVE, RELOAD, SUPER ON *.* TO 'slave'@'192.168.1.%' IDENTIFIED BY 'StrongPass#2024';
FLUSH PRIVILEGES;
# 1. 加全局讀鎖
FLUSH TABLES WITH READ LOCK;
# 2. 記錄位點
SHOW MASTER STATUS; -- 記下 File、Position
# 3. 物理備份 (或 mysqldump --master-data=2)
tar czf /tmp/master_data.tar.gz /opt/MySQL_M
# 4. 解鎖
UNLOCK TABLES;
server-id=2 → 啟動 MySQL → 執行 CHANGE MASTER TO ... (5.1+ 推薦動態配置,不寫死 my.cnf)START SLAVE;
SHOW SLAVE STATUS\G;
-- 關鍵指標:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Connecting to master = 網絡/賬號/防火牆問題;Waiting for master to send event = 正常等待No 通常因重複鍵、外鍵失敗、表結構不一致NULL 表示 SQL 線程停止;大值表示 Slaves 慢/網絡延遲/大事務回放relay_log_space_limit 控制| 故障現象 | 根因 | 解決方案 |
|---|---|---|
| Duplicate entry for key PRIMARY | 主鍵衝突、雙主寫入、手動操作 | STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; (謹慎用,可能數據不一致) |
| Slave_IO_Running: No | 網絡不通、賬號錯誤、Binlog 丟失 | 檢查防火牆、CHANGE MASTER TO MASTER_LOG_FILE='...', MASTER_LOG_POS=...; 重新指定位點 |
| Seconds_Behind_Master 持續增大 | 大事務、Slave 硬件弱、長鎖表 | 優化大事務拆分、升級 Slave 配置、slave_parallel_workers>0 (5.6+ 並行複製) |
| Binlog 文件過多佔磁盤 | 未設置過期清理 | expire_logs_days=7 或 PURGE BINARY LOGS BEFORE '2024-01-01'; |
CHANGE MASTERrpl_semi_sync_master=ON,Master 等至少 1 個 Slave 收到 Binlog 才提交,極大降低數據丟失風險mysqld_exporter 采集 Seconds_Behind_Master、Slave_*_Running、Relay_Log_Space,配置告警MySQL 主從複製是讀寫分離、災備、高可用的基石。核心在於:server-id 唯一、Binlog 完整、位點精準、權限最小、監控全覆蓋。5.0 時代配置寫死 my.cnf,現代版本全面轉向 CHANGE MASTER TO 動態管理 + GTID。生產環境務必配合 sync_binlog=1、innodb_flush_log_at_trx_commit=1「雙 1」配置,並建立定期 pt-table-checksum 數據一致性校驗機制。