搭建一主三從後,所有 Slave 報錯:
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work
/etc/my.cnf 中已設置 server_id=2(主庫為 1),並註釋掉默認 server_id=1SHOW VARIABLES LIKE 'server_id'; → 返回 1 ❌SET GLOBAL server_id=2; + START SLAVE; → 臨時恢復systemctl restart mysqld → 再次查看變回 1 ❌MySQL 啟動時按優先級讀取多個配置文件,後讀取者覆蓋先讀取者:
1. /etc/my.cnf
2. /etc/mysql/my.cnf
3. DATADIR/my.cnf (如 /usr/local/mysql/data/my.cnf)
4. ~/.my.cnf
find / -name "my.cnf" 2>/dev/null
# 發現 /usr/local/mysql/my.cnf 含有 server_id=1
rm /usr/local/mysql/my.cnf # 刪除干擾文件
systemctl restart mysqld
SHOW VARIABLES LIKE 'server_id'; # 返回 2 ✅
server_id 必須全局唯一(正整數 1~2³²-1)server_idserver_id 產生的事件,則跳過(防止循環復制)GTID = source_id:transaction_id,source_id 即 server_id(或自定義 UUID)| 原則 | 執行動作 |
|---|---|
| 單一配置源 | 只保留 /etc/my.cnf(或 /etc/mysql/my.cnf),刪除/遷移其他路徑下的 my.cnf |
| 啟動驗證 | 部署腳本中加入 mysqld --help --verbose 2>/dev/null | grep -A1 'Default options' 打印實際讀取順序 |
| 運行時核對 | 監控腳本定期執行 SHOW VARIABLES LIKE 'server_id'; 對比配置文件值 |
| 版本管理 | /etc/my.cnf 納入 Git/SVN,變更需審批 |
0:Slave 跳過自身 server_id 的事件1:允許處理自身 server_id 事件(極少用,如特殊環形拓撲)「配置文件寫了不等於生效」。MySQL 多層級配置加載機制是運維隱形坑。
鐵律:find 定位所有 my.cnf → 只保留標準路徑 → 重啟驗證運行時值。
將此納入 MySQL 部署 SOP,杜絕「明明配了為什麼不生效」的靈異事件。