Oracle查询长时间执行sql,Oracle11g 查询长时间运行的SQL

一、大量的查询

某些时候,因为SQL的问题,导致数据库的session大量积压,服务器的磁盘读增大,CPU使用率剧增。一般这种SQL,都是一些全表扫描、多表关联、报表或者排序类的SQL。这中情况很有可能,是客户端查询造成的。一般程序里面都会设置客户端查询超时时间,一旦某条SQL查询时间超过了程序设置的超时时间,那么这个客户端的查询则被kill掉,但是下发到数据库的SQL仍然还在运行,直到查询出结果。因此,这些大量积压的SQL就是没用的SQL,需要我们将这些SQLkill掉。

某个session阻塞好几个session

select 'alter system kill session '||''''||s.SID||','||s.SERIAL#||''''||';',s.SID,s.blocking_session,s.MACHINE,s.OSUSER,s.PROGRAM,

s.USERNAME,s.last_call_et,a.SQL_ID,s.LOGON_TIME,a.SQL_TEXT,a.SQL_FULLTEXT,

w.EVENT,a.DISK_READS,a.BUFFER_GETS

from v$process p,v$session s,v$sqlarea a,v$session_wait w

where p.ADDR = s.PADDR and s.SQL_ID = a.sql_id and s.sid = w.SID

and s.STATUS = 'ACTIVE' and s.PROGRAM !='plsqldev.exe' and s.OSUSER !='oracle'

--and a.SQL_TEXT like 'select%'

order by s.last_call_et desc;

7edbeede195aadd52ee1e9bcd5851abe.png

二、大量行锁

某些时候,session突然巨量增加,并且久久不释放。查询告警日志,可能发现告警中记录由死锁。这种情况,一般由DML语句造成(表的外键没索引,程序逻辑错乱,网络波动)

记录表/行锁的监控(上面《一》中的监控SQL也可使用查看)

1.建表

-- Create table

create table DB_BLOCK_RECORD

(

DB_USER         VARCHAR2(30),

BK_USER         VARCHAR2(30),

BK_SID          NUMBER not null,

BK_SERIAL       NUMBER,

BK_WAIT_EVENT   VARCHAR2(64),

BK_WAIT_CLASS   VARCHAR2(64),

BK_APP          VARCHAR2(48),

BK_MACHINE      VARCHAR2(64),

BK_OS_USER      VARCHAR2(30),

BK_SQL_ID       VARCHAR2(13),

BK_SQL_TEXT     VARCHAR2(1000),

WT_USER         VARCHAR2(30),

WT_SID          NUMBER not null,

WT_SERIAL       NUMBER,

WT_WAIT_EVENT   VARCHAR2(64),

WT_WAIT_CLASS   VARCHAR2(64),

WT_APP          VARCHAR2(48),

WT_MACHINE      VARCHAR2(64),

WT_OS_USER      VARCHAR2(30),

WT_SQL_ID       VARCHAR2(13),

WT_SQL_TEXT     VARCHAR2(1000),

LOCK_TYPE       VARCHAR2(26),

MODE_HELD       VARCHAR2(40),

MODE_REQUESTED  VARCHAR2(40),

LOCK_ID1        VARCHAR2(40) not null,

LOCK_ID2        VARCHAR2(40) not null,

BLOCKING_OTHERS VARCHAR2(40),

BK_TIME         DATE default sysdate not null

)

tablespace DBADMIN

pctfree 10

initrans 1

maxtrans 255

storage

(

initial 64K

next 1M

minextents 1

maxextents unlimited

);

-- Create/Recreate primary, unique and foreign key constraints

alter table DB_BLOCK_RECORD

add constraint PK_DB_BLOCK_RECOR primary key (BK_SID, WT_SID, LOCK_ID1, LOCK_ID2)

using index

tablespace DBADMIN

pctfree 10

initrans 2

maxtrans 255

storage

(

initial 64K

next 1M

minextents 1

maxextents unlimited

);

2.创建存储过程

create or replace procedure proc_DB_BLOCK_RECORD as

v_num            number;

v_ROWS           number;

v_count          number;

cursor v_CURSOR is

SELECT  bs.username DB_User,

bs.username BK_User,bs.SID BK_SID,bs.SERIAL# BK_SERIAL,

bs.EVENT BK_WAIT_EVENT,bs.WAIT_CLASS BK_WAIT_CLASS,bs.program BK_App,bs.machine BK_Machine,

bs.osuser BK_OS_User,

bs.SQL_ID BK_SQL_ID,sa.SQL_TEXT BK_SQL_TEXT,

ws.username WT_User,ws.SID WT_SID,ws.SERIAL# WT_SERIAL,

ws.EVENT   WT_WAIT_EVENT,ws.WAIT_CLASS WT_WAIT_CLASS,ws.program WT_App,ws.machine WT_Machine,

ws.osuser WT_OS_User,

sa.SQL_ID WT_SQL_ID,sa.SQL_TEXT WT_SQL_TEXT,

