oracle查询过程中卡住,查看Oracle中存储过程长时间被卡住的原因
1:查V$DB_OBJECT_CACHE
SELECT * FROM V$DB_OBJECT_CACHE WHERE name=‘CUX_OE_ORDER_RPT_PKG‘ AND LOCKS!=‘0‘;
注意:CUX_OE_ORDER_RPT_PKG 为存储过程的名称。
发现locks=2
2:按对象查出sid的值
select /*+ rule*/ SID from V$ACCESS WHERE object=‘CUX_OE_ORDER_RPT_PKG‘;
注意:CUX_OE_ORDER_RPT_PKG 为存储过程的名称。
3:查sid,serial#
SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID=‘刚才查到的SID‘;
4、根据会话id(sid),此会话的等待事件:
select * from v$session where sid=***;
event字段即为等待事件。查询后我们发现这个会话等待事件为SQL*Net message from dblink;在查看会话的logon_time为两天前。这个时间远超过我们估计时间。
5、根据会话id查看此会话正在执行的sql语句
select sql_text from v$sqlarea where address= (select sql_address from v$session where sid=***);
查询后发现正在执行的sql语句为通过dblink到远程数据库上A表查询数据,插入到B表。
6、连接远程数据库,查询当前被锁的对象
select * from v$locked_object lo ,
all_objects ao where lo.OBJECT_ID= ao.object_id ;
查看后发现远程数据库中并没有涉及到A、B表被锁
7、查看远程数据的会话:
select * from v$session where terminal like ‘%机器名%‘ and program=‘Oracle.exe‘
使用dblink连接远程数据库,在远程数据库上的会话的program应该是是oracle.exe
查询后发现,两个远程库有时候根本没有相关会话,有时候可能有相关会话,但其等待事件是 SQL*Net message from client 远程库在等待本地Oracle给他发请求。
本地库等dblink远程库,远程库等待client消息。看来这个存储过程是不可能执行完了。
具体什么原因造成了,还不清楚。
这里给出的处理方法就是杀死会话
具体步骤可参考上面的文章
一些项目中使用了job定期执行sql语句。如果要执行的sql语句是基于dblink对远程数据库的访问,那么有时候就会出现该sql语句长时间执行一直不结束的情况。并且这时在远程数据库上并没有锁导致该sql语句等待(这可能是由于网络问题触发的oracle的一个bug吧,远程数据库与本地数据之间有防火墙时比较容易出现这个现象)。
下面总结了如何判断该job是否长时间执行没结束,并说明了处理步骤。
1)、观察job情况。
system用户下执行语句select * from dba_jobs;找到有问题的job,记录下该job在查询结果中job列的取值,该取值称为job号。
broken字段为N,且this_date字段的时间比当前时间减去执行周期要晚(根据interval字段判断),则job是正常的。如果this_date字段没有值,一般认为job当前没有在执行。
如果broken字段N,并且this_date时间不对(例如是几个小时以前,甚至几天以前),则说明该job某一次周期一直没有执行完。
如果出现这种现象,就说明该job可能出问题了。
2)、查找该job目前正在执行时的会话编号sid
select * from dba_jobs_running where job=‘刚才查到的job号‘;
在返回结果中记录sid列的取值
3)、查看该会话
select * from v$session where sid=‘刚才查到的sid‘
记录下返回结果的 serial#列(会话序列号),paddr列(线程地址)
4)、 取得会话的线程号
select spid from v$process where addr=‘刚才查到的线程地址‘ ;
记录下列spid,称为线程号
5)、使用oracle命令杀会话
alter system kill session ‘会话编号sid,会话序列号serial#‘;
6)、查看是否成功杀掉该会话(方法与步骤一相同,多执行几次select * from dba_jobs;观察结果)
7)、如果没有杀掉会话,就是用操作系统命令杀线程(或进程)
这里给出windows下杀oracle会话占用的线程的方法
登录到数据库所在的操作系统中,打开windows命令行,键入命令: orakill 数据库sid 刚才查到的线程号spid
例如 orakill orcl 12345
这里给出一个自动清理问题job的存储过程,由于是存储过程,只能使用alter system kill 来杀会话,有时候会话只被标记为killed,并不能真正结束,job也无法启动下一个周期。
CREATE OR REPLACE PROCEDURE SYS.PRO_KILL_JOB AS
/*清理job567 568 569 长期执行不结束的情况*/
/*30分钟超时*/
CURSOR MYCUR IS
select ‘ ALTER SYSTEM KILL SESSION ‘‘‘||s.sid ||‘,‘|| s.SERIAL#||‘‘‘ immediate ‘ AS SQL_KILL , J.JOB
from dba_jobs_running j,v$session s
where j.sid=s.sid and
this_date
s.sid is not null and s.serial# is not null
and
( j.job= 567
or j.job=568
or j.job=569 ) ;
V_SQL_KILL VARCHAR2(500);
V_JOB NUMBER ;
BEGIN
OPEN MYCUR;
LOOP
FETCH MYCUR
INTO V_SQL_KILL , V_JOB;
EXIT WHEN MYCUR%NOTFOUND;
dbms_output.put_line(v_sql_kill);
execute immediate v_sql_kill ;
COMMUNICATION.SP_DB_LOG(‘PRO_KILL_JOB‘, 1, NULL, V_JOB||‘ IS KILLED‘);
COMMIT;
END LOOP;
CLOSE MYCUR;
EXCEPTION
WHEN OTHERS THEN
COMMUNICATION.SP_DB_LOG(‘PRO_KILL_JOB‘, 1, SQLCODE, SQLERRM);
COMMIT;
END PRO_KILL_JOB;
原文:https://www.cnblogs.com/xiaojianblogs/p/10228690.html
oracle查询过程中卡住,查看Oracle中存储过程长时间被卡住的原因相关推荐
- oracle 查询表里信息_查看ORACLE 数据库及表信息
-- 查看ORACLE 数据库中本用户下的所有表SELECT table_name FROM user_tables; -- 查看ORACLE 数据库中所有用户下的所有表select user,tab ...
- 查看Oracle中存储过程长时间被卡住的原因
1:查V$DB_OBJECT_CACHE SELECT * FROM V$DB_OBJECT_CACHE WHERE name='CUX_OE_ORDER_RPT_PKG' AND LOCKS!='0 ...
- oracle查看所有报表,Oracle Report Viewer 以及怎么查看Oracle 报表
Oracle Report Viewer 以及如何查看Oracle 报表 Oracle Report Viewer 以及如何查看Oracle 报表 今天领导提出了个问题,如何查看Oracle 报表输出 ...
- pythontime模块计算时长_用python的time模块查看你出生多长时间了
time模块的应用查看出生了多长时间 查看银行卡解封时间 1.查看出生了多长时间 这里我们使用time模块计算我们出生了多长时间 import time # 导入时间模块 b = input('你的出 ...
- oracle找到表的位置,查看Oracle表中的指定记录在数据文件中的位置
查看Oracle表中的指定记录位置 select rowid,user_id from sshr.xx_user where user_id=3010586 select rowid, dbms_ro ...
- 查看oracle中path,查看oracle进程启动时的环境变量
当我们使用sqlplus本地登录oracle数据库时,设置的环境变量ORACLE_HOME和oracle启动时的环境变量ORACLE_HOME不一致时,会出现连接报错. 那么有什么办法可以看到orac ...
- mysql oracle查询速度慢_oracle查看执行最慢与查询次数最多的sql语句
前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致.如果执行频 ...
- 查询oracle表空间是否满了,查看Oracle表空间大小的方法
Oracle表空间大小的查看方法应该是我们都需要掌握的知识,下面就为您详细介绍查看Oracle表空间大小的方法,供您参考学习. 在数据库管理中,磁盘空间不足是DBA都会遇到的问题,问题比较常见. -- ...
- Oracle查询字段以外的内容,Oracle查询字段内容为非数字的记录
今天在一张3W多记录的表里查非数字的异常数据~数据库太水,记录一发,因为2.5使用人员误输入为2..5.... select t.routecardlist_id,trim(translate(RTR ...
最新文章
- 近世代数--极大理想--I是R的极大理想↔R/I是域
- 机器学习的训练数据(Training Dataset)、测试数据(Testing Dataset)和验证数据(Validation Dataset)
- 华为交换机实操系列(资源)
- Maven中的pom.properties文件
- 文件创建失败 无法继续下载_单机梦幻西游手游下载-单机版梦幻西游手机下载...
- 中兴新支点操作系统上如何查找文件
- 舞蹈课(dance.cpp/c/pas)
- 怎样更改网站服务器的ip地址,如何更改您的服务器IP地址
- 知我者,谓我心忧,不知我者,谓我何求
- 【UCOSii源码解析】事件控制块
- 云南马铃薯种薯质量追溯系统
- Python-Django毕业设计交通违章举报平台(程序+Lw)
- Celery (1)- 安装配置及使用
- python中ipo模式是什么意思呢_Python 之 简单的IPO模式
- 如何学好iphone游戏开发
- 构建之法 20162316刘诚昊
- Google官方推荐 Flow 取代 LiveData
- 二,八,十六进制数转换为十进制数
- 远程无法连接到oracle数据库服务器,无法连接到远程Oracle数据库(11g)
- JavaScript高级教程-代理与反射
热门文章
- rs多个设备同时传输_华为账号真的能同时登陆多个设备吗?华为官方的介绍来了...
- nodejs安装最新版 只需两部
- 全国计算机等级考试四级软件测试工程师,计算机等级考试四级软件测试工程师过关总结...
- nodejs 菜鸟教程,nodejs个人博客
- 面试中被问上家公司情况,应该如实说吗?
- python银行排队系统_在Python中排队
- PAT甲级1035 Password
- 河北专接本微机原理知识点02
- 5-5 奥运排行榜 (25分)
- Activiti6 查询由某人发起的流程请求