Rootop 服务器运维与web架构

mysql从库报错HA_ERR_FOUND_DUPP_KEY

Worker 1 failed executing transaction 'ANONYMOUS' at source log mysql-bin.000973, end_log_pos 17372877; 
Could not execute Write_rows event on table dkmirel_gamemotors.casinoaccounting; 
Duplicate entry 'GeneGNMI-2023-12-07 00:00:00-USD-Game24_95_v1' for key 'casinoaccounting.PRIMARY', Error_code: 1062; 
handler error HA_ERR_FOUND_DUPP_KEY; 
the event's source log mysql-bin.000973, end_log_pos 17372877

可以分析出是在mysql-bin.000973二进制日志文件中的17372877位置的sql在从库中执行时,出现了主键重复(表中有多个主键)。

去主库查看binlog日志,关键词上下100行

[root@db01 bin_logs]# mysqlbinlog --no-defaults -v --base64-output=decode-rows mysql-bin.000973 | grep -A 100 -B 100 17372877
略···
### INSERT INTO `dkmirel_gamemotors`.`casinoaccounting`
### SET
###   @1='GeneGNMI'
###   @2='2023-12-07 00:00:00'
###   @3='USD'
###   @4='Game24_95_v1'
###   @5=0.50000000
###   @6=0.00000000
###   @7=1
###   @8=0.50000000
###   @9=0.00000000
###   @10=0.50000000
###   @11=0.00500000
###   @12=0.00000000
###   @13=0.00000000
###   @14=0.00000000
###   @15='0'
###   @16='2023-12-07 07:00:00'
# at 17372877
略···

这里有一条insert操作导致的主键冲突,经过和开发分析原因是数据库中的事件产生的数据,从库也执行了这个事件(每隔一小时执行一次)

根本原因还是因为
从库的数据是从主库mysqldump备份过来的,备份时加了-E参数,也就是同时导出事件
导入到从库后,这条事件的状态为 ENABLED ,从库也会运行。

如果这个事件是从主库同步过来的话,从库会自动将其状态改为 SLAVESIDE_DISABLED,也就是从库侧关闭。

事件相当于一个任务计划,所以导致从库同时间也执行了,主库执行完同步到从库,从库再执行就报重复键的错误了。

这里为新做的从库,直接就reset slave; 主库备份,不导出事件,从库重新导入后配置从库。

虽然可以通过跳过或者跳过指定错误码方式恢复从库。

mysql> set global sql_slave_skip_counter=1;
mysql> start slave;

/etc/my.cnf
[mysqld]
slave-skip-errors = 1062,1032

跳过这条sql或指定的错误码,但是并不太推荐这么干,容易数据不一致。

出现过其他的错误提示:
Worker 1 failed executing transaction ‘ANONYMOUS’ at source log mysql-bin.000963, end_log_pos 28523026;
Could not execute Update_rows event on table wynnrel_secreds.loginhistory;
Can’t find record in ‘loginhistory’, Error_code: 1032;
handler error HA_ERR_KEY_NOT_FOUND;
the event’s source log mysql-bin.000963, end_log_pos 28523026

原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/5371.html

作者:Venus

服务器运维与性能优化

评论已关闭。