科技看点|分享测试环境中一条sql拖垮整个数据库的解决思路

概述今天主要简单记录一下最近UAT环境中一条sql拖垮数据库的案例 , 仅供参考 。
1、告警一大早起来 , 就冒出这么个告警 , 看起来又要干活了~
科技看点|分享测试环境中一条sql拖垮整个数据库的解决思路2、检查服务器状态可以发现缓存了13G , 内存已经不够用了 , 这台服务器上同时部署了Oracle和mysql服务器 , 初步判断问题在Oracle数据库上 。
科技看点|分享测试环境中一条sql拖垮整个数据库的解决思路
科技看点|分享测试环境中一条sql拖垮整个数据库的解决思路3、尝试清缓存无效
科技看点|分享测试环境中一条sql拖垮整个数据库的解决思路4、查看当前等待事件这台数据库是没有部署DG的 , 暂时不知道为什么有DG相关进程
--V$sessiong_wait提供了任何情况下session在数据库中当前正在等待什么(如果session当前什么也没在做 , 则显示它最后的等待事件),注意这里排除了一些常见的IDLE等待事件SELECTinst_id,wait_class,EVENT, SUM(DECODE(WAIT_TIME, 0, 0, 1)) "Prev", SUM(DECODE(WAIT_TIME, 0, 1, 0)) "Curr", COUNT(*) "Tot" , state, sum(SECONDS_IN_WAIT) SECONDS_IN_WAIT FROM GV$SESSION_WAITWHERE event NOTIN ('smon timer','pmon timer','rdbms ipc message','SQL*Net message from client','gcs remote message')AND event NOT LIKE '%idle%'AND event NOT LIKE '%Idle%'AND event NOT LIKE '%Streams AQ%'GROUP BY inst_id,wait_class,EVENT,stateORDER BY 1,6 desc;说明:1)当state值为Waiting , Second_in_wait值才是实际的等待时间(单位:秒) , 当state值为Waiting known time , 那么wait_time值就是实际等待时间 。 Prev代表上一次等待次数 , Curr代表当前等待次数
科技看点|分享测试环境中一条sql拖垮整个数据库的解决思路
科技看点|分享测试环境中一条sql拖垮整个数据库的解决思路5、查看当前会话基本信息其实在这里就可以看到第二个会话是问题sql了
--可以获得会话基本信息、执行时间、执行sql、使用的临时表空间大小、undo大小和表空间等SELECT /* use_hash(sess,proc,undo,tmp) use_nl(s)*/distinct sess.inst_id,sess.sid,sess.serial#,sess.username,substr(osuser, 1, 10) osuser,status,sess.process,proc.spid,sess.machine,sess.program,regexp_substr(NUMTODSINTERVAL(nvl((SYSDATE - SQL_EXEC_START) * 24 * 60 * 60,last_call_et),'SECOND'),'+\d{2} \d{2}:\d{2}:\d{2}') running_sec,TEMP_MB,UNDO_MB,s.sql_id,TSPS.NAME TSPS,decode(sess.action, null, '', sess.action || ', ') ||replace(s.sql_text, chr(13), ' ') sqlFROM gv$session sess,gv$process proc,gv$sql s,(select ses_addr as saddr, sum(used_ublk / 128) UNDO_MBfrom v$transactiongroup by ses_addr) undo,(select session_addr as saddr,SESSION_NUM serial#,sum((blocks / 128)) TEMP_MBfrom gv$sort_usagegroup by session_addr, SESSION_NUM) tmp,(select inst_id, sid, serial#, event, t.namefrom gv$session ls, sys.file$ f, sys.ts$ twhere status = 'ACTIVE'and ls.p1text in ('file number', 'file#')and ls.p1 = f.file#and f.ts# = t.ts#) tsps WHERE sess.inst_id = proc.inst_id(+)and sess.saddr = tmp.saddr(+)and sess.serial# = tmp.serial#(+)AND sess.status = 'ACTIVE'and sess.username is not nulland sess.sid = tsps.sid(+)and sess.inst_id = tsps.inst_id(+)and sess.serial# = tsps.serial#(+)AND sess.paddr = proc.addr(+)and sess.sql_id = s.sql_id(+)and sess.saddr = undo.saddr(+) ORDER BY running_sec desc, 4, 1, 2, 3;


推荐阅读