实战:Oracle系统包无效问题如何重建?

科技   2024-09-20 08:01   中国  

本期由青学会著名专家王旭带来一篇投稿,内容来自一次真实的某医院案例。

欢迎关注青学会MOP技术社区公众号,学习更多实战技术!

想加入青学会实名社区的同学,关注公众号,回复“加入”即可获得加入方法。

本期作者简介

王旭,草根dba,熟悉和精通oracle数据库技术,擅长各种场景下故障恢复,如文件勒索病毒、触发器勒索病毒、rac 灾难恢复、asm元数据损坏恢复、bootstrap误删,基表误删无法开库情况下底层反向回退数据块开库;
公众号:数据库技术加油站(致力于将多年数据库技术传递给更多愿意学习和提高的DBA)座右铭:没有解决不了的技术,如果有,那就是你没掌握;

1.前言

很多时候,dba在遇到系统包损坏的情况下,不知道怎么修复,今天来聊一聊这个话题,系统包通常常用的有

DBMS_ALERT
DBMS_APPLICATION_INFO
DBMS_AQ
DBMS_DDL
DBMS_LOB
DBMS_LOCK
DBMS_LOGMNR
DBMS_ROWID
DBMS_SQL
...等等

当上面这类包遇到了损坏、如包或包体丢失,我们应该如何去处理?前天就遇到一个小伙伴某医院his服务器出现了该问题,导致停机几个小时,实在处理不了了,他想到一个办法,就是用备份去恢复,然后快速恢复业务。我当时就阻止了他这个想法,这个是逻辑错误,完全恢复到这个时间点依然还是有问题。如果做不完全恢复,肯定是要丢部分数据的。

2.故障现像

起初小伙伴在群里提问是否遇到了这个错误?

我问他具体报什么错?他说系统包编译不过去,业务都停了。

3.问题分析处理

由于当时处理问题紧急,没有及时截图。

远程连接到oracle服务器,执行了如下几个语句:

find /u01/app/oracle/product/19.0.0/db_1/rdbms/admin/* -name '*.plb'|xargs grep -i DBMS_ILM
find /u01/app/oracle/product/19.0.0/db_1/rdbms/admin/* -name '*.plb'|xargs grep -i PRVT_ILM

将包含创建的上面两个包体的原始文件找出来,服务器层面进入后,执行@上面查询出来的路径创建。创建完成后,还剩下一个PRVT_ILM的PACKAGE BODY无效,查看上面的命令发现报错原因是ORA-01775同义词循环链。

按照我之前的处理经验判断,如果拿原始的系统包创建还是没有完全恢复的话,说明这个包体可能要引用到其它对象,而那个对象不存在或者丢失导致了同义词循环链。

于是我又手工的执行了如下的操作:

Drop package PRVT_ILM;

@/u01/app/oracle/product/19.0.0/db_1/rdbms/admin/上面查询出来的路径.plb
@/u01/app/oracle/product/19.0.0/db_1/rdbms/admin/对应的.sql

--这里补充一点,一个业务包dbms开头的,在服务器admin目录下都有两部分文件来创建它,一部分是.plb的,一部分是.sql的。只要找到这两部分文件,手工拿出来重新执行即可恢复。

删除上面的包后,重新执行依然报同义词循环链,这时候我不纠结这个问题了,因为包是加密的,看不到引用的具体对象,还是回到业务本身,看是否能用。

然后我继续问他业务具体报什么错误?

前台业务抛出的异常:

继续分析,发现关键的核心过程,全部都是引用到如下对象触发的问题;

接着把上面的语句拿出来,单独用不同用户执行,都是报ora-01775错误;

第一个函数是产品函数,应该是没有问题;

第二个函数是数据库函数,怀疑;

第三个也是数据库函数,也怀疑;

测试…

通过查询dba_objects 找到了问题,COLLECT对象只有一个同义词,于是相同版本、其它环境拷贝过来执行,依然报错;

接着再次分析dba_synonym,发现同义词有问题,它指向了本身,sys下的collect指向了collect。我又对比了另外的环境,发现了问题后,删除该同义词重建问题就得到了处理。

drop public synonym COLLECT;
create public synonym COLLECT for sys.SYS_NT_COLLECT;
@?/rdbms/admin/utlrp.sql

重建完成后,之前的系统有个package body也随之得到了处理。再次手工去执行那个plb文件也是不再报同义词循环链问题,到这里问题就彻底得到了解决。

4.总结

通过此次事件的处理,dba在遇到关键问题的时候还是得回归到业务本身,而不是一直盯着数据库看什么无效对象,觉得应该是这个问题引起的。而是要具体问题具体分析,只有当证据证明是这个包引起的,我们才去分析和处理。


END

往期文章回顾

MOP社区新闻

  青学会MOP技术社区成立了!

  青学会专家顾问团成员介绍

DBA实战小技巧

  推荐一款超实用的openGauss数据库安装工具!

  实战:记一次RAC故障排查
  DBA实战运维小技巧存储篇(一)根目录满了如何处理
  DBA实战运维小技巧存储篇(二)打包迁移单机数据库至新存储

MOP社区投稿-内核开发

  浅谈 PostgreSQL GUC 模块原理

  简单解析 IvorySQL 增强 Oracle xml 兼容能力的原理

  简单讨论 PostgreSQL C语言拓展函数返回数据表的方式

  简单分析 pg_config 程序的作用与原理

MOP顾问说

   MOP顾问说:MOP 三种主流数据库常用 SQL(一)

  MOP顾问说:服务器内存

  MOP 顾问说:Linux Nice 值与 CPU 优先级揭秘


JiekeXu DBA之路
JiekeXu:Oracle ACE-Pro,获 Oracle OCP/OCM 及 MySQL OCP 认证,墨天轮 MVP,利用闲时间记录菜鸟 DBA 学习成长之路,所发布文字属于个人观点和学习笔记,如有错误及不当之处,敬请批评指正!
 最新文章