mysql主从复制是常用的数据库高可用架构方案,在搭建过程中,如果直接克隆了主库的服务器作为从库,或者从库的auto.cnf文件被误复制了主库的内容,就会出现主从库UUID重复的问题,导致主从复制无法正常建立连接。

UUID重复的原因
mysql的UUID是实例的唯一标识,存储在数据目录下的auto.cnf文件中。当从库的auto.cnf文件和主库完全一致时,主从复制时主库会识别到两个相同的UUID,认为是从库重复连接,从而拒绝同步请求,主从复制状态会显示为错误。
解决步骤
1. 定位auto.cnf文件位置
首先需要找到mysql的数据目录,auto.cnf文件就存放在该目录下。可以通过登录mysql执行以下命令查询数据目录位置:
-- 查询mysql数据目录 SHOW VARIABLES LIKE 'datadir';
执行后会返回类似datadir为/var/lib/mysql/的结果,auto.cnf文件就在这个路径下。
2. 停止mysql服务
修改auto.cnf文件前需要先停止mysql服务,避免文件被占用导致修改失败。不同系统的停止命令略有区别:
- CentOS/RHEL系统:
systemctl stop mysqld - Ubuntu/Debian系统:
systemctl stop mysql
3. 修改auto.cnf文件
使用文本编辑器打开auto.cnf文件,默认内容格式如下:
[auto] server-uuid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
将server-uuid后面的字符串替换为一个新的、符合UUID格式的字符串即可。UUID格式为8位-4位-4位-4位-12位的十六进制字符串,也可以直接删除auto.cnf文件,重启mysql服务后系统会自动生成新的UUID。
如果是手动生成新的UUID,可以参考以下python代码生成:
import uuid # 生成新的UUID字符串 new_uuid = str(uuid.uuid4()) print(new_uuid)
4. 重启mysql服务
修改完成后保存文件,重新启动mysql服务:
- CentOS/RHEL系统:
systemctl start mysqld - Ubuntu/Debian系统:
systemctl start mysql
5. 验证主从复制状态
登录从库mysql,执行以下命令查看主从复制状态:
-- 查看从库复制状态 SHOW SLAVE STATUSG
如果Slave_IO_Running和Slave_SQL_Running两个字段的值都是Yes,说明主从复制已经恢复正常。
注意事项
- 修改auto.cnf文件时一定要先停止mysql服务,否则修改可能不生效。
- 不要随意修改其他mysql配置文件的内容,避免引发其他服务异常。
- 如果是多从库架构,需要保证所有从库的UUID都和主库以及其他从库不重复。
- 如果删除auto.cnf文件后重启服务,系统生成新UUID后,需要重新配置主从复制的连接信息,因为之前的复制配置可能关联了旧的UUID。