Oracle存储过程INVALID,重新编译很慢解决方案

1、查询对象表 db_object_cache ,name为对象名(表名/方法名/过程名)

--检查对象是否被锁
select * from v$db_object_cache where name=upper('proc_wip_al_tran_inf_half_back')  and locks!=0;

发现有5个lock

img

2、查询被锁对象的SID

先设置数据库session _optimizer_cartesian_enabled 为 false,解决后再开启
这一步查询 v\(access 可能会卡住 解决方案: 查询视图v\)access很慢: https://blog.csdn.net/weiwangsisoftstone/article/details/39154873

--得到被锁对象的SID等信息
select * from v$access where object=upper('proc_wip_al_tran_inf_half_back');
-- 设置session _optimizer_cartesian_enabled 为 false
alter session set "_optimizer_cartesian_enabled"=false;

img

3、通过 SID 查到 SERIAL# 等详细信息

--通过SID查询到 SERIAL# ,此处用子查询会很慢,直接写查询结果 比较快
select sid,serial#,paddr from v$session where sid in(
--select sid from v$access where owner='ALMES' and object=upper('proc_wip_al_tran_inf_half_back')
'404',
'3820',
'3830',
'2816'
); 

4、结束致使对象被锁的会话

--alter system kill session 'SID,SERIAL#' immediate;  --杀掉会话
alter system kill session '404,  2050' immediate;
alter system kill session '2816,29326' immediate;
alter system kill session '3820,16795' immediate;
alter system kill session '3830,24513' immediate;

参考文档:

1、Oracle存储过程编译卡死的解决方法

2、如何检测被锁住的Oracle存储过程及处理办法汇总

posted @ 2021-06-05 22:12  Journey&Flower  阅读(1020)  评论(0)    收藏  举报