重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

标题: 更新数据字典 [打印本页]

作者: Inkcup    时间: 前天 19:01
标题: 更新数据字典
在 Oracle 19c 中,更新数据字典(Data Dictionary)通常是指修复由于升级、补丁安装不完全或元数据损坏导致的核心对象(如 DBMS_STATS)定义不一致的问题。

1. 自动化修复:使用 datapatch (首选)

在 12c 和 19c 中,这是更新数据字典的最标准方法。它会自动运行补丁脚本来同步 SQL 层的定义。

操作步骤:

    -1 以 oracle 用户登录操作系统。

    -2 确保数据库实例和监听器已启动。

    -3 执行命令:
cd $ORACLE_HOME/OPatch
./datapatch -verbose

    -4 观察输出: 如果它显示 Applying... 并在最后提示 SUCCESS,那么你的 DBMS_STATS 等包缺失的问题通常会自动解决。

2. 核心组件修复:重新运行 catproc

如果 datapatch 无法解决,或者由于升级中断导致数据字典损坏,需要手动运行核心目录脚本。这会重新定义所有的系统包(Package Spec 和 Body)。

注意:此操作需要停机维护(建议在 Restricted 模式下执行)。

操作步骤:

-- 以 SYSDBA 身份登录
sqlplus / as sysdba

-- 1. 开启受限模式,防止其他用户干扰
ALTER SYSTEM ENABLE RESTRICTED SESSION;

-- 2. 运行核心过程定义脚本 (耗时较长,通常 20-40 分钟)
@?/rdbms/admin/catproc.sql

-- 3. 运行目录定义脚本 (可选,但建议一同运行)
@?/rdbms/admin/catalog.sql

-- 4. 重新编译所有失效对象
@?/rdbms/admin/utlrp.sql

-- 5. 关闭受限模式
ALTER SYSTEM DISABLE RESTRICTED SESSION;

3. 针对性修复:只重新加载 DBMS_STATS 相关组件

如果你不想动整个数据字典,可以尝试只重新加载报错最严重的统计信息组件。这通常能解决 PLS-00302 缺失组件的问题。

操作步骤:

sqlplus / as sysdba

-- 重新加载 DBMS_STATS 的定义和主体
@?/rdbms/admin/dbmsstat.sql
@?/rdbms/admin/prvtstat.plb

-- 重新加载统计顾问相关组件
@?/rdbms/admin/dbmsstadv.sql
@?/rdbms/admin/prvtstadv.plb

-- 再次尝试编译
EXEC utl_recomp.recomp_parallel(4);

==================================
关键检查:更新后验证

完成上述任何一种更新后,请务必运行以下 SQL 确认你的 DBMS_STATS 是否已经“进化”到了 19c 版本:

-- 检查之前报错的存储过程是否已经出现在包定义中
SELECT procedure_name
FROM dba_procedures
WHERE object_name = 'DBMS_STATS'
AND procedure_name = 'INIT_ADVISOR_TASK';


如果有结果: 说明数据字典更新成功。

如果依然没结果: 说明你的 $ORACLE_HOME/rdbms/admin 下的脚本文件本身版本就不对,或者 ORACLE_HOME 环境变量指向了错误的路径。

========
特别提醒

在执行方案 1 或 2 之前,强烈建议先进行全库备份或控制文件备份。因为数据字典是数据库的心脏,操作不当会导致数据库无法启动。






欢迎光临 重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2