问题提出:
有一个后台自动执行的存储过程,由于它每天晚上要操作至少几百条数据,每条数据执行时要涉及到四五个表,按理来说应该还是蛮快的,可是我执行后,有时候能成功执行,有时候只能执行一半或一部分就一直显示执行状态。我的存储过程是执行一条就commit一条的,所以我可以看出它执行了多少内容。
比如我有217条数据需要执行,可是执行到100条的时候就不执行了,存储过程执行就一直执行不下去,而此时修改调试存储过程都无反应,想停止执行也不行。
请大家发表发表意见,看看有啥问题,另外该如何停止该存储过程的执行?问题分析:
尝试用杀掉该会话的方式使该存储过程释放出来。
SELECT /*+ rule */ s.username, decode(l.type,'TM','TABLE LOCK', 'TX','ROW LOCK', NULL) LOCK_LEVEL, o.owner,o.object_name,o.object_type, s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser FROM v$session s,v$lock l,dba_objects o WHERE l.sid = s.sid AND l.id1 = o.object_id(+) AND s.username is NOT NULL
可以查找被锁定的进程
或者简单的利用select sid,serial# from v$session where username='WZDBA'来查询出相应的进程。
再利用alter system kill session '44,956'来杀进程。杀完后,进程显示killed,但是存储编译,删除依然无反应。
有一个后台自动执行的存储过程,由于它每天晚上要操作至少几百条数据,每条数据执行时要涉及到四五个表,按理来说应该还是蛮快的,可是我执行后,有时候能成功执行,有时候只能执行一半或一部分就一直显示执行状态。我的存储过程是执行一条就commit一条的,所以我可以看出它执行了多少内容。
比如我有217条数据需要执行,可是执行到100条的时候就不执行了,存储过程执行就一直执行不下去,而此时修改调试存储过程都无反应,想停止执行也不行。
请大家发表发表意见,看看有啥问题,另外该如何停止该存储过程的执行?问题分析:
尝试用杀掉该会话的方式使该存储过程释放出来。
SELECT /*+ rule */ s.username, decode(l.type,'TM','TABLE LOCK', 'TX','ROW LOCK', NULL) LOCK_LEVEL, o.owner,o.object_name,o.object_type, s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser FROM v$session s,v$lock l,dba_objects o WHERE l.sid = s.sid AND l.id1 = o.object_id(+) AND s.username is NOT NULL
可以查找被锁定的进程
或者简单的利用select sid,serial# from v$session where username='WZDBA'来查询出相应的进程。
再利用alter system kill session '44,956'来杀进程。杀完后,进程显示killed,但是存储编译,删除依然无反应。
解决方案 »
- expdp導出表
- oracle异机恢复
- 求教ora92效率优化问题
- pl/sql存储过程请教
- Help! How to get the ratio of M to F
- oracle存储过程编译不了了,怎样处理?
- 请问 ORACLE Form Builder 怎么连接 SQL-SERVER 数据库! 急
- execute immediate 和事务的问题
- 连接ORACLE错误!!表空间无法扩展!!--急! 在线等待!!
- SQL竟然不起作用?Update table1 set(f1,f2)=(select ff1,ff2 from where.....)
- WINDOWS下打了震荡波补丁后,ORACLE的服务不能自动启动,只能在DOS下手动启动
- 项目经理招聘中in shanghai
1.无反应的时候,查询v$session_wait得到无反应的原因
2.死锁的时候如果杀session,oracle释放资源的速度比杀server process慢
我基本能够判断是你的存储过程进入了死循环(比如用到游标,退出游标的条件限定不好);也有可能代码产生死锁
对于死锁,可能你查找到一个锁,再利用alter system kill session '44,956'来杀进程,但是杀掉后,你的代码可能马上又产生一个锁。 至于为什么有时候会成功,这个与表中的数据应该有关系,也就是说,如果你数据库中的某些表具有某些数据,那么你的procedure就会有问题
2、要想快有个馊主意,可以在session中查找出操作系统级的进程ID然后kill掉(强烈建议不要这么做)
你可以从 v$session_wait中 查找EVENT , WAIT_TIME , SECONDS_IN_WAIT, STATE
从 v$session_cursor_cache 再看看游标的问题最后再决定哪些SESSION是要杀死的,这些SESSION为什么这么讨厌呢