DECODE (wk.TYPE,

'MR', 'Media Recovery',

'RT', 'Redo Thread',

'UN', 'USER Name',

'TX', 'Row Locks',

'TM', 'Table Locks',

'UL', 'PL/SQL USER LOCK',

'DX', 'Distributed Xaction',

'CF', 'Control FILE',

'IS', 'Instance State',

'FS', 'FILE SET',

'IR', 'Instance Recovery',

'ST', 'Disk SPACE Transaction',

'TS', 'Temp Segment',

'IV', 'Library Cache Invalidation',

'LS', 'LOG START OR Switch',

'RW', 'ROW Wait',

'SQ', 'Sequence Number',

'TE', 'Extend TABLE',

'TT', 'Temp TABLE',

wk.TYPE

) lock_type,

DECODE (hk.lmode,

0, 'None',

1, 'NULL',

2, 'ROW-S (SS)',

3, 'ROW-X (SX)',

4, 'SHARE',

5, 'S/ROW-X (SSX)',

6, 'EXCLUSIVE',

TO_CHAR (hk.lmode)

) mode_held,

DECODE (wk.request,

0, 'None',

1, 'NULL',

2, 'ROW-S (SS)',

3, 'ROW-X (SX)',

4, 'SHARE',

5, 'S/ROW-X (SSX)',

6, 'EXCLUSIVE',

TO_CHAR (wk.request)

) mode_requested,

TO_CHAR (hk.id1) lock_id1, TO_CHAR (hk.id2) lock_id2,

DECODE

(hk.BLOCK,

0, 'NOT Blocking',          /**//* Not blocking any other processes */

1, 'Blocking',              /**//* This lock blocks other processes */

2, 'Global',           /**//* This lock is global, so we can't tell */

TO_CHAR (hk.BLOCK)

) blocking_others  ,sysdate

FROM v$lock hk, v$session bs, v$lock wk, v$session ws,v$sqlarea sa

WHERE hk.BLOCK = 1

AND hk.lmode != 0

AND hk.lmode != 1

AND wk.request != 0

AND wk.TYPE(+) = hk.TYPE

AND wk.id1(+) = hk.id1

AND wk.id2(+) = hk.id2

AND hk.SID = bs.SID(+)

AND wk.SID = ws.SID(+)

AND (bs.username IS NOT NULL)

AND (bs.username <> 'SYSTEM')

AND (bs.username <> 'SYS')

and ws.SQL_ID=sa.SQL_ID

ORDER BY 4,11,23,24;

begin

select count(1) into v_num from dba_blockers;

v_rows := 0;

if v_num > 0 then

for varA in v_CURSOR loop

insert /*+  IGNORE_ROW_ON_DUPKEY_INDEX(DB_BLOCK_RECORD,PK_DB_BLOCK_RECOR) */

into DBADMIN.DB_BLOCK_RECORD

values

(

varA.DB_User,varA.BK_User,varA.BK_SID,varA.BK_SERIAL,varA.BK_WAIT_EVENT,varA.BK_WAIT_CLASS,varA.BK_App,

varA.BK_Machine,varA.BK_OS_User,varA.BK_SQL_ID,varA.BK_SQL_TEXT,

varA.WT_User,varA.WT_SID,varA.WT_SERIAL,varA.WT_WAIT_EVENT,varA.WT_WAIT_CLASS,

varA.WT_App,varA.WT_Machine,varA.WT_OS_User,varA.WT_SQL_ID,varA.WT_SQL_TEXT,

varA.lock_type,varA.mode_held,

varA.mode_requested,varA.lock_id1,varA.lock_id2,varA.blocking_others,varA.sysdate

);

--insert into DBADMIN.DB_BLOCK_RECORD_temp

--values(varA.BK_SID,varA.BK_SERIAL,varA.WT_SID,varA.WT_SERIAL,varA.lock_id1,varA.lock_id2);

v_rows := v_rows+1;

end loop;

commit;

---select  from DBADMIN.DB_BLOCK_RECORD_temp where rownum<=v_rows;

--DBMS_OUTPUT.PUT_LINE(v_ROWS);

DBMS_OUTPUT.PUT_LINE(v_ROWS);

else

DBMS_OUTPUT.PUT_LINE(0);

end if;

end;

3.定时任务

cat db_block_record.sh

#!/bin/bash

source /home/oracle/.bash_profile

while true

do

sleep 1

v_log=/u01/dba_scripts/db_block_record/log/db_block_record.log

v_date=`date +"%Y-%m-%d %H:%M:%S"`

v_out=`sqlplus -s dbadmin/QazWsx12  <

set colsep' ';

set feedback off;

set heading off;

set pagesize 0;

set termout off;

set trimout on;

set trimspool on;

set serveroutput on;

exec dbadmin.proc_DB_BLOCK_RECORD

EOF`

echo "$v_out"

if [ "$v_out" -gt 0 ]

then

echo "$v_date "----" $v_out"" waiter,please check!" >> "$v_log"

fi

done

