您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

MySQL主从同步出现的诡异HA_ERR_KEY_NOT_FOUND故障

时间:2022-04-20 09:29:53  来源:  作者:Mirson架构之道

一、问题现象

背景: 生产环境出现主从同步的故障, 出现的错误为HA_ERR_KEY_NOT_FOUND, 错误码为1032,检查主从数据没有出现缺失, 表结构和数据都完全一致, 经过排查问题是在于主从同步的配置,这里以示例做模拟重现,逐步分析定位出具体原因。

1、升级后, 主从同步出现故障, 错误码为1032,进入从节点, 查看主从同步状态

show slave statusG

出现如下错误:

MySQL主从同步出现的诡异HA_ERR_KEY_NOT_FOUND故障

 

2、查看具体的错误信息

select * from performance_schema.replication_Applier_status_by_worker;

可以看到错误和事务序号信息:

MySQL主从同步出现的诡异HA_ERR_KEY_NOT_FOUND故障

 

这里提示错误的binlog文件为binlog.00025, 下面需要分析此日志文件。

二、原因分析

1、首先对binlog日志进行分析

① 解析主节点的binlog日志

/usr/local/MySQL/bin/mysqlbinlog --no-defaults -v /datadir_3306/log/binlog.000025 --base64-output=decode-rows > bin.000025.txt

根据事物信息,搜索解析后的bin.000025.txt文件:

MySQL主从同步出现的诡异HA_ERR_KEY_NOT_FOUND故障

 

@1对应的是表的第一个字段, @2是第二个字段,根据条件信息, 去从库里面查找, 发现是可以找到对应的记录。

MySQL主从同步出现的诡异HA_ERR_KEY_NOT_FOUND故障

 

② 查看表结构信息

MySQL主从同步出现的诡异HA_ERR_KEY_NOT_FOUND故障

 

生产的这次升级, 是去除了原有的ID自增主键, 保留了唯一索引, 未升级之前是可以正常同步, 于是要在本地验证下, 这种表结构是否可以正常同步。

2、本地主从同步验证

本地搭建的主从同步环境, 采用默认的主从同步配置,验证发现, 无论是新增删除、还是对表结构复原,删除主键ID,再插入数据, 都是可以正常同步。

这里有个特殊之处, 是在于应用程序的写入, 是采用insert into .... on duplicate key update 操作,也就是不存在新增数据, 存在则根据唯一索引更新数据, 但经过实际多次的写入验证, 无论是新增还是更新, 都能够正常进行同步。

3、最后检查生产环境的主从同步配置

​ 问题原因可能出现在主从同步配置上, 为了能够重现, 找出真正原因, 拿到生产的配置, 重新再做主从同步验证。 生产的主从同步配置:

sync_binlog=1 
gtid_mode=on
enforce_gtid_consistency=1
log_bin=/mydata/3306/log/bin.log
log_bin_index=/mydata/3306/log/bin.index
log_slave_updates=1
binlog_format=ROW
binlog_rows_query_log_events=1
relay_log=/mydata/3306/log/relay-bin.log
relay_log_index=/mydata/3306/log/relay-bin.index
relay_log_info_file=/mydata/3306/log/relay-log.info
relay_log_recovery=1
slave_skip_errors=ddl_exist_errors
slave-rows-search-algorithms='INDEX_SCAN,HASH_SCAN'
innodb_flush_log_at_trx_commit=1
max_binlog_size=100M
skip-slave-start=1
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8
slave_preserve_commit_order=1
slave_transaction_retries=128
# 采用半同步模式
plugin_dir='/usr/local/mysql/lib/plugin'
plugin_load="validate_password.so;rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=3000
rpl_semi_sync_slave_enabled=1

这份配置生产一直运行并未出现问题, 初步检查,也没发现什么问题,按此配置更新

1)停止主从同步

stop slave;

2)重置主从同步

reset slave;

3)查看并记录主节点的同步偏移量

show master statusG

MySQL主从同步出现的诡异HA_ERR_KEY_NOT_FOUND故障

 

日志文件为binlog.000024, 偏移量为1567321。

4)修改从节点的同步信息

change master to master_host='10.16.130.79',master_user='replica', master_password='replica', master_port=3306, master_log_file='mysql-bin.000024', master_log_pos=偏移量为1567321, master_connect_retry=30;

5)开启主从同步

start slave;

4、再次进行数据同步, 问题终于重现

将表结构的ID重新去除, 只保留唯一索引, 进行新增数据的操作, 出现了上面的主从同步的问题, 到底是什么问题? 检查发现此项配置可疑:
slave-rows-search-algorithms='INDEX_SCAN,HASH_SCAN', 将此项配置注掉后, 重新进行主从同步验证, 问题消失。

三、问题总结

1、
slave_rows_search_algorithms参数的作用

此参数是从节点接收到数据时, 采用何种方式进行数据查找, 取值如下:

  • TABLE_SCAN,INDEX_SCAN(默认值)
  • INDEX_SCAN,HASH_SCAN
  • TABLE_SCAN,HASH_SCAN
  • TABLE_SCAN,INDEX_SCAN,HASH_SCAN

