达梦数据库监控正在执行的长SQL

我们在运维中经常会遇到一个需求:就是业务组请求支援,说跑批卡死,要求定位出哪条SQL语句在执行。确认语句无误后kill掉该会话。


在ORACLE数据库中,v$session视图中有一个SQL_EXEC_START字段代表会话正在调用sql的本次开始执行时间。用如下语句可以方便查出系统中正运行超过1小时的长SQL:

select session_id,program,username,sql_id,event
from v$session 
where status='ACTIVE' and SQL_EXEC_START<sysdate-1/24

当然可以根据实际情况修改时长。比如定位执行超过半小时的语句,上面1/24修改为1/48。定位执行时间超过10分钟的语句,修改为1/24/6。

通过select sql_text from v$sqlarea where sql_id='xxx';或者v$sqltext视图查出sql_id对应的真实语法。业务组确认sql语句无误后,kill掉该会话。


达梦数据库引入了一个视图v$long_exec_sqls,可以方便地查询出执行时间超过1000毫秒的语句。但在实验中发现该视图只能显示已经执行完了的语句,尚未结束的长SQL无法追踪。因此我编了一个小程序实现此功能:

select elapsed,clnt_ip,appname,user_name,RUN_STATUS,sql_text,b.sql_id,
to_char(create_time,'yyyy-mm-dd hh24:mi:ss') session_logon_time,to_char(sql_start_time,
'yyyy-mm-dd hh24:mi:ss') sql_exec_start,sess_id,state
from
(  select sec_to_time(count(*)) elapsed,min(sample_time) sql_start_time,
   session_id,session_serial#,sql_id
   from v$active_session_history 
   group by  session_id,session_serial#,sql_id,sql_exec_id
   having time_to_sec(max(sample_time))>time_to_sec(sysdate)-2
) active_session,v$sessions b
where active_session.session_id=b.sess_id and active_session.session_serial#=b.SESS_SEQ
and active_session.sql_id=b.sql_id
order by elapsed desc
limit 10

上面程序输出系统中所有正在执行的SQL语句,按照已执行时间倒排序,显示TOP10。

业务组确认语句无误后,通过sp_close_session(session_id)kill掉会话。

还有更简单的实现方法:

select clnt_ip,sec_to_time(datediff(ss,last_send_time,sysdate)) elapsed,appname,user_name,RUN_STATUS,sql_id,sql_text,last_send_time
from v$sessions where state in ('ACTIVE','WAIT')
order by elapsed desc
limit 10

通过last_send_time和sysdate的差值计算sql语句的执行时间。last_send_time每次发起新的调用时重置,相当于ORACLE里的sql_exec_start字段。不过在测试中发现,极个别时last_send_time停留在上次调用没有刷新,计算出的elapsed有可能偏大。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值