MySQL主从复制容易出现的故障排错
在我们对MySQL主从复制进行排错的时候,我们首先要明白,MySQL主从复制的原理是什么,知道原理才知道如何去排错。
一、MySQL主从复制:
核心:2日志,3线程。
2日志:
master日志:bin-log
slave日志:relay-log
3线程:
master线程:dump线程
slave线程:I/O和SQL线程
在主从复制中,MySQL-master的dump线程,会监听bin-log的更新,如果bin-log有更新,通知到MySQL-slave的I/O线程,I/O线程读取bin-log里面的更新日志,然后放到relay-log里,SQL监听到relay-log更新后,同步给slave。
二、MySQL主从复制报错:
1、ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
在我MySQL修复数据时候报错;
原因:
从库已经存在之前的relay log;
解决方法:
使用RESET SLAVE语句,清除master信息和relay日志的信息,删除所有的relay日志文件,并开始创建一个全新的中继日志。
mysql> stop slave;
mysql> reset slave;
2、mysql主从复制 Slave_IO_Running: NO
原因一:mysql5.6以上版本使用唯一uuid表示符,数据迁移是使用的物理备份,uuid会重复,修改uuid不一致即可。(克隆容易出现)
vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=85dba00a-e0ef-11e9-b341-000c29812345
# 任意修改几位,重启mysql
原因二:确认server-id 是否唯一, mysql 有可能并没有加载my.cnf 文件中的server-id
# 修改/etc/my.cnf
server-id=3 #主从要不一致
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 3 |
+---------------+-------+
mysql> set global server-id=3; # 如果与my.cnf中设置的不一样,请修改一致
# 重启mysql
原因三:这种原因有可能是主库重启造成的二进制文件位置从库于主库不一致
解决: 需要手动将这些文件二进制日志mysql-bin.00000x,mysql-bin.index删除,rm -rf 掉 在重启数据库