包拯断案 | 数据库从库复制延迟引发高可用风险 怎么破@还故障一个真相

news2024/9/23 16:21:46

提问:作为DBA运维的你是否遇到过这些烦恼
1、数据库从库复制出现了延迟,是什么原因导致的?
2、延迟引发了高可用风险,应该如何处理?

心中有章,遇事不慌

作为DBA的你,遇到问题无从下手,除了在问题面前徘徊,还能如何选择?如果你一次或多次遇到该问题还是无法解决,又很懊恼,该如何排忧呢?关注公众号,关注《包拯断案》专栏,让小编为你排忧解难~

包拯秘籍

一整套故障排错及应对策略送给你,让你像包拯一样断案如神:

#首先
遇到此类问题后,我们要做到心中有章(章程),遇事不慌。一定要冷静,仔细了解故障现象(与研发/用户仔细沟通其反馈的问题,了解故障现象、操作流程、数据库架构等信息)

#其次
我们要根据故障现象进行初步分析。心中要想:是什么原因导致数据库从库复制出现延迟?例如:是大事务导致了从库延迟,还是参数设置不当原因导致的?

#然后
针对上述思考,我们需要逐步验证并排除,确定问题排查方向。

#接着
确定了问题方向,进行具体分析。通过现象得出部分结论,通过部分结论继续排查并论证。

#最后
针对问题有了具体分析后,再进行线下复现,最终梳理故障报告。

真刀实战,我们能赢

说了这么多理论,想必实战更让你心动。那我们就拿一个真实案例进行分析——某国有大型商业银行业务系统发生主从延迟告警,这种问题该如何快速分析处理:

1、故障发生场景

在项目现场兢兢业业进行数据库环境部署的你,突然发现某个系统出现了主从延迟告警。虽然不影响生产主库使用,但导致从库复制延迟,存在数据库集群的高可用风险,DBA心中警铃大作,立马着手排查。

2、故障排查分析

1)根据告警短信查询主从同步状态,发现从库接收到的gtid为1-12481714,从库应用的gtid为1-12396346,主从延迟大概85w个事务。经过分析发现,生产主库正常运行,从库同步任务SQL线程与IO线程无报错,初步怀疑为大事务导致的从库延迟。

经过仔细排查分析,发现该故障是由于生产库中创建了一张无主键、无索引的“测试表”,同时该表存在较多text类型的大字段。然后在生产库执行了一条没有过滤条件的update语句,导致整个语句走了全表扫描,该“测试表”共计924384条数据,属于大事务。

事务语句如下图:
请添加图片描述

由于该update语句没有引用任何过滤条件,且表无主键、无索引,导致该语句走了全表扫码,更新92w行,通过binlog行模式将日志发送到备库后需要回放92w次。每次都需要进行一次全表扫描,备集群回放慢主备。

2)继续观察主从同步延迟情况,发现主从延迟并无缩小,判断备库日志回放夯住。由于主从库事务量相差较多,建议重做备库,该方案操作风险最低,且能完全保证主从库间的数据一致性。

3、问题复现

1)测试创建无主键表

请添加图片描述

直接创建无主键表,显示失败,报错不支持创建无主键表。

2)创建测试表

请添加图片描述

通过create table xx select * from xxx方式将表进行复制,此时复制后的表是无主键表。

3)测试更新语句
请添加图片描述
请添加图片描述

当dbscale-safe-sql-mode参数为2时,无法执行无条件更新语句;当该参数为1时,可以执行无条件更新语句。

4)按照生产环境规模,构建更新后同步异常情况复现场景——
请添加图片描述
请添加图片描述

通过第4步复现出无主键大表,进行全表更新,出现主从卡住的现象。

5)通过以上测试步骤说明:

采用create table xxx as select * from xxx方式直接复制表,会丢掉原表一些信息,例如主键、索引等。

复盘总结

  1. 研发人员要严格按照参数开发规范中的描述进行开发,禁止使用create table xxx as select * from xxx语句进行表复制。并将表复制操作修改为2步:第一步复制元数据,create table xxx like xxxx;第二步复制数据,insert into xxx select * from xxxx。
    2.避免在生产环境中进行测试。
    3.大事务要进行拆分,避免出现全表更新或删除等操作。
    4.通过参数sql_require_primary_key(创建新表或更改现有表结构的语句是否强制要求表具有主键),规避create table as select 行为。
    5.建议将dbscale-safe-sql-mode参数设置为2,禁止进行无条件更新语句执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1971908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【轨物方案】评估光伏组件发电性能一致性方案

光伏电站建设后运行周期长达二十多年,对于电站运营者来说,基础设施的稳定、安全、高效的运行是至关重要的。然而从近些年光伏的发展过程中看到,在电站规划到后期运维整个过程中可能存在着诸多问题,如设备选型不当、施工建设质量差…

RHCSA第一次作业

目录 1、创建以上目录和文件结构,并将/yasuo目录拷贝4份到/目录下 2、查看系统合法shell 3、查看系统发行版版本 4、查看系统内核版本 5、临时修改主机名 6、为/yasuo/ssh_config文件创建软链接/ssh_config.link到/mulu下 7、创建目录/mulu ,重命名并移动/ss…

Linux用户-su命令

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注我,我尽量把自己会的都分享给大家,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux是一个多用户多任务操作系统,这意味着它可以同时支持多个用户登录并使用系统。…

