您的位置:首页 > 其它

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

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

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

下面是具体步骤:

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的操作就不在这里叙述了,网上文档比较多,也比较简单~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: