• oracle plsql 上对package 包执行重新编译时,超时无响应:(4021)time-out occurred while waiting to lock object


    问题处理过程:

    开发反应包存在问题, 我一看他们的用户没对应的权限,给赋予了以下权限:

    GRANT debug any procedure, debug connect session TO CMSOPR;
    GRANT EXECUTE any procedure TO CMSOPR; 

    开发进行调试后没执行结果。

    于是我想重新编译,先重新编译的包,半天报个响应超时,当时也没想太多,以为有死锁,于是查数据库锁 -没锁。

    查数据库审计表:

    select * from dba_audit_trail where timestamp>to_date('2019/7/16 00:00:00','yyyy/mm/dd hh24:mi:ss') and obj_name='CMSVOUCHER';  

    根据查询结果发现:某开发在我赋权之后对包进行了重编译,且没有成功(没有编译权限)-error:3135。咨询得知:该开发在编译时plsql未反应便强制关掉了plsql。

    同时查出了我编译后操作的返回错误号为error:4021 time-out occurred while waiting to lock object

    结合知识点:

    (1)存储过程编译没完成,或者编译失败时,oracle 数据库会自动把相应的存储过程锁起来;

    (2)DBA_DDL_LOCKS视图中记录存储过程、表结构、视图、包等数据库对象锁的信息;

    (3)V$ACCESS视图显示数据库中当前锁定的对象及访问它们的会话 。

    查询锁定(运行中的)的包对应的SID号:
    SELECT * FROM V$ACCESS WHERE OBJECT='CMSVOUCHER';
    select * from dba_ddl_locks where name='CMSVOUCHER';
    根据SID号查出会话信息:
    select sid,serial# from v$session where sid in('78','209');
    kill掉:
    alter system kill session '78,4883';
    alter system kill session '209,57021';

    重新编译了包和包体--编译成功,包debug调试正常。问题到此解决。

    补充:如果以上还是没将问题解决,还有终极办法:

    根据sid号找到对应SQL的进程标识:
    
    SELECT PADDR FROM v$session  WHERE SID IN ('78','209');
    
    根据进程标识找到操作系统上对应的SPID:
    
    SELECT spid FROM V$process WHERE addr in('0000000225B578C8','0000000222BD6568')

    然后在操作系统上将进程kill即可。
  • 相关阅读:
    ubuntu下安装flash
    PHPMailer邮件发送
    PHP制作简单分页(从数据库读取记录)
    windows下安装PHP环境
    捕获浏览器关闭,刷新事件
    ubuntu下安装wps
    用PHP制作一个简单的验证码
    一个PHP程序员应该掌握的10项技能!
    爬虫框架之scrapy
    Android杂谈禁止TimePicker控件通过keyboard输入
  • 原文地址:https://www.cnblogs.com/wsn-only/p/11196444.html
Copyright © 2020-2023  润新知