记一次MySQL从节点服务器宕机重启后,从节点出现主键冲突异常的处理

这篇具有很好参考价值的文章主要介绍了记一次MySQL从节点服务器宕机重启后,从节点出现主键冲突异常的处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境

MySQL 5.7 非GTID模式多线程复制。

现象

某MySQL数据库从节点因故障宕机(因故障直接宕机,非正常关闭),重启之后发现复制状态异常,show slave的结果中Slave_SQL_Running为No,错误代码为1062 error code,从系统表performance_schema.replication_applier_status_by_worker以及error log中显示某条数据因为已存在于从节点,主从复制的sql线程试图再次插入这个数据从而导致从节点上数据的主键冲突而失败

原因分析

上述故障发生之前,确信从节点不会写入数据,既然确信从节点的数据不是外界写入的,那么为什么从节点会在回放relay log过程中出现主键冲突错误?
这里在排除从节点的数据是外部写入的情况下,怀疑是sql线程“重复”回放relay log同一条事务造成的。

先梳理一下复制相关的几个重点参数的含义:

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host:                      
                  Master_User:                                             
                  Master_Port: 
                Connect_Retry: 
              Master_Log_File: ***.000066            --从节点IO线程读到的master节点的binlog file
          Read_Master_Log_Pos: 64117146              --从节点IO线程读到的master节点的binlog file 的坐标位
               Relay_Log_File: ***.000143            --从节点正在apply哪个relaylog
                Relay_Log_Pos: 38472356              --从节点正在apply relaylog的坐标位,复制的过程会一直变化
        Relay_Master_Log_File: ***.000049            --从节点apply本地的relay log事件,在master上对应的master binlog file
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
                   Last_Errno: 1062
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 38472155             --从节点apply relay log事件位置在master上对应的master binlog file的位点(如何确定Exec_Master_Log_Pos会在回放relay log时同步更新?异常宕机之后呢?)
              Relay_Log_Space: 1848930175

再简单梳理一下从节点异常宕机,重新启动后复制的启动过程:
MySQL服务启动后,主从复制进程会自动启动(skip_slave_start = off)
1,IO 线程会根据Master_Log_File+Read_Master_Log_Pos继续去主节点拉binlog。
2,SQL 线程会根据Relay_Master_Log_File+Exec_Master_Log_Pos确定当前节点已经回放的relay log的文件和具体的位置,基于此坐标点位继续回放relay log。
如果回放relay log与更新坐标位是绝对准确的,那么MySQL重启后,SQL线程会继续基于这个坐标位点继续回放,理论上不会出错。
设想一下:一个事物已经“回放”过了,但是没有同步更新Relay_Master_Log_File+Exec_Master_Log_Pos坐标位点的情况下宕机,此时重启后会继续基于这个位点做回放,此时就会出现重复回放某个事务日志,其结果就会造成上面的逐渐冲突错误

事实上是不是这样呢?从这里:https://dev.mysql.com/doc/refman/8.0/en/show-replica-status.html,
发现官方文档对Exec_Master_Log_Pos(MySQL 8.0.23之后改名为Exec_Source_Log_Pos)的解释如下:
The position in the current source binary log file to which the replication SQL thread has read and executed, marking the start of the next transaction or event to be processed. This is set to zero for a replication channel with the GTID_ONLY setting after a server start. It will be updated when a transaction is executed or skipped.
You can use this value with the CHANGE REPLICATION SOURCE TO statement's SOURCE_LOG_POS option (from MySQL 8.0.23) or the CHANGE MASTER TO statement's MASTER_LOG_POS option (before MySQL 8.0.23) when starting a new replica from an existing replica, so that the new replica reads from this point. The coordinates given by (Relay_Source_Log_File, Exec_Source_Log_Pos) in the source's binary log correspond to the coordinates given by (Relay_Log_File, Relay_Log_Pos) in the relay log.
Inconsistencies in the sequence of transactions from the relay log which have been executed can cause this value to be a “low-water mark”. In other words, transactions appearing before the position are guaranteed to have committed, but transactions after the position may have committed or not. If these gaps need to be corrected, use START REPLICA UNTIL SQL_AFTER_MTS_GAPS. See Section 17.5.1.34, “Replication and Transaction Inconsistencies” for more information

