生产上误操作truncate表的恢复:
一、模拟truncate操作:
SQL> conn hr/oracle
SQL> create table test as select * from employees;
SQL> truncate table test;
二、恢复truncate表的数据
1.下载hellodba的恢复工具到数据库服务器
FY_Recover_Data.zip
2.解压下载下来的FY_Recover_Data.zip
[oracle@rac1 ~]$ unzip FY_Recover_Data.zip
解压后得到一个文件FY_Recover_Data.SQL
以下3-7步操作均用sys用户执行:
3.使用sys用户执行解压后的脚本(我这里解压后的文件在/home/oracle/)
SQL> @/home/oracle/FY_Recover_Data.SQL
这个脚本实际是在sys用户下创建了一个名为FY_Recover_Data的package
4.使用sys用户找出存放truncate表的数据文件路径,下一步会用到这个文件路径
SQL> select file_name from dba_data_files f, dba_tables t where t.owner='HR' and t.table_name='TEST' and t.tablespace_name = f.tablespace_name;
查得结果是/u01/oracle/oradata/PROD4/PROD4/users01.dbf
5.使用sys用户执行以下操作开始恢复:
declare
tgtowner varchar2(30);
tgttable varchar2(30);
datapath varchar2(4000);
datadir varchar2(30);
rects varchar2(30);
recfile varchar2(30);
rstts varchar2(30);
rstfile varchar2(30);
blksz number;
rectab varchar2(30);
rsttab varchar2(30);
copyfile varchar2(30);
begin
tgtowner := 'HR'; --table owner
tgttable := 'TEST'; --table name
datapath := '/u01/app/oracle/oradata/PROD4/PROD4/'; --必须和被truncate表所在的数据文件的目录相同
datadir := 'D1'; --oracle中目录的名字,可以修改:最好提前创建一个目录名:create directory d1 as '/home/oracle';
Fy_Recover_data.prepare_files(tgtowner, tgttable, datapath, datadir, rects, recfile, rstts, rstfile, blksz);
Fy_Recover_data.fill_blocks(tgtowner, tgttable, datadir, rects, recfile, rstts, 8, tgtowner, tgtowner, rectab, rsttab, copyfile);
Fy_Recover_data.recover_table(tgtowner, tgttable, tgtowner, rectab, tgtowner, rsttab, datadir, datadir, recfile,datadir, copyfile, blksz);
end;
/
注:执行上的SQL产生2个表空间FY_REC_DATA、FY_RST_DATA,还有1个copy文件。
6.使用sys用户把恢复的数据从hr.test$$中插回hr.test表
注:scott.t$$中是scott.t表truncate之前的数据
SQL> insert into hr.test select * from hr.test$$;
13 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from test;
COUNT(*)
----------
107
可以看到被truncate的数据已经恢复。
或者在生产遇到的表是大表:我们可以用move的方式
SQL> alter table test rename to testold;
Table altered.
SQL> alter table test$$ move tablespace users;
Table altered.
SQL> alter table test$$ rename to test;
Table altered.
SQL> select count(*) from test;
COUNT(*)
----------
75185
7.使用sys用户删除恢复时产生的2个表空间及数据文件
SQL> drop tablespace fy_rec_data including contents and datafiles;
Tablespace dropped.
SQL> drop tablespace fy_rst_data including contents and datafiles;
Tablespace dropped.