mysql主从同步的两个案例故障

查看从库的状态:
mysql>show slave status\G;

其中Slave_IO_Running:Yes 表明同步IO是否在运行;Slave_SQL_Running:Yes 表明同步SQL是否在运行;Last_Error表明上次出错的内容。

今天碰到一条出错的SQL,内容如下:
Last_Error: Error ‘Duplicate entry ‘14772680-15’ for key ‘PRIMARY’’ on query. Default database: ‘xxxxxxxx’. Query: ‘UPDATE pre_forum_post SET position=position+’14’ WHERE `tid` IN(‘14772680’,’14773058’)’

这条语句导致了从库出错,slave的SQL停止。

执行mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;  跳过冲突的记录。

然后再重启slave
mysql>stop slave
mysql>start slave

事后发现是discuz的pre_home_notification表设计缺陷,id设计为mediumint(8) unsigned,导致从库ID增长超过了最大值,而自增长的ID出现冲突。早前发现问题的时候将主库的字段类型调整了过来,不知道为什么从库没有同步到。

如果碰到Slave_IO_Running:No的话,说明是主从的IO没有运行起来。今天发现另外一台很久没使用的DB也是这个情况,就把他重启了。

错误提示为:
[ERROR] Got fatal error 1236: ‘Could not find first log file name in binary log index file’
from master when reading data from binary log

在主库上查看主库的状态
mysql>show master status;

列出一条记录,很简单的信息
+——————+———–+————–+——————+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———–+————–+——————+
| mysql-bin.002323 | 121077462 |              |                  |
+——————+———–+————–+——————+

然后在从库上执行:
mysql>stop slave;
mysql>change master to master_log_file=’mysql-bin.002323’,master_log_pos=121077462;
mysql>start slave;

再次查看从库的状态
mysql>show slave status\G;
发现正常。

上面的错误提示是因为从库很久没有同步,主库中mysql-bin文件已经没有从库上次同步记录的值了。虽然上述操作可以解决这个问题,但很明显这个从库已经没法使用了,得重新做slave。  

另外今天碰到了一个诡异的现象,就是mysql停掉后启动不起来了。报错
Starting MySQL. ERROR! Manager of pid-file quit without updating file.

#/usr/bin/mysql_safe
之后就正常了,停掉safe模式再启动即可
#service mysql start