萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 主從報錯「slave have equal MySQL server UUIDs」:虛擬機克隆導致的 UUID 衝突根治

配置好 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。

根因定位:auto.cnf 文件


# 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 啟動時自動讀取/生成,**不可手動編輯**(官方警告)。

標準修復:刪除/重命名 auto.cnf 重啟


# 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 vs server_uuid

屬性server_idserver_uuid
引入版本早期版本MySQL 5.6+
配置方式my.cnf 手動設置啟動時自動生成/讀取 auto.cnf
作用範圍復制拓撲識別全局唯一標識、GTID 事務標識
修改生效重啟重啟(自動重新生成)
可見性SHOW VARIABLESSHOW 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"

避坑清單

  1. 克隆/快照/鏡像部署 MySQL 實例時,必須刪除 auto.cnf
  2. 不要手動編輯 auto.cnf,格式錯誤會導致啟動失敗
  3. GTID 模式下 UUID 衝突更嚴重:事務 ID 含 UUID,衝突會導致複製中斷且難以修復
  4. 監控告警:巡檢腳本檢測 SHOW SLAVE HOSTS 中是否存在重複 UUID

一個 mv + restart 解決戰術問題;納入克隆 SOP 解決戰略問題。UUID 是實例的「身份證」,克隆必須換證。

copyright © 萬盛學電腦網 all rights reserved