mysql主从同步故障-slave_sql_running: no
故障现象:
进入slave服务器,运行:
mysql> show slave status\g
.......
relay_log_file: localhost-relay-bin.000535
relay_log_pos: 21795072
relay_master_log_file: localhost-bin.000094
slave_io_running: yes
slave_sql_running: no
replicate_do_db:
replicate_ignore_db:
......
解决办法一、
slave_sql_running: no
1.程序可能在slave上进行了写操作
2.也可能是slave机器重起后,事务回滚造成的.
一般是事务回滚造成的:
解决办法:
mysql> slave stop;
mysql> set global sql_slave_skip_counter=1;
mysql> slave start;
解决办法二、
首先停掉slave服务:slave stop
到主服务器上查看主机状态:
记录file和position对应的值
进入master
mysql> show master status;
+----------------------+----------+--------------+------------------+
| file | position | binlog_do_db | binlog_ignore_db |
+----------------------+----------+--------------+------------------+
| localhost-bin.000094 | 33622483 | | |
+----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
然后到slave服务器上执行手动同步:
mysql> change master to
> master_host='master_ip',
> master_user='user',
> master_password='pwd',
> master_port=3306,
> master_log_file=localhost-bin.000094',
> master_log_pos=33622483 ;
1 row in set (0.00 sec)
mysql> slave start;
1 row in set (0.00 sec)
mysql> show slave status\g
*************************** 1. row ***************************
........
master_log_file: localhost-bin.000094
read_master_log_pos: 33768775
relay_log_file: localhost-relay-bin.000537
relay_log_pos: 1094034
relay_master_log_file: localhost-bin.000094
slave_io_running: yes
slave_sql_running: yes
replicate_do_db:
手动同步需要停止master的写操作!
查看mysql主从配置的状态及修正 slave不启动问题
1、查看master的状态
show master status; //position不应该为0
show processlist;
//state状态应该为has sent all binlog to slave; waiting for binlog to be updated
2、查看slave状态
show slave status;
//slave_io_running 与 slave_sql_running 状态都要为yes
show processlist;
//应该有两行state值为:
has read all relay log; waiting for the slave i/o thread to update it
waiting for master to send event
3、错误日志
mysql安装目录 /usr/local/mysql
mysql日志目录 /usr/local/mysql/data/ 形如,hostname.err
4、change master to
如果从库的slave未启动,slave_io_running为no。
可能是主库是的master的信息有变化,
查看主库show master status;
记录下file,position字段,假设为‘mysql-bin.000004’,98;
在从库执行:
mysql>stop slave;
mysql>change master to master_log_file='mysql-bin.000004',master_log_pos=98;
mysql>start slave;
5、set global sql_slave_skip_counter=n;
如果从库的slave_sql_running为no。
err文件中记录:
slave:error duplicate entry '1' for key 1 on query.....
可能是master未向slave同步成功,但slave中已经有了记录。造成的冲突可以在从库上执行
set global sql_slave_skip_counter=n;
跳过几步。再restart slave就可以了。
6、同步错误处理
发现mysql slave服务器经常因为一些特殊字符或者符号产生的更新语句报错,整个同步也会因此而卡在那,,最初的办法只是手动去出错的机器执行下面三条sql语句,跳过错误即可。
mysql>slave stop;
mysql>set global sql_slave_skip_counter=1;
mysql>slave start;
ps:本人多次遇到从数据库的同步进程自动停掉的问题,有时简单通过slave stop,slave start即可解决。有时slave start启动后又会自动停掉,这时使用 change master重设主数据库信息的方式解决了问题。
说明:
slave_io_running:连接到主库,并读取主库的日志到本地,生成本地日志文件
slave_sql_running:读取本地日志文件,并执行日志里的sql命令。