配置好 server-id 仍報 Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs。真兇是 auto.cnf 中的 server-uuid,虛擬機克隆導致主從 UUID 完全一致。本文提供定位、修復、驗證全流程。
mysql> SHOW SLAVE STATUS\G
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs;
these UUIDs must be different for replication to work.
檢查 server_id 已不同(Master 33,Slave 11),但錯誤依然存在。關鍵認知:MySQL 5.6+ 引入 server_uuid 作為全局唯一標識,優先級高於 server_id。
# Master
[root@dbsrv1 ~]# cat /data/mysqldata/auto.cnf
[auto]
server-uuid=62ee10aa-b1f7-11e4-90ae-080027615026
# Slave (克隆自 Master)
[root@dbsrv2 ~]# cat /data/mysqldata/auto.cnf
[auto]
server-uuid=62ee10aa-b1f7-11e4-90ae-080027615026 # 完全一致!
auto.cnf 位於數據目錄 (datadir),MySQL 啟動時自動讀取/生成,**不可手動編輯**(官方警告)。
# Slave 端操作
[root@dbsrv2 ~]# mv /data/mysqldata/auto.cnf /data/mysqldata/auto.cnf.bak
[root@dbsrv2 ~]# service mysql restart
Shutting down MySQL. [ OK ]
Starting MySQL. [ OK ]
# 驗證新 UUID 已生成
[root@dbsrv2 ~]# cat /data/mysqldata/auto.cnf
[auto]
server-uuid=6ac0fdae-b5d7-11e4-a9f3-0800278ce5c9 # 新唯一 UUID
# Slave 狀態
[root@dbsrv1 ~]# mysql -uroot -p -e "SHOW SLAVE STATUS\G" | grep Running
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
# Master 視角查看從庫 UUID
mysql> SHOW SLAVE HOSTS;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+-----------+------+------+-----------+--------------------------------------+
| 33 | | 3306 | 11 | 62ee10aa-b1f7-11e4-90ae-080027615030 |
| 22 | | 3306 | 11 | 6ac0fdae-b5d7-11e4-a9f3-0800278ce5c9 | # 新 UUID
+-----------+------+------+-----------+--------------------------------------+
| 屬性 | server_id | server_uuid |
|---|---|---|
| 引入版本 | 早期版本 | MySQL 5.6+ |
| 配置方式 | my.cnf 手動設置 | 啟動時自動生成/讀取 auto.cnf |
| 作用範圍 | 復制拓撲識別 | 全局唯一標識、GTID 事務標識 |
| 修改生效 | 重啟 | 重啟(自動重新生成) |
| 可見性 | SHOW VARIABLES | SHOW VARIABLES / SHOW SLAVE HOSTS / SHOW SLAVE STATUS |
#!/bin/bash
# 適用於從模板克隆的多從庫初始化
DATADIR="/data/mysqldata"
if [ -f "$DATADIR/auto.cnf" ]; then
echo "[$(date)] Removing cloned auto.cnf to generate unique server_uuid"
mv "$DATADIR/auto.cnf" "$DATADIR/auto.cnf.$(date +%s).bak"
fi
systemctl restart mysqld
# 等待啟動並驗證
sleep 5
NEW_UUID=$(mysql -uroot -p${ROOT_PASS} -sN -e "SHOW VARIABLES LIKE 'server_uuid';" | awk '{print $2}')
echo "[$(date)] New server_uuid generated: $NEW_UUID"
SHOW SLAVE HOSTS 中是否存在重複 UUID一個 mv + restart 解決戰術問題;納入克隆 SOP 解決戰略問題。UUID 是實例的「身份證」,克隆必須換證。