ASP&period;NET 工作流:支持长时间运行操作的 Web 应用程序

ASP.NET 工作流 支持长时间运行操作的 Web 应用程序 Michael Kennedy   代码下载位置:MSDN 代码库 在线浏览代码 本文将介绍以下内容: 独立于进程的工作流 同步和异步活 ...

三点经验:长时间运行函数需要随时发射信号报告进度,以及设置bool变量随时可以退出,每做一步操作必须及时记录和处理相关信息

三点经验:长时间运行函数需要随时发射信号报告进度,以及设置bool变量随时可以退出,每做一步操作必须及时记录和处理相关信息 不能到最后一起处理,否则万一中间出错了,这个记录状态就全部都乱了.

定时器解决js长时间运行脚本问题

一般地,单个js操作的运行时间不应超过100毫秒,否则的话,会影响用户体验,用户会认为自己与界面失去联系.而对于一些复杂的任务,可能无法在100ms内完成,甚至会突破浏览器限制(调用栈大小限制和长时间 ...

查询系统正在运行的SQL语句

查询系统正在运行的SQL语句: select a.program, b.spid, c.sql_text from v$session a, v$process b, v$sqlarea c wher ...

&lbrack;ASP&period;NET Core 3框架揭秘&rsqb; 服务承载系统&lbrack;1&rsqb;&colon; 承载长时间运行的服务&lbrack;上篇&rsqb;

借助.NET Core提供的承载(Hosting)系统,我们可以将任意一个或者多个长时间运行(Long-Running)的服务寄宿或者承载于托管进程中.ASP.NET Core应用仅仅是该承载系统的一 ...

hadoop如何处理长时间运行不完成的map&sol;reduce 任务&quest;

如果某一个任务在某个节点上长时间不完成,怎么手动干预来处理这种情况?董西成博客上找到的回答:hadoop中有三种特殊的任务,failed task,killed task和speculative ta ...

jetty 长时间运行之后出现 PWC6117 file not found

严重: PWC6117: File "%2Ftmp%2Fjetty-0.0.0.0-9090-admin.war-_admin-any-%2Fwebapp%2Ferror%2F404.jsp ...

hadoop长时间运行后,stop-all&period;sh报错

报错现象: hadoop在stop-all.sh的时候依据的是datanode上的mapred和dfs进程号. 而默认的进程号保存在/tmp下,linux默认会每 隔一段时间(一般是一个月或者7天左右 ...

Android 长时间运行任务说明

android 4.0 后,小米手机需要授权 自动启动 (在安全中心权限里设置),不然AlarmManager设置系统闹钟将不起作用

随机推荐

UDK&colon;AdventureKit 攀爬系统

[目标] AdventureKit攀爬系统 [思路] [步骤] 1 拷贝 2 设置config,UDKGame\Config\DefaultEngine.ini 添加包 [UnrealEd.Edito ...

selenium&plus;python自动化之环境安装

一.Python安装 1.操作系统:win7 64位系统 2.下载Python安装包,选择2.7版本和3.6版本都可以(最好安装2.7版本稳定)官网下载地址:https://www.python.or ...

zsh 简单介绍

什么是 zsh,要想解释好这个问题,那么得先说明什么是 shell.不负责任的解释说法就是 shell 就是一个壳.这个壳可不是蜗牛的壳,而是计算机的一个壳,当然也不是计算机的外壳啦,这个壳是相对于计 ...

html5 01 随记

一  HTML 是一种制作网站的标记语言 二.HTML基本语法 HTML 标签 html标签是html中的最基本单位 也是最重要的部分 通常使用尖角号 开始"

mongDb安装

1.下载安装包:https://www.mongodb.com/download-center#community 2.tar -xzvf mongodb-linux-x86_64-rhel70-3. ...

线程误区-join,wait(里边还是调用的wait)

1.一个线程执行结束后会执行该线程自身对象的notifyAll方法,这个是在jvm中实现的. 2.join的作用是:当我们调用某个线程的这个方法时,这个方法会挂起调用线程,直到被调用线程(thread ...

Django知识补充

目录 一.文件上传 二.Models补充 三.Django总结 一.文件上传 1.通过form表单或者通过From类上传 views.py from django.shortcuts import r ...

echarts3地图如何添加点击事件? 点击地图相应的区域ajax获取并展示本区域省下面所有市的信息

myChart.on('click', function (params) { var city = params.name; loadChart(city); });

2&period;选择元素 - 自定义过滤器《jquery实战》

2.5.6 自定义过滤器 jQuery 中有两种方法创建自定义的过滤器.第一种比较简单,但是不鼓励,从 jQuery 1.8 开始已经被第二种方法取代.记住,使用新方法时,你自定义的过滤器在 jQue ...

Linux内核SPI支持概述

1. 什么是SPI? Serial Peripheral Interface是一种同步4线串口链路,用于连接传感器.内存和外设到微控制器.他是一种简单的事实标准,还不足以复杂到需要一份正式的规范.SP ...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值