请教大家一个问题,我的一个包编译、编辑、删除、调试和访问都报ora-04021:timeout occurred while waiting to lock object……
然后用
select a.*,b.*
  FROM V$ACCESS A, V$SESSION B
 WHERE A.SID = B.SID
   and a.OBJECT = 'DAMS_WEBCONTEN_MANAGE'
   and a.TYPE = 'PACKAGE';
查处锁定的id,
然后想杀掉锁,运行
alter system kill session……
这时就报ORA-00031: session ed for kill
好像没有杀掉,只是标记了,几天都是这样,包一直不能被编译、编辑、删除、调试和访问。
不知道怎么才能编辑这个包了?

解决方案 »

  1.   

    说明数据库pmon没有清理你的问题进程,可能是bug。简单的方法是重启数据库。
      

  2.   

    应该是还有资源没释放。
    不想重启的话就用oracle的工具orakill来结束这个进程。
    在命令行窗口中输入orakill可以看到具体步骤
      

  3.   

    其实在Oracle中kill session以后, Oracle只是简单的把相关session的paddr 指向同一个虚拟地址.
    此时v$process和v$session失去关联,进程就此中断.
    然后Oracle就等待PMON去清除这些Session.所以通常等待一个被标记为Killed的Session退出需要花费很长的时间.所以通过select p.addr from v$process p where pid <> 1   minus  select s.paddr from v$session s;
    获得了kill的进程地址,然后在v$process中找到对应spid,然后可以使用Kill或者orakill在系统级来杀掉这些进程.
      

  4.   

    1.从dba_tables中查出表
    2.SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID'; 
    3.在SQLPLUS的命令窗口执行:
    alter system kill session 'sid,SERIAL#';
    若出现ora-00031错误,则在后面加immediate;alter system kill session '29,5497' immediate; 再执行后面的操作,若不出现ora-00031错误则操作到此结束。4.SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';
    5.telnet 到小机上执行下列命令:
    ps -ef|grep os_process_id
    kill -9 os_process_id
    ps -ef|grep os_process_id
    注:os_process_id是上面查到的SPID
      

  5.   

    问题在重启数据库后可以解决,但是过一段时间就又出现了。
    包里面只有select 表的 操作。应该不会是其它程序锁定表造成的。
      

  6.   

    不是已经有语句可以查询谁把那个包给锁定了吗?
    如果是这样,就可以借用oem工具,了解具体的对象是谁呢?,进而再跟踪处理。