翻译过来大概意思是:

复制SQL线程读取并执行了当前源二进制日志文件中的位置,标记了要处理的下一个事务或事件的开始。对于具有GTID_ONLY设置的复制通道,在服务器启动后,此值将设置为零。当事务被执行或跳过时,此值将被更新。

你可以在从一个现有副本开始新副本时使用此值(指的是Exec_Master_Log_Pos)与CHANGE REPLICATION SOURCE TO语句的SOURCE_LOG_POS选项(从MySQL 8.0.23开始)或CHANGE MASTER TO语句的MASTER_LOG_POS选项(在MySQL 8.0.23之前)一起使用,以便新副本从此点(指的是Exec_Master_Log_Pos)开始读取。源的二进制日志中的(Relay_Source_Log_File,Exec_Source_Log_Pos)坐标对应于中继日志中的(Relay_Log_File,Relay_Log_Pos)坐标。

从中继日志中已执行的事务序列( the sequence of transactions)中的不一致可能会导致此值成为“低水位标记”(low-water mark)。换句话说就是:出现在该位置之前的事务确实是被提交了的,但位置之后的事务可能已经提交或未提交。如果需要纠正这些差距,请使用START REPLICA UNTIL SQL_AFTER_MTS_GAPS。有关更多信息,请参阅第17.5.1.34节“复制和事务不一致性”。


继续参阅第17.5.1.34节“复制和事务不一致性: https://dev.mysql.com/doc/refman/8.0/en/replication-features-transaction-inconsistencies.html中提到
Source binary log position lag.Even in the absence of gaps, it is possible that transactions after Exec_master_log_pos have been applied. That is, all transactions up to point N have been applied, and no transactions after N have been applied, but Exec_master_log_pos has a value smaller than N. In this situation, Exec_master_log_pos is a “low-water mark” of the transactions applied, and lags behind the position of the most recently applied transaction. This can only happen on multithreaded replicas. Enabling replica_preserve_commit_order or slave_preserve_commit_order does not prevent source binary log position lag.

源binlog位置延迟。即使没有gaps,也可能会出现Exec_master_log_pos之后的事务被回放的情况(笔者注:从节点上Exec_master_log_pos比实际apply的log位置要小的情况)。也就是说,所有N 点位之前的事务都已applied,并且N之后的事务都没有被应用,但Exec_master_log_pos的值小于N。在这种情况下,Exec_master_log_pos是已应用事务的“低水位标记”(low-water mark),并且落后于最近应用的事务的位置。这只能在多线程复制上发生。启用replica_preserve_commit_order或slave_preserve_commit_order不会阻止源二进制日志位置延迟。

 

事实上,多种情况下都潜在 Replication and Transaction Inconsistencies

上述文档证支持上面的猜测:
因为Exec_Master_Log_Pos是延迟更新的,MySQL slave节点重启后,sql线程在“重复”回放relay log同一条事务造成的主键冲突,在从节点宕机之前,某一条事务(insert操作)已经被回放并写入数据库中,此时没来得及更新Exec_Master_Log_Pos信息的情况下宕机,从其之后从Exec_Master_Log_Pos开始回放relay,但是当前Exec_Master_Log_Pos之后的一个或者多个事务在(宕机之前)已经被回访过,(重启之后)再次回放的过程就会发生逐渐冲突错误。

 

解决

用MySQL主从复制跳过事物错误的方式,首先以最小代价的方式恢复主从,同时可以检查errorlog来发现是否存在其他数据冲突的错误。文章来源地址https://www.toymoban.com/news/detail-825182.html

 

