今天早上来公司打开邮箱发信有数据库报警,有一个库主从不同步,这个库只是用作备份,不提供任何服务。于是乎登录数据库查看具体报错休息:

Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1062
Last_SQL_Error: Error 'Duplicate entry '170269' for key 'PRIMARY'' on query. Default database: 'lb_sync'. Query: 'REPLACE INTO `setting_1` (`passport`,`content`,`checkcode`,`createtime`,`updatetime` )
VALUES ('kswl663282053' , 'KGTtPfU6/Acthnoq0pdB/L9HVIDahLNuyj19wiPHvCbsNkEdvM+HGbjSLubcnM/DWxOmIMbJdX2/TIxVhmhiuPAs+22vhjI0R8"
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1

又是主键冲突,可是我这个库不提供任何服务,只是去同步主库的数据,为什么会主键冲突呢?坐等高手分析原因哈。

          网上百度谷歌一番,想看一下大家是这么解决这个问题,我靠,都是在从库上执行:

SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

还有做的更绝的,直接在my.cnf加入:

slave_skip_errors = 1062

你们这样做有没有想过后果?这样很有可能导致主库和从库的数据不一致,不纠结了,说一下我的解决方法:

1、在主库和从库上查看id=170269的有几条数据(理论上就一条):

mysql> select count(*) from setting_1 where id=170269;
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

2、查看主库和从库id=170269数据是否一直:

mysql> select * from setting_1 where id=170269;
数据太多就不打印出来了
1 row in set (0.02 sec)

3、如果第二步的结果数据是一致的,那么直接在从库上执行:

mysql> slave stop;
Query OK, 0 rows affected (0.05 sec)
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER =1;
Query OK, 0 rows affected (0.00 sec)
mysql> slave start;
Query OK, 0 rows affected (0.00 sec)

4、如果第二步的结果数据是不一致的,那么需要把主库的数据在从库上重新 replace into到从库,之后再执行第三步。