用过MySQL 主从的同学,肯定遇到过不同步问题,下面我们就此问题聊一下。
一. 查看同步状态
从库:
show slave status G;
.....
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.....
这两个参数必须都是yes为同步成功
如果这两项有NO ,同步出现了问题
a. 如果Slave_IO_Running为NO ,
一般网络有问题,或是复制账号密码有问题,
可以通过log查看出现的问题;
b.如果Slave_SQL_Running为NO
可能sql出错,或是从库执行了写操作
例如:主库存在而从库不存在的表,在往里插入数据时,就会出错,从而同步异常
c. 如果都是NO
多为网络有问题
二. 问题修复
a.如果错误较少
在从库执行
stop slave;
set global sql_slave_skip_counter =1;// 这里是跳过的错误个数
start slave;
如果错误比较多,可以在my.cnf中添加slave-skip-errors=all
b.一旦同步出了问题,数据就可能不一致,如果不允许数据不一致,就要重新同步
三. 重新同步
方法一
主库
先锁表,禁止主库写入
FLUSH TABLES WITH READ LOCK;
记录同步文件和同步位置,下面要使用
show master status;
File: mysql-bin.000045
Position: 224954326
从主库导出数据文件
mysqldump -u root -ppassword --opt -R database > data.sql
将数据导入从库
将data.sql传到从库,在从库导入
mysql -uroot -p database < data.sql
主库恢复写入
UNLOCK TABLES;
从库重新设置:
slave stop;
reset slave;
change master to master_host='IP',master_user='rep_db_user',master_password='password',master_log_file='mysql-bin.000045',master_log_pos=224954326;
slave start;
方法二. 文件同步的方式
1. 停掉主和从server ,主 reset master ;
2. 把主datadir文件复制到从库
3. 重新配置同步信息
reset slave;
change master to master_host='IP',master_user='rep_db_user',master_password='password',master_log_file='mysql-bin.000045',master_log_pos=224954326;
slave start;
不同的版本命令略有不同,具体看到官方文档。
综上,MySQL这种主从同步虽然易配易用 ,但很容易出问题,给人不可靠的感觉,要想搭建稳定 可靠的系统,最好要配合其他的中间件和相应的监控措施。
你在使用中有什么好方法呢,遇到过哪些坑呢,欢迎留言讨论!