到了这里,关于记一次MySQL从节点服务器宕机重启后,从节点出现主键冲突异常的处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 重启某个节点、重启电脑服务器后,kubernetes无法运行,k8s无法运行

    环境:ubuntu18.04 LTS 现象:按步骤安装kubernetes后,正常启动,各个命令均可正常使用。服务器重启后,执行命令错误信息如下: The connection to the server 127.0.0.1:6443 was refused - did you specify the right host or port? 排查防火墙设置 查看端口是否打开 如果无法连接,可以关闭防火墙 重新

    2024年02月05日
    浏览(60)
  • 记一次服务器被挖矿的排查过程:xmrig挖矿病毒

    【阿里云】尊敬的aliyun98****8825: 经检测您的阿里云服务(ECS实例)i-0jl8awxohyxk****axz5存在挖矿活动。根据相关法规、政策的规定,请您于2023-07-18 00时前完成挖矿问题整改,否则您的服务将被关停,详情请查看邮件或阿里云站内消息通知。 若您有其他问题,可登陆阿里云官网在

    2024年02月11日
    浏览(50)
  • 记一次 springboot集成kafka-本地连接服务器的kafka,连接不上的问题

    yml中配置了bootstrap-servers: 服务器地址:9092 ,但是连接时却报了 Connection to node -1 ( localhost/127.0.0.1:9092 ) could not be established. chat给我的回复如下,通过一些列检查我确定了在服务器上,kafka没有问题 最后还是从一篇博客中的第一句话得到了答案,博客链接放在最下方 我是docker安

    2024年01月17日
    浏览(56)
  • 服务器宕机怎么办?怎么预防宕机?

           相信不少用户会听到或者在文章中提到电脑宕机或者服务器宕机,不少用户对宕机的意思不太理解。那么服务器宕机是什么意思?        宕机属于计算机的术语,指电脑或者服务器不能正常工作。口语中我们简单的把停掉机器叫做down机,转换为汉字是“宕机”,不

    2024年01月23日
    浏览(57)
  • Docker系列---【mysql容器手动停止后,重启服务器,mysql容器被删掉了,如何恢复mysql数据?】...

    为了快速搭建数据库,我使用了docker搭建数据库,由于服务器资源紧张,我想先把mysql容器停掉,启动jenkins容器,使用完之后再停掉jenkins,启动mysql,结果由于服务器资源有限,服务器卡死了,无法远程连接了,没办法,我只能登录运营商的云平台管理平台,强制重启服务器

    2024年02月08日
    浏览(47)
  • 华为云服务器宕机,阿里云无人撼动!

    华为云的宕机事件引起舆论轩然大波。 2022年4月10日上午9时左右,华为云“挂了”的话题频繁出现在微博等公众平台。在此次的事件中,除了华为云登录,管理后台无法访问外,还出现了服务器暂时过载,连接错误等提示。 从网友众说纷纭中推测,此次的宕机事件或因北京机

    2024年02月08日
    浏览(39)
  • 优化 - 重构一次Mysql导致服务器的OOM

    优化了一次前后端处理不当导致的CPU的一次爆机行为,当然,这和服务器的配置低也有着密不可分的关系,简单的逻辑学告诉我们,要找到真正的问题,进行解决,CPU爆机的关键点在于前后端两个方面,下面针对具体的问题,进行分析和解决。 定位问题 看监控的图表,CPU已

    2024年01月21日
    浏览(73)
  • 服务器经常宕机的原因及解决办法

    随着如今互联网信息化时代的不断发展,数据存储和传输在各种网络科技面前也显得越来越重要,对于企业来讲,建站之后服务器的安全稳定是至关重要的选择。那么选择一款好用的服务器愈发重要。 当然,不管是多好的服务器提供商,再好的服务器也难免在使用过程中出现

    2024年01月19日
    浏览(55)
  • 在我的智能手机上使用 mysql 运行节点服务器

    在这篇文章中,我想展示如何在 Galaxy 智能手机上使用 mysql 运行节点服务器。看来智能手机可以用作带有wifi的linux系统。但它 可能会损坏您智能手机中的软件 ,所以我建议您 不要尝试 root 手机 。 要在智能手机上运行 mysql,需要访问 root。大多数智能手机品牌在 iOS 和 Android 之间

    2024年02月10日
    浏览(38)
  • 【Nginx】负载均衡当其中一台服务器宕机之后

    搭建一个简单的负载均衡,然后关闭其中一台再来访问,会发现我们的浏览器卡住一直转圈圈,过了很久才会显示结果。由此我们可以得出结论Nginx负载的时候如果其中一台服务挂掉了,它会把请求转发到另一个可以提供服务的机器,其中这之间的超时等待默认是60s。我们可

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包