EBS 业务中会偶尔出现锁表或者锁包的问题,前几天在一个包里改了程序,但死活编译不了。
一开始以为有程序在调用着,结果等了一天也还没好,确认被锁只能强制处理。
下面记录一下处理过程。
程序包被锁:
程序包被锁相对容易解决,一般程序执行时间不会太长,除非包里有比较复杂的报表在执行。
SQL:
SELECT 'alter system kill session ' || '''' || sid || ',' || serial# || '''immediate;' 解锁语句,
a.*,
ss.*
FROM dba_ddl_locks a, v$session SS
WHERE a.name LIKE '%CUX_AP_CE_PAYMENT_PKG%' --程序包名称
AND a.session_id = ss.sid;
用上面SQL语句,修改程序包的名称,注意一定要记得大写,不然查不出来!
确认以后,可以把解锁语句里面的内容复制出来,直接执行,杀掉!
解锁:
表被锁:
表数据被锁就是比较麻烦了,需要根据几次查询才能找到相应的单号。目前我一般都是按照时间来进行确定。
至于怎么查出具体单号,由于锁表的问题遇到次数不多,大部分也只有一两条数据被锁,具体如何操作已经忘记。下次遇到再补上。
select l.session_id sid,
s.serial#,
l.locked_mode,
l.oracle_username,
l.os_user_name,
s.machine,
s.terminal,
o.object_name,
s.logon_time,
'ALTER system KILL session ''' || l.session_id || ',' || s.serial# ||
''';' 解锁语句
from v$locked_object l, all_objects o, v$session s
where l.object_id = o.object_id
and l.session_id = s.sid
AND o.object_name = 'OE_ORDER_LINES_ALL'
order by sid, s.serial#;
解锁: 复制解锁语句的内容进行执行。
关于被锁的原因,只能浅谈一下,了解不深: 1、数据正在操作 2、客户化程序的代码不够严谨 3、底层问题
如果有不足的地方,欢迎大佬过来补充一下。