主从mysql能过滤指定dml吗_MySQL|主从延迟问题排查(一)

一、案例分享

1.1 问题描述

大查询长时间执行无法释放DML读锁,后续同步主库的DDL操作获取DML写锁资源被阻塞等待,导致后续同步主库的操作堆积,主从延迟增长严重。从同步延迟的监控来看,延迟从17:11开始,17:51:59进行kill大查询操作,直到17:53建议业务方将大查询kill掉后才结束。

1.2 处理流程

1、当接收到只读实例的同步延迟告警后,登录到RDS的管理控制台查看实例当前会话执行情况,判断只读实例当前负载压力。从当前会话截图可以看到,会话并无明显堆积,但是有两个执行时间很久的大查询操作。

点击添加图片描述(最多60个字)编辑

ff4d2f4d80e6b4af68a2a0284aaf37c5.png

2、17:11延迟开始,17:51 kill大查询,17:53主从延迟恢复。我们仍需要排查这个期间主实例和只读实例的运行情况,分析造成主从延迟的具体原因

3、对主实例的排查

1)查看延迟期间主库是否有一些批处理/大事务操作,主库业务业务请求上涨或者有批量的更新操作。对此,我们主要观察主实例的QPS/TPS监控、MySQL_COMDML和日志读写的监控指标。

点击添加图片描述(最多60个字)编辑

df4f21bfa9110da089a9319008ff233a.png

点击添加图片描述(最多60个字)编辑

77e6d9e2c4b190920b6f69813b2652ed.png

点击添加图片描述(最多60个字)编辑

40e2c2957d2e3b3ede1c09a06bba5279.png

从以上截图中可以看到,主库TPS在主从延迟期间并没有明显的上涨,说明期间主库业务压力正常;主库MySQL_COMDML和日志读写在主从延迟期间也没有明显的上涨,说明期间主库也没有执行一些批量更新的大事务操作。

2)查看延迟期间主库是否有执行消耗较大的DDL操作。在RDS中若开启了审计日志,我们可以通过时间以及操作类型进行过滤排查

点击添加图片描述(最多60个字)编辑

1dffe52f05650b69f5a9ed6b251b61e8.png

点击添加图片描述(最多60个字)编辑

f5bbc1b2bd8968cbd0745854a7d35900.png

通过对审计日志的搜索,我们搜查到一条对视图定义进行alter的操作,该alter操作仅仅执行了2.32ms,其资源消耗本身并不大。

4、对只读实例的排查

1)查看延迟期间只读实例是否有较大负载压力,从只读实例延迟期间的会话执行情况以及资源消耗可以知道,延迟期间只读实例并无较大负载压力

2)从只读实例的QPS/TPS监控中可以看到,17:51kill掉大查询后只读实例的TPS异常上涨,17:53TPS恢复正常,延迟恢复。说明17:51~17:53期间只读实例在大量应用主库传输过来的binlog日志,恢复主从复制延迟。

点击添加图片描述(最多60个字)编辑

5c6a90c2a8b7aedfa7b920404e0a5ade.png

5、捕捉延迟期间会话中的异常现象,大查询长时间执行未结束,执行explain操作显示为MDL锁等待,结合我们在主库审计日志中搜索到的alter操作,我们可以推断造成主从延迟的原因可能是只读实例大查询阻塞了从主库传输过来的Alter操作,导致后续延迟一直上涨,并在我们kill掉大查询后恢复。

6、为了印证我们的猜想,我们通过审计日志把相关操作的时间线进行梳理

只读实例view_order_logistics_new相关的大查询执行了3602s还未执行完,一直持有表的DML读锁,不影响表的正常读写操作

17:10 主库执行了ALTER ALGORITHM=UNDEFINED DEFINER=super_sha_prd_db@% SQL SECURITY DEFINER VIEW view_order_logistics_new 的操作

只读实例view_order_logistics_new的大查询仍在执行中,此时主库执行alter操作传输到只读实例,alter操作需要的DML写锁与大查询持有的DML读锁冲突

alter操作无法获取到DML写锁从而开始等待锁资源,从主控传输过来的binlog也被阻塞,主从延迟开始上涨

17:51:59 只读实例kill掉了view_order_logistics_new的大查询,只读实例TPS上涨,只读实例开始应用alter操作之后的所有binlog日志

17:53:08 只读实例TPS恢复,应用延迟期间的binlog完毕,主从复制恢复正常

更多技术信息请查看云掣官网https://www.dtstack.com/dtsmart/wy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
好的,下面是一个MySQL中的DML触发器的示例,可以在表中插入、更新和删除行时执行: ```sql CREATE TRIGGER trigger_name AFTER INSERT ON table_name FOR EACH ROW BEGIN -- 在这里编写触发器要执行的操作 END; ``` 其中,`trigger_name`是触发器的名称,`table_name`是要在其上创建触发器的表的名称,`AFTER INSERT ON`表示要在插入行后执行触发器,`FOR EACH ROW`表示在每行插入时都执行触发器。 你可以在`BEGIN`和`END`之间编写触发器要执行的操作。例如,如果要在插入行后向另一个表中插入数据,可以使用以下语法: ```sql CREATE TRIGGER trigger_name AFTER INSERT ON table_name FOR EACH ROW BEGIN INSERT INTO another_table (column1, column2, column3) VALUES (NEW.column1, NEW.column2, NEW.column3); END; ``` 在这个例子中,`NEW`关键字引用了刚刚插入的新行的列值。 类似地,你可以创建一个在更新行后执行的触发器: ```sql CREATE TRIGGER trigger_name AFTER UPDATE ON table_name FOR EACH ROW BEGIN -- 在这里编写触发器要执行的操作 END; ``` 和一个在删除行后执行的触发器: ```sql CREATE TRIGGER trigger_name AFTER DELETE ON table_name FOR EACH ROW BEGIN -- 在这里编写触发器要执行的操作 END; ``` 请注意,这只是一个MySQLDML触发器的基本示例,你可以根据你的实际需求进行修改和调整。同时,在编写触发器时,请确保考虑主键冲突、死锁等可能出现的问题,以确保触发器的正确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值