【前端面试题】后端一次性返回10w条数据,该如何渲染?

后端一次返回 10w 条数据,本身这种技术方案设计就不合理。 问题分析: JS 支持处理10w 条数据,但 DOM 一次渲染 10w 条数据,可能会卡顿,所以需想办法减少 DOM 渲染 若非要实现,则可以考虑以下两种方案 自…

「测试线排查的一些经验-上篇」 后端工程师

文章目录 端口占用脚本失灵线上部署项目结构模版配置文件生效 一般产品研发过程所使用的环境可分为: 研发环境-dev测试环境-test生产环境-prod 软件开发中,完整测试环境包括:UT、IT、ST、UAT UT Unit Test 单元测试 IT System Integration …

《C语言程序设计 第4版》笔记和代码 第十二章 数据体和数据结构基础

12.1从基本数据类型到抽象数据类型 1 所有的程序设计语言都不能将所有复杂数据对象作为其基本数据类型,因此需要允许用户自定义数据类型,在C语言中,就存在构造数据类型(复合数据类型)。 2 结构体是构造数据类型的一种…

使用Openvino部署C++的Yolov5时类别信息混乱问题记录

使用Openvino部署C的Yolov5时类别信息混乱问题记录 简单记录一下。 一、问题描述 问题描述:在使用Yolov5的onnx格式模型进行C的Openvino进行模型部署时,通过读取classes.txt获得类别信息时,出现模型类别混乱,或者说根本就不给图…

【原创】java+swing+mysql学分管理系统设计与实现

个人主页:程序员杨工 个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验 博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战 开发背景: 随着信息技术的…

嵌入式单片机中在线调试工具使用方法

大家好,相信很多小伙伴都听说过,或者用过SystemView这款工具。 它是一个可以在线调试嵌入式系统的工具,它可以分析RTOS有哪些中断、任务执行了,以及这些中断、任务执行的先后关系。 还可以查看一些内核对象持有和释放的时间点,比如信号量、互斥量、事件、消息队列等,这在…

Vue3 form表单赋值后,input输入框无法输入

1.使用reactive初始化数据: 需要用一个对象包裹数据,使其变成响应式数据 Form表单及JS中的使用都需要 “paramr.formUser” 进行调用 原因: 使用reactive生成的响应式数据,在直接赋值时把响应式数据给替换为了普通数据了,导致无法监听数据的变化。 2. …

Flutter——权威常用组件demo代码开源

背景 自学的过程中,并记录下来仅供大家一起学习 开源地址:https://github.com/z244370114/flutter_demo

软件测试经典面试题,助你面试加分

一 时间紧迫的情况下,如何做好测试工作? 对需求要明确,对需求的优先级也要明确,在项目的过程中就可以少做变更的工作。减少测试的工作量。 由资深测试工程师对测试用例进行设计,并进行用例评审。 用例要重点覆盖主要…

Cocos Creator2D游戏开发(10)-飞机大战(8)-计分和结束

现在游戏基本能完了, 飞机能发射子弹,打了敌机,敌机也能炸; 接下来要做计分了; 步骤: 搞出一个lable让lable显示炸了多少飞机 开搞: ①创建一个Lable标签 ② root.ts文件 添加 property(Label) player_score: Label; // 标签属性 标签绑定 ③ 代码添加 注册 然后回调 contac…

iOS弱引用

背景:在面试过程中被问到如果两个对象已经发生循环引用了,该如何将他们剪断,在运行态的时候。 由于这个场景比较抽象,我理解面试官是希望我通过运行时的方法和方式来解决循环引用。 解决方案一: 重写setter用关联对象来实现wea…

【C++11】:右值引用移动语义完美转发

目录 前言一,左值引用和右值引用二,左值引用与右值引用比较三,探索引用的底层四,右值引用使用场景和意义4.1 解决返回值问题4.2 STL容器插入接口的改变 五,移动语义六,完美转发6.1 模板中的&& 万能…

【动态路由协议】RIP

一、前导知识 动态路由协议分类: 1.IGP(内部网关协议,位于同一个自治系统内) 1.1距离矢量路由协议 RIP(距离矢量路由) 1.2链路状态路由协议 OSPF(开放式最短路径优先) IS-IS(中间系统到中间系统…

Xinstall新玩法:Web直接打开App,用户体验再升级!

在移动互联网时代,App已成为我们日常生活中不可或缺的一部分。然而,在App推广和运营过程中,许多开发者面临着从Web端引流到App的难题。这时,Xinstall作为国内专业的App全渠道统计服务商,提供了一种创新的解决方案——通…

【前端 21】Vue Router路由配置

Vue Router路由配置 在Vue.js项目中,Vue Router是官方提供的路由管理器,用于构建单页面应用(SPA)。它允许我们通过不同的URL访问不同的页面组件,而无需重新加载页面。下面,我将详细介绍如何在Vue项目中配置…

【研发日记】Matlab/Simulink技能解锁(十二)——Stateflow中的两种状态机嵌套对比

文章目录 前言 项目背景 两级状态机 函数状态机 分析和应用 总结 参考资料 前言 见《【研发日记】Matlab/Simulink技能解锁(七)——两种复数移相算法》 见《【研发日记】Matlab/Simulink技能解锁(八)——分布式仿真》 见《【研发日记】Matlab/Simulink技能解锁(九)——基…