记一次表误删除的调查和恢复

下午一个客户联系我说他发现数据库里面的一张表被清空了,不知道是谁干的,然给我帮他找出来,再看能不能修复数据,表的数据量不是太大。

询问了,前几天还有数据的,那么估计也就是最近一两天数据被清空的,由于客户没有做审计,所以能不能找到只能尽力而为。

下面是具体步骤:

1.首先大概定位一下A表被清空是delete全表还是truncate全表

通过查询dba_objects下的last_ddl_time,看表的最近一次发生ddl的时间。发现是去年的时间,那么应该是执行了delete from A;的操作。

2.查询相关的sql视图

select * from  XXXX where sql_text like '%A%';

一般需要查询的sql视图有v$sqlarea,v$sqltext,dba_hist_sqltext

v$sqlarea是共享sql区的sql,90%你的delete的语句已经被清理出了sql共享区,基本不会查到

v$sqltext是保存在sga中的,v$sqlarea中的sql可能被刷出了shared pool,但是有可能在v$sqltext中还存在,应该是oracle为v$sqltext有单独的划分了一个buffer

dba_hist_sqltext是awr用到的保存的历史sql,他的保存时间根据你awr的保留时间而定,默认是7天,而且这个视图的数据是在数据文件中的,不是保存在内存中,因此哪怕数据库重启也不会丢失,如果在上面的视图中还没有查到可以到此视图中查询,一般都可以查到。

我们通过查询上述几个视图在v$sqltext发现了一个delete from a;表的操作,并且时间定位到是上午10点多,得到了sql的sql_id.

3.查询相关的session视图

通过sql_id查询以下几个session视图:v$session,v$active_session_history,dba_hist_active_sess_history

v$session里显示的当前正在连接的session,可以查看sql_id和prev_sql_id,一般你也是查不到的,谁会干完坏事还继续连在数据库上呢,是我早就溜了~~

v$active_session_history是ash使用的到的视图,当ash buffer没有被重用的时候,会一直保留在其中除非重启

dba_hist_active_sess_history是awr用到的视图,默认也是保留7天,而且数据保存在数据文件中,不会因为重启而丢失。

我们这里通过查询v$active_session_history查询到了删除表的会话信息。得到了会话的program,username,machine等信息,到此表的调查就结束了。


既然知道了表删除的具体时间,而且表是通过delete语句删除的那么我们就可以通过logmnr日志挖掘将表中的数据恢复出来,如果是truncate操作清空的表只能通过备份恢复的方法了,具体的logmnr的操作就不在这里叙述了,网上文档比较多,也比较简单~~大笑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值