catalog.sql主要用于创建数据字典。在数据库运行过程中,如果数据字典发生损坏,可以重新执行catalog.sql来修复损坏的数据字典。但当共享池内存不足或者数据库组件混乱时执行catalog.sql容易出现问题。以下简要分析catalog.sql的执行过程,不同的数据库版本其执行顺序可能不同。
(1)Oracle首先判断是否是SYS用户执行catalog.sql。如下所示:
SELECT TO_NUMBER('MUST_BE_AS_SYSDBA') FROM DUAL
WHERE USER != 'SYS';
WHENEVER SQLERROR CONTINUE;
(2)创建Oracle STANDARD包,里面有Oracle内置函数的创建过程,如sqlerrm。如下所示:
rem Load PL/SQL Package STANDARD first, so views can depend upon it
@@standard
@@dbmsstdx
STANDARD包是创建和执行Oracle其他存储过程的前提。当STANDARD失效时,可能出现以下错误:
SQL> select COMP_NAME,VERSION,STATUS from dba_registry;
select COMP_NAME,VERSION,STATUS from dba_registry
*
ERROR at line 1:
ORA-00904: "DBMS_REGISTRY"."STATUS_NAME": invalid identifier
ORA-06553: PLS-213: package STANDARD not accessible
ORA-06553: PLS-213: package STANDARD not accessible
同时警告日志也出现如下错误信息:
Mon Jul 02 17:39:21 EDT 2012
Errors in file /oracle/app/admin/zhoul/bdump/zhoul_cjq0_6444.trc:
ORA-00604: error occurred at recursive SQL level 1
ORA-00904: "DBMS_LOGSTDBY"."DB_IS_LOGSTDBY": invalid identifier
ORA-06553: PLS-213: package STANDARD not accessible
(3)注册Oracle Database Catalog Views组件,如下所示:
Rem Load registry so catalog component can be defined
@@catcr
BEGIN
dbms_registry.loading('CATALOG', 'Oracle Database Catalog Views',
'dbms_registry_sys.validate_catalog');
END;
/
remark
remark FAMILY "FIXED (VIRTUAL) VIEWS"
remark
(4)创建一系列视图和同义词,如下所示:
create or replace view v_$map_library as select * from v$map_library;
create or replace public synonym v$map_library for v_$map_library;
grant select on v_$map_library to select_catalog_role;
…
BEGIN
dbms_registry.loaded('CATALOG');
END;
/
注意 当1号数据文件有坏块时,谨慎执行catalog.sql。




