本帖最后由 wlzjsj 于 2013-3-15 14:46 编辑
一主一从的2台服务器(mysql 5.1),一直主从相安无事,突然某天从库报警,报出的错误是主键冲突:
Last_SQL_Errno: 1062
Last_SQL_Error: Error 'Duplicate entry '1' for key 'PRIMARY'' on query. Default database:......
仔细查看了下报警的语句,原来是来自于主库上的一个存储过程,这个是个定时批量任务,每隔一段时间就会执行一次,内容大致如下:
ProcA
begin
truncate tabA;
insert into tabA (a,b,c) seelct x1,(select x2 from B where ...),x3 from C where x4=1;
insert into tabA (a,b,c) seelct x1,(select x2 from B where ...),x3 from C where x4=0;
end;
其中tabA表中的a,b,c字段均不是主键,也非唯一索引字段,tabA有个id为主键,自增长。
在主库没有问题,同步到从库,从库报错,解析了主库的binlog和从库的relay-binlog均可以看到 存储过程是拆分条三个语句传送过去的,执行顺序也是对的。
另外做过一个场景:在从库手动给tabA表插入数据,没有问题,等到执行那个存储过程的时候,又开始报主键冲突。而去查这个tabA,事实上是空表;
提供以下参数:
mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'log_bin_trust_routine_creators';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| log_bin_trust_routine_creators | OFF |
+--------------------------------+-------+
1 row in set (0.00 sec)
-----------------------------------------------------以上2个参数主从一致--------------------------------
从库不同的地方配置:
mysql> show variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | ON |
+---------------+-------+
1 row in set (0.00 sec)
=========================
补充:
该参数也是主从一致,如下:
mysql> SHOW VARIABLES LIKE 'auto_increment_%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
另外,我怀疑过是否是硬件问题,硬盘有坏道什么的,查看过从库的系统message,均未有任何错误。可排除硬件硬盘问题