编译存储过程卡死,编译不了

select_update_insert 数据库开发工程师  2017-11-17 09:44:51
定时JOB调用存储过程,每天定时执行一次,执行正常。存储过程需要修改,编译的时候卡死,并且里面的子过程也都编译不了。job删除了,过程还是编译不了,也查不到锁表信息!报错信息如下:。有人遇到过这种情况吗,交流交流,出个主意啊!
...全文
956 11 点赞 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
panjun198242 2017-11-21
先把会话进程杀掉
  • 打赏
  • 举报
回复
minsic78 2017-11-20
引用 8 楼 minsic78 的回复:
会话不存在,那么可能进程还在,通过v$session.paddr连接v$process.addr,找到spid,也就是操作系统进程号,杀之。 运气不好可能会找不到对应的进程,这种情况就比较棘手了……
说梦话了,SID都不在,还让你找SPID 这种情况下已经比较麻烦了,估计之前已经kill过会话了,那么找一下v$process中存在,而在v$session中找不到对应会话的进程吧,minus一下(v$process.addr minus v$session.paddr,嵌套一层,查得进程情况),看看得到的进程能否判断可杀不可杀——因为这种情况下可能会返回比较多的进程,杀错了就不好玩了。
  • 打赏
  • 举报
回复
minsic78 2017-11-20
会话不存在,那么可能进程还在,通过v$session.paddr连接v$process.addr,找到spid,也就是操作系统进程号,杀之。 运气不好可能会找不到对应的进程,这种情况就比较棘手了……
  • 打赏
  • 举报
回复
引用 6 楼 minsic78 的回复:
[quote=引用 5 楼 wanling_nanjing 的回复:] [quote=引用 4 楼 minsic78 的回复:] [quote=引用 2 楼 wanling_nanjing 的回复:] [quote=引用 1 楼 qq646748739 的回复:] 你这种情况是死锁导致的。 解决方法如下:

--1.根据存储过程名称(大写)查询死锁的会话id
select sid,serial# 
  from v$session 
 where sid = (select session_id from dba_ddl_locks where name='存储过程名称');
 
--2.kill掉会话
alter system kill session 'sid,serial#';
之前就查过,没有查到相关锁信息[/quote] 先登录一个会话修改过程,让它卡死,再用其他会话来查试试,另外,卡死的时候还可以查下卡死会话在v$session中的event字段,应该是library cache lock之类的等待。 BTW:这个不是死锁,死锁一般说的是会报出ORA-60的锁等待,当然低级点的非队列锁极少情况下因为BUG陷入相互等待的死循环也是类似的,区别是:这种情况下不会报错退出,基本无解,而高级队列锁的死锁Oracle是会自动检测并处理的,也就是牺牲一个会话报出ORA-60错误。[/quote] 那这种情况有什么解决方法吗?[/quote] 你找到占用这个library cache lock的会话啊,卡死的情况下,查该开始会话在v$session中对应的行,其中有几列:blocking_instance,blocking_session,指明了阻塞者对应的实例和SID,你再看看这个会话在干嘛,是不是能够被kill掉,通常90%以上可能这个会话就是你自己早先修改该存储过程搞出来的死会话,杀掉即可。[/quote] 按照你的方法找到了blocking_session,找到这个会话之后kill的时候,报会话不存在
  • 打赏
  • 举报
回复
minsic78 2017-11-20
引用 5 楼 wanling_nanjing 的回复:
[quote=引用 4 楼 minsic78 的回复:] [quote=引用 2 楼 wanling_nanjing 的回复:] [quote=引用 1 楼 qq646748739 的回复:] 你这种情况是死锁导致的。 解决方法如下:

--1.根据存储过程名称(大写)查询死锁的会话id
select sid,serial# 
  from v$session 
 where sid = (select session_id from dba_ddl_locks where name='存储过程名称');
 
