Skip to content

重新编译存储过程中遭遇ORA-04021

在今晚的客户现场遭遇了另外一个客户的数据库紧急宕机,处理完毕后这边编译存储过程遭遇ORA-04021,这个错误在编译存储过程的时候比较常遇见,通常这类错误的出现是由于锁的问题导致,一开始运行UTLRP.sql修复整个库的invalid objects,但是修复完后发现还存在1个package body为invalid,
逐用alter方式修复,具体如下:

SQL> @?/rdbms/admin/utlrp.sql

PL/SQL procedure successfully completed.

Table created.

Table created.

Table created.

Index created.

Table created.

Table created.

View created.

View created.

Package created.

No errors.

Package body created.

No errors.

PL/SQL procedure successfully completed.

PL/SQL procedure successfully completed.

SQL> select owner,object_name,object_type from dba_objects where status=’INVALID’ order by owner;

OWNER OBJECT_NAME OBJECT_TYPE
—————————— —————————————- ——————
SYS DBMS_AQ PACKAGE BODY

SQL> alter package DBMS_AQ compile;
alter package DBMS_AQ compile
*
ERROR at line 1:
ORA-04021: timeout occurred while waiting to lock object SYS.DBMS_AQ

遇见这个问题基本上判断是由锁造成,而查锁时候并未发现由锁引起的等待,倒是发现了锁未释放的情况,重启数据库后,再次查询,此对象为valid的状态,由此可见是因为utlrp修复完之后,DBMS_AQ上的锁未释放,导致重新申请修复的时候引发04021