暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

恶意程序清空TAB$(ORA-00600 16703)表恢复系列二:基于快照闪回的恢复技术

Oracle恢复实录 2020-03-22
1993










点击上方蓝字关注我们~




我们的文章会在微信公众号“Oracle恢复实录”和博客网站“rescureora.com” 同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!


距离上篇《恶意程序清空TAB$(ORA-00600 16703)表恢复系列一:TAB$表清空报错错误汇总》文章已经半个月,上篇中总结了delete tab$相关的报错,也说此类错误是“人为导致的错误”。应网友们的要求,这次简单阐述一下“人为导致的错误”的过程。






何为ORA-00600 16703错误





报错的代码如下:

这里:
16703  600错误的第一个参数:代表一个错误类型。
1403 :代表行记录没有找到。
20 :代表objno






哪条SQL触发报错






ORA-00600错误会在后台自动生成一个errorstack和incident信息。

Incident 8553 created, dump file: oracle/app/oracle/diag/rdbms/rescureora/rescureora/incident/incdir_8553/rescureora_ora_32197_i8553.trc

使用关键字进行搜索:

grep "Current SQL Statement for this session"  /oracle/app/oracle/diag/rdbms/rescureora/rescureora/incident/incdir_8553/rescureora_ora_32197_i8553.trc
就可以找到SQL语句,如果非600错误,可以在进程配置errorstack就可以了。






对象ID为20是何方大神





objno为20的对象的ddl语句在bootstrap$中,是数据库在启动的时候自动初始化的。

CREATE TABLE ICOL$("OBJ#" NUMBER NOT NULL,
                   "BO#" NUMBER NOT NULL,
                   "COL#" NUMBER NOT NULL,
                   "POS#" NUMBER NOT NULL,
                   "SEGCOL#" NUMBER NOT NULL,
                   "SEGCOLLENGTH" NUMBER NOT NULL,
                   "OFFSET" NUMBER NOT NULL,
                   "INTCOL#" NUMBER NOT NULL,
                   "SPARE1" NUMBER,
                   "SPARE2" NUMBER,
                   "SPARE3" NUMBER,
                   "SPARE4" VARCHAR2(1000),
                   "SPARE5" VARCHAR2(1000),
                   "SPARE6" DATE)
  STORAGE ( OBJNO 20 TABNO 4) CLUSTER C_OBJ#(BO#) ;







为什么tab$中记录清空





查看ALERT日志,发现一个诡异的创建语句,可以肯定是非业务SQL语句,如下:

create table ORACHK82F6966E053076FA8C09E8A
tablespace system 
as select * from sys.tab$;

通过工具对redo进行分析,可以发现大量的delete tab$操作,或者通过odu抽取tab$会发现记录数为0。






分析总结





结论:

$ORACLE_HOME/rdbms/admin/prvtsupp.plb文件被人恶意修改。

解密后的内容如下:

也就是当数据库创建的时间大于300天后,如将数据库重启,那么在启动后就会触发DBMS_SUPPORT_DBMONITOR,此时备份sys.tab$的内容,再将tab$的内容全部删除。此时数据库执行任何查询命令就将返回0行数据库,如果将数据库再次重启,那么此时就会触发上面的报错。





解决方案





解决方案一:在本次中遇到的这个案例环境有点特殊,数据库运行在windows平台,并且数据库运行在阿里云上,更巧的是他们dba有个好习惯,每次要重启数据库时都对整个虚拟机做一次快照,数据库是放在D磁盘,操作系统是放在C磁盘,并且C,D对应不同的阿里云磁盘。此环境非常特殊,还原的方法也非常简单,但是也是有一定讲究的。步骤如下:

  1. 利用快照闪回C盘。

  2. 禁用Oracle服务随操作系统自动启动。

  3. 利用快照闪回C盘。

  4. 创建init参数文件,引用spfile文件,再加上'_system_trig_enabled'   =false;

  5. 启动Oracle服务

  6. 启动数据库,并删除触发器,关闭数据库

  7. 删除init参数文件

  8. 重启数据库。

业务正常连接,并且无任何数据丢失。

虽然整个恢复方案是非常简单的,这里分享出来,只是想和大家一起分享一个思路,数据库的恢复因环境而变,没有固定的方法。在做恢复时,我们需要对环境了解清楚。很多时候,我们是花了55分钟来思考为什么后,却只需要5分钟就可以解决问题。如果没有找到问题根源,可能我们做了2个小时也仍不能解决问题。

也许很多人会说,这个案例太特殊了,不具备学习的价值。确实它很特殊,但是已经在生产环境遇到几次了。

恢复的方案很多,最简单、最可能的方法就是最好的方案。

下周我们将继续分享解决方案二,也是一个技巧的方法。后续我们会继续分享解决方案三:通过bbed修改块来修复。敬请期待。

ps:大家可以扫描下方的微信二维码,添加我们的学习小助手,一起进群相互交流和学习~


 
往期回顾


Oracle恢复实录

rescureora.com

欢迎扫码关注



让我知道你在看


最后修改时间:2021-07-05 12:32:53
文章转载自Oracle恢复实录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论