一、模擬truncate操作:
SQL> conn scott/tiger
SQL> select count(*) from t;
COUNT(*)
----------
13
SQL> truncate table t;
二、恢復truncate表的數據
1.下載hellodba的恢復工具到數據庫服務器
linux下使用終端,如下:
windows下輸入以下網址:
http://www.hellodba.com/Download/FY_Recover_Data.zip
2.解壓下載下來的FY_Recover_Data.pck
[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='SCOTT' and t.table_name='T' and t.tablespace_name = f.tablespace_name;
查得結果是/u01/oracle/oradata/orcl/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 := 'SCOTT'; --table owner
tgttable := 'T'; --table name
datapath := '/u01/oracle/oradata/orcl/'; --必須和被truncate表所在的數據文件的目錄相同
datadir := 'FY_DATA_DIR'; --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用戶把恢復的數據從scott.t$$中插回scott.t表
注:scott.t$$中是scott.t表truncate之前的數據
SQL> insert into scott.t select * from scott.t$$;
13 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from t;
COUNT(*)
----------
13
可以看到被truncate的數據已經恢復。
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.