--2.kill掉会话
alter system kill session 'sid,serial#';
之前就查过,没有查到相关锁信息[/quote] 先登录一个会话修改过程,让它卡死,再用其他会话来查试试,另外,卡死的时候还可以查下卡死会话在v$session中的event字段,应该是library cache lock之类的等待。 BTW:这个不是死锁,死锁一般说的是会报出ORA-60的锁等待,当然低级点的非队列锁极少情况下因为BUG陷入相互等待的死循环也是类似的,区别是:这种情况下不会报错退出,基本无解,而高级队列锁的死锁Oracle是会自动检测并处理的,也就是牺牲一个会话报出ORA-60错误。[/quote] 那这种情况有什么解决方法吗?[/quote] 你找到占用这个library cache lock的会话啊,卡死的情况下,查该开始会话在v$session中对应的行,其中有几列:blocking_instance,blocking_session,指明了阻塞者对应的实例和SID,你再看看这个会话在干嘛,是不是能够被kill掉,通常90%以上可能这个会话就是你自己早先修改该存储过程搞出来的死会话,杀掉即可。
  • 打赏
  • 举报
回复
引用 4 楼 minsic78 的回复:
[quote=引用 2 楼 wanling_nanjing 的回复:] [quote=引用 1 楼 qq646748739 的回复:] 你这种情况是死锁导致的。 解决方法如下:

--1.根据存储过程名称(大写)查询死锁的会话id
select sid,serial# 
  from v$session 
 where sid = (select session_id from dba_ddl_locks where name='存储过程名称');
 
--2.kill掉会话
alter system kill session 'sid,serial#';
之前就查过,没有查到相关锁信息[/quote] 先登录一个会话修改过程,让它卡死,再用其他会话来查试试,另外,卡死的时候还可以查下卡死会话在v$session中的event字段,应该是library cache lock之类的等待。 BTW:这个不是死锁,死锁一般说的是会报出ORA-60的锁等待,当然低级点的非队列锁极少情况下因为BUG陷入相互等待的死循环也是类似的,区别是:这种情况下不会报错退出,基本无解,而高级队列锁的死锁Oracle是会自动检测并处理的,也就是牺牲一个会话报出ORA-60错误。[/quote] 那这种情况有什么解决方法吗?
  • 打赏
  • 举报
回复
minsic78 2017-11-20
引用 2 楼 wanling_nanjing 的回复:
[quote=引用 1 楼 qq646748739 的回复:] 你这种情况是死锁导致的。 解决方法如下:

--1.根据存储过程名称(大写)查询死锁的会话id
select sid,serial# 
  from v$session 
 where sid = (select session_id from dba_ddl_locks where name='存储过程名称');
 
--2.kill掉会话
alter system kill session 'sid,serial#';
之前就查过,没有查到相关锁信息[/quote] 先登录一个会话修改过程,让它卡死,再用其他会话来查试试,另外,卡死的时候还可以查下卡死会话在v$session中的event字段,应该是library cache lock之类的等待。 BTW:这个不是死锁,死锁一般说的是会报出ORA-60的锁等待,当然低级点的非队列锁极少情况下因为BUG陷入相互等待的死循环也是类似的,区别是:这种情况下不会报错退出,基本无解,而高级队列锁的死锁Oracle是会自动检测并处理的,也就是牺牲一个会话报出ORA-60错误。
  • 打赏
  • 举报
回复
哪位大神给解释下呢?
  • 打赏
  • 举报
回复
引用 1 楼 qq646748739 的回复:
你这种情况是死锁导致的。 解决方法如下:

--1.根据存储过程名称(大写)查询死锁的会话id
select sid,serial# 
  from v$session 
 where sid = (select session_id from dba_ddl_locks where name='存储过程名称');
 
--2.kill掉会话
alter system kill session 'sid,serial#';
之前就查过,没有查到相关锁信息
  • 打赏
  • 举报
回复
碧水幽幽泉 2017-11-17
你这种情况是死锁导致的。 解决方法如下:

--1.根据存储过程名称(大写)查询死锁的会话id
select sid,serial# 
  from v$session 
 where sid = (select session_id from dba_ddl_locks where name='存储过程名称');
 
--2.kill掉会话
alter system kill session 'sid,serial#';
  • 打赏
  • 举报
回复
相关推荐
发帖
Oracle
加入

1.6w+

社区成员

Oracle开发相关技术讨论
申请成为版主
帖子事件
创建了帖子
2017-11-17 09:44
社区公告
暂无公告