oracle – pl / sql dbms_scheduler挂起,如何进一步调试?

前端之家收集整理的这篇文章主要介绍了oracle – pl / sql dbms_scheduler挂起,如何进一步调试?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个由DBMS_SCHEDULER执行的PL / sql块.它是在上周的某个时候开始的,现在应该已经完成​​,但事实并非如此.我正在尝试确定问题,但需要一些关于如何继续调试此问题的建议.这是事实.

1)Oracle 11g

2)PL / sql代码输出到日志表,我可以得到问题所在的一般区域,这就是我发现挂起的方式.我无法得到一个关于卡在哪里的行号.我不知道怎么回事.

3)V $SESSION_LONGOPS表显示用户/架构仍在运行,但日期都是过去几天.从那时起它就没有动摇.

4)V $SESSION_LONGOPS中的OPNAME在“收集表索引统计”和“表扫描”之间分配一堆不同的表(第一个为8,第二个为8).他们看起来是一个广泛的表格.对于每一行,SOFAR和TOTAL值彼此相等. “Gather …”行全为零,而“Table Scan”行不为零但相等.

5)如果我对V $SESSION进行查询,我的工作是ACTIVE.

6)我正在处理的表上有一个锁,但我看不到我的架构中正在播放的其他会话.

7)cpu利用率非常低.

是否有可能更深入地查看正在执行的PL / sql块?我可以在V $sql中找到完整的sql,它向我展示了传入的原始块.我希望更深入地了解被编译的自定义过程(行号等).

关于锁,我可以看到分配给我的表的V $LOCKED_OBJECTS中的锁,是否有一个表将显示锁定的进程?我想找到死锁,如果有的话.

任何建议都非常感谢,

MJ

解决方法

如果不构建自己的检测,或启用调试或分析,则无法找到当前正在执行的行号.这似乎有点限制,但想象跟踪每个行号的性能影响.

大多数长时间运行的作业都在等待sql,而不是PL / sql. (如果那不是真的,你还有其他问题.)有很多方法可以跟踪sql语句. V $SESSION_LONGOPS可能很有用,但通常有更好的方法.如果有的话,最好的方法是使用Oracle Enterprise Manager.转到目标,然后转到Performance – >热门活动,您将看到过去一小时的系统活动和sql语句的图表.

例如(来自OEM Concepts指南):

如果您没有安装OEM,或者没有访问权限,则还有其他几种跟踪sql方法.首先,您要确定哪些是相关的sql语句.
这将告诉你现在正在运行什么,以及它运行了多长时间:

select elapsed_time/1000000 seconds,gv$sql.*
from gv$sql
where users_executing > 0
order by 1 desc;

如果你很幸运,它只需要很长时间的一个sql语句.如果有一系列小的sql语句,您可能需要排除where users_executing> 0谓词并找到与您的应用程序相关的最昂贵的语句.

通常,sql语句会很慢或停止,原因主要有三个:

>等待资源.检查从dba_resumable中选择*;也许您的查询占用了太多的临时表空间,并且正在等待DBA添加更多.要么也许你已经启用了并行排队,它正在等待更多的并行会话. (我不确定这是否会出现在DBA_RESUMABLE中.)>等待锁定.检查select * from gv $session其中final_blocking_session不为null;那里的任何行都可能有问题.你一般不想要跟踪对象级别的锁定.更容易找出阻止你的人而不是阻挡你的人.当一行或一个表被锁定时,你的session将等待事务,而不是行或对象.请注意,只有当两个会话以不同的顺序需要相同的资源时才会发生死锁如果发生这种情况会有错误信息.>等待sql执行.这显然是最困难的问题.现在该做什么没有简单的清单.通常我会先生成一个活动报告,显示计划以及每个步骤需要多长时间:从dual中选择dbms_sqltune.report_sql_monitor(sql_id =>’your sql id’,type =>’active’).该报告也适用于PL / sql块,但它只会显示每个sql占用的时间.然后由你决定如何让它运行得更好.

猜你在找的Oracle相关文章