本期由青学会著名专家王旭带来一篇投稿,内容来自一次真实的某医院案例。
欢迎关注青学会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在遇到关键问题的时候还是得回归到业务本身,而不是一直盯着数据库看什么无效对象,觉得应该是这个问题引起的。而是要具体问题具体分析,只有当证据证明是这个包引起的,我们才去分析和处理。
往期文章回顾
MOP社区新闻
DBA实战小技巧
实战:记一次RAC故障排查
DBA实战运维小技巧存储篇(一)根目录满了如何处理
DBA实战运维小技巧存储篇(二)打包迁移单机数据库至新存储
MOP社区投稿-内核开发
简单解析 IvorySQL 增强 Oracle xml 兼容能力的原理
简单讨论 PostgreSQL C语言拓展函数返回数据表的方式