大量慢SQL导致节点宕机的故障分析

在2018年8月28日的一个数据仓库系统中,由于SQL执行时间过长,导致数据库节点宕机和SESSION数量激增。故障分析发现,SQL执行计划错误,全表扫描而非使用索引,可能是由于索引统计信息过期或失效。索引失效原因是删除分区后未维护全局索引。解决方案包括KILL掉长时间运行的SESSION并重建失效索引,同时强调在维护索引时避免使用ONLINE选项以避免等待DML操作完成。
摘要由CSDN通过智能技术生成

故障背景:项目负责人找到我说2018-08-28 11:40:00-2018-08-28 11:45:00左右收到频繁告警短信 数据库节点1宕机,节点2 SESSION数一直在增加。这是一个数据仓库系统,正常情况下SESSION一般是90左右,现在将近500,而且还在增长

select *
  from dba_hist_active_sess_history
 where to_char(sample_time, 'yyyy-mm-dd hh24:mi:ss') >
       '2018-08-28 11:40:00'
   and to_char(sample_time, 'yyyy-mm-dd hh24:mi:ss') <
       '2018-08-28 11:45:00'
   and instance_number = 1
       group by sql_id order by 1 desc

发现果然没有数据返回,说明这时候节点1已经无法不提供服务了

再次向接口人确认得知从2018-08-28 11:00:00就开始收到告警短信了……于是发出如下查询

select max(to_char(sample_time, 'yyyy-mm-dd hh24:mi:ss')),
       min(to_char(sample_time, 'yyyy-mm-dd hh24:mi:ss'))
  from dba_hist_active_sess_history
 where instance_number = 1
   and to_char(sample_time, 'yyyy-mm-dd hh24:mi:ss') >
       '2018-08-28 11:00:00'
   and to_char(sample_time, 'yyyy-mm-dd hh24:mi:ss') <
       '2018-08-28 11:45:00'

 '2018-08-28 11:00:09'  '2018-08-28 11:21:59'
说明节点一在2018-08-28 11:21:59的时候 就已经GG了

一、查一下这最后的20分钟里面节点1经历了什么?首先查SQL语句,有哪些执行时间很长的SQL语句

select count(*),sql_id
  from dba_hist_active_sess_history
 where to_char(sample_time, 'yyyy-mm-dd hh24:mi:ss') >
       '2018-08-28 11:00:09'
   and to_char(sample_time, 'yyyy-mm-dd hh24:mi:ss') <
       '2018-08-28 11:21:59'
       and  instance_number = 1
       group by sql_id order by 1 desc

6903  5cj4kmp6aa9ux
5873  9zn6bkn0kcgv7
3032  cxqmbbffgdbhx
1374  22wxyvttg0xr3
1240  g1q9a31rmfhh9
1095  8bp70fca7gbuk
…………省略

发现节点1的SQL执行时间很过分,将近7w秒,20个小时。

(为什么我们采集时间是20分钟,能够采集到将近7000个snapshot?其实很容易理解,同一个SQL_ID执行了很多次……)

产生大批量的SQL"堵塞"的原因 一般是1.有锁,2.SQL本身的执行时间很长。

如果产生锁 一般也是holder的语句执行时间太长,导致后面大量的waiter在排队等待。我一般先排查SQL问题

查看SQL语句历史执行计划以及相关表信息

select * from table(dbms_xplan.display_awr('5cj4kmp6aa9ux'))
SQL_ID 5cj4kmp6aa9ux
--------------------
SELECT trd.ID          as id,
       trd.BILL_CODE   as billCode,
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值