今晚接到老大的电话,泰国的客户不小心删除了一些表的数据,现在非常着急,需要恢复数据。其实DBA做的数据库备份,很大程度是用于数据库crash掉的时候,恢复数据,而不是三天两头的因为客户误删了数据,而去做恢复。

看了客户的邮件,是有2个表的数据被误删除或者误插入或者误更新了。总之,操作过一大通,希望恢复到当天下午15:30的数据。上数据库去查了一下,用备份来恢复,似乎时间不够,尝试用户flashback query,发现已经回不去了:

 
  
  1. SQL> SQL> SQL> SELECT count(*) from hr_ttm.TA_ABSDOCS  
  2.   2  AS OF TIMESTAMP TO_TIMESTAMP('2011-06-09 15:29:00','YYYY-MM-DD HH24:MI:SS');  
  3. SELECT count(*) from hr_ttm.TA_ABSDOCS  
  4.                             *  
  5. ERROR at line 1:  
  6. ORA-01555: snapshot too old: rollback segment number 1 with name "_SYSSMU1$" 
  7. too small 

其他也没有更快的方法了,于是当下决定用logmnr挖数据,

由于数据库原来就没有配置utl_file_dir,因此还需要重启数据库使得该参数生效。一路做下来,大致算顺利,不过也遇到了不少小插曲。下面就是恢复的步骤:

一、备份原表

 
  
  1. create table hr_ttm.TA_ABSDOCS_20110610_0010 as 
  2. SELECT * from hr_ttm.TA_ABSDOCS;  
  3.    
  4. create table hr_ttm.TA_ABSDOC_20110610_0010 as 
  5. SELECT * from hr_ttm.TA_ABSDOC; 

二,根据客户要求,建立新用户,将恢复的数据导入到这2个表中:

 
  
  1. create user hr_ttm2 identified by hr_ttm2 default tablespace MSG_DATA;  
  2. grant connect,resource,dba to hr_ttm2;  

三、把原表数据备份到新用户下,用于做回滚

 
  
  1. create table hr_ttm2.TA_ABSDOCS as 
  2. SELECT * from hr_ttm.TA_ABSDOCS  
  3.    
  4. create table hr_ttm2.TA_ABSDOC as 
  5. SELECT * from hr_ttm.TA_ABSDOC 

四、修改参数,用于挖日志,重启数据库

 
  
  1. alter system set utl_file_dir='/prodlog/logmnr' scope=spfile;  

五、生成数据字典

 
  
  1. exec dbms_logmnr_d.build('dictionary.ora','/prodlog/logmnr');  

做这一步之前注意需要修改LD_LIBRARY_PATH和LIBPATH,使得lib的变量在lib32前面。不然会有报错ORA-00600: internal error code, arguments: [unable to load XDB library], [], [], [], [], [], [], []