在今晚的客户现场遭遇了另外一个客户的数据库紧急宕机,处理完毕后这边编译存储过程遭遇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 BODYSQL> 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