上一篇
场景还原:
凌晨2点15分,值班手机突然狂震,客户的生产库在季度结算时突然罢工,日志里赫然躺着"ORA-09811: 无法初始化包"的红色警报,隔着屏幕都能感受到对方DBA的焦虑——报表系统瘫痪,财务部三十多号人干等着,这种时候,每一分钟都是真金白银。
ORA-09811本质上是个权限引发的"自闭症",当Oracle尝试初始化DBMS_SYSTEM
、DBMS_LOCK
这类核心包时,如果发现:
oracle
用户对$ORACLE_HOME/rdbms/admin
目录没读权限 sql.bsq
等基础脚本被误删 shared_pool_size
设置过小导致加载失败-- 立即创建现场快照 alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; select * from v$diag_alert_ext where message_text like '%ORA-09811%' and originating_timestamp > sysdate-1/24;
把结果截图发给客户确认,避免背锅。
通过远程桌面看到客户环境时,先查这三个地方:
目录权限:
ls -ld $ORACLE_HOME/rdbms/admin
正常应该显示drwxr-xr-x
,如果看到drwx------
就说明权限太窄。
关键文件:
ls -l $ORACLE_HOME/rdbms/admin/sql.bsq
文件大小应该在20MB左右,如果显示"No such file",那就找到安装介质补文件。
内存配置:
show parameter shared_pool_size
对于11g及以上版本,建议至少设置1GB(OLTP系统要更大)。
# 用oracle用户执行 cd $ORACLE_HOME/rdbms/admin chmod 755 . chown oracle:oinstall sql.bsq
然后让客户重启数据库,80%的情况到这里就搞定了。
手动重新编译包(需要停应用):
-- 用sysdba登录 @?/rdbms/admin/catproc.sql @?/rdbms/admin/utlrp.sql
这个过程大概10-30分钟,视数据库大小而定,有个客户曾经在编译时突然断电,结果...(此处省略2000字血泪史)
-- 创建监控脚本 begin dbms_scheduler.create_job( job_name => 'CHECK_PKG_STATUS', job_type => 'PLSQL_BLOCK', job_action => 'begin for x in (select object_name from dba_objects where status=''INVALID'' and owner=''SYS'') loop dbms_output.put_line(''无效对象: ''||x.object_name); end loop; end;', start_date => systimestamp, repeat_interval => 'FREQ=DAILY', enabled => true); end; /
catproc.sql
前务必备份SYSAUX
表空间 那天早上6点23分,监控大屏终于变绿,后来发现根本原因是客户前夜用root账户"帮忙清理"了Oracle目录...(摊手)在数据库的世界里,好心办坏事的故事每天都在上演。
本文基于2025年8月前Oracle 19c及21c版本实测整理,特殊环境可能需要调整方案。
本文由 说从蕾 于2025-08-08发表在【云服务器提供商】,文中图片由(说从蕾)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://cloud.7tqx.com/wenda/567491.html
发表评论