上面出现问题的原因, 是在于没有启用TABLE_SCAN全表扫描,导致主从同步更新时, 报出HA_ERR_KEY_NOT_FOUND没有找到数据的错误, 但实际数据是存在,虽然有联合唯一索引, 但写入SQL的操作方式并不生效:

MySQL主从同步出现的诡异HA_ERR_KEY_NOT_FOUND故障

 

导致走HASH_SCAN方式。

2、HASH_SCAN方式存在缺陷

查阅相关资料, 发现主从同步走HASH_SCAN方式, 也出现过类似缺陷:

MySQL主从同步出现的诡异HA_ERR_KEY_NOT_FOUND故障

 

3、建议的解决方式

如何保障性能效率, 又能很好的解决此问题:

1) 不用修改主从同步参数
slave-rows-search-algorithms

仍采用“INDEX_SCAN,HASH_SCAN“方式, 这样是可以提升主从同步的效率

2)表结构必须加上主键(可以是自增ID也可以是联合主键), 从检索速度和稳定性来讲, 没特殊需要, 不建议采用字符类型作为主键。



Tags:HA_ERR_KEY_NOT_FOUND   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
MySQL主从同步出现的诡异HA_ERR_KEY_NOT_FOUND故障
一、问题现象背景: 生产环境出现主从同步的故障, 出现的错误为HA_ERR_KEY_NOT_FOUND, 错误码为1032,检查主从数据没有出现缺失, 表结构和数据都完全一致, 经过排查问题是在于主从...【详细内容】
2022-04-20  Search: HA_ERR_KEY_NOT_FOUND  点击:(768)  评论:(0)  加入收藏
▌简易百科推荐
MySQL 核心模块揭秘
server 层会创建一个 SAVEPOINT 对象,用于存放 savepoint 信息。binlog 会把 binlog offset 写入 server 层为它分配的一块 8 字节的内存里。 InnoDB 会维护自己的 savepoint...【详细内容】
2024-04-03  爱可生开源社区    Tags:MySQL   点击:(10)  评论:(0)  加入收藏
MySQL 核心模块揭秘,你看明白了吗?
为了提升分配 undo 段的效率,事务提交过程中,InnoDB 会缓存一些 undo 段。只要同时满足两个条件,insert undo 段或 update undo 段就能被缓存。1. 关于缓存 undo 段为了提升分...【详细内容】
2024-03-27  爱可生开源社区  微信公众号  Tags:MySQL   点击:(17)  评论:(0)  加入收藏
MySQL:BUG导致DDL语句无谓的索引重建
对于5.7.23之前的版本在评估类似DDL操作的时候需要谨慎,可能评估为瞬间操作,但是实际上线的时候跑了很久,这个就容易导致超过维护窗口,甚至更大的故障。一、问题模拟使用5.7.22...【详细内容】
2024-03-26  MySQL学习  微信公众号  Tags:MySQL   点击:(14)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  字节跳动技术团队    Tags:ByteHouse   点击:(29)  评论:(0)  加入收藏
MySQL自增主键一定是连续的吗?
测试环境:MySQL版本:8.0数据库表:T (主键id,唯一索引c,普通字段d)如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不...【详细内容】
2024-03-10    dbaplus社群  Tags:MySQL   点击:(14)  评论:(0)  加入收藏
准线上事故之MySQL优化器索引选错
1 背景最近组里来了许多新的小伙伴,大家在一起聊聊技术,有小兄弟提到了MySQL的优化器的内部策略,想起了之前在公司出现的一个线上问题,今天借着这个机会,在这里分享下过程和结论...【详细内容】
2024-03-07  转转技术  微信公众号  Tags:MySQL   点击:(32)  评论:(0)  加入收藏
MySQL数据恢复,你会吗?
今天分享一下binlog2sql,它是一款比较常用的数据恢复工具,可以通过它从MySQL binlog解析出你要的SQL,并根据不同选项,可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。主要...【详细内容】
2024-02-22  数据库干货铺  微信公众号  Tags:MySQL   点击:(54)  评论:(0)  加入收藏
如何在MySQL中实现数据的版本管理和回滚操作?
实现数据的版本管理和回滚操作在MySQL中可以通过以下几种方式实现,包括使用事务、备份恢复、日志和版本控制工具等。下面将详细介绍这些方法。1.使用事务:MySQL支持事务操作,可...【详细内容】
2024-02-20  编程技术汇    Tags:MySQL   点击:(54)  评论:(0)  加入收藏
MySQL数据库如何生成分组排序的序号
经常进行数据分析的小伙伴经常会需要生成序号或进行数据分组排序并生成序号。在MySQL8.0中可以使用窗口函数来实现,可以参考历史文章有了这些函数,统计分析事半功倍进行了解。...【详细内容】
2024-01-30  数据库干货铺  微信公众号  Tags:MySQL   点击:(55)  评论:(0)  加入收藏
mysql索引失效的场景
MySQL中索引失效是指数据库查询时无法有效利用索引,这可能导致查询性能显著下降。以下是一些常见的MySQL索引失效的场景:1.使用非前导列进行查询: 假设有一个复合索引 (A, B)。...【详细内容】
2024-01-15  小王爱编程  今日头条  Tags:mysql索引   点击:(88)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条