案例一、Oracle Truncate恢复
Fy_Recover_Data是利用Oracle表扫描机制、数据稼接机制恢复TRUNCATE或者损坏数据的工具包,由纯PLSQL编写,Oracle内部人员使用,官方未公开。
windows下输入以下网址下载恢复包:
http://www.hellodba.com/Download/FY_Recover_Data.zip
1.环境(10G RAC)


2.解压FY_Recover_Data.pck包
[oracle@rac1 ~]$ unzip FY_Recover_Data.zip
解压后得到一个文件FY_Recover_Data.pck

3.使用sys用户执行解压后的脚本(我这里解压后的文件在/home/oracle/)
SQL> @/home/oracle/FY_Recover_Data.pck
这个脚本实际是在sys用户下创建了一个名为FY_Recover_Data的package
select a.object_name,a.object_type,a.created From all_objects a
where owner='SYS'
and object_type = 'PACKAGE'
and object_name='FY_RECOVER_DATA'

4.Truncate 表(误操作)

5.执行恢复(sys用户)
exec fy_recover_data.recover_truncated_table('SCOTT','T');
注:执行上的SQL产生2个表空间FY_REC_DATA、FY_RST_DATA

6.使用sys用户把恢复的数据从scott.test$$中插回scott.test表
注:scott.test$$中是scott.test表truncate之前的数据

可以看到被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.

案例二、Oracle 10G Drop恢复
1.从oracle10g开始删除数据库表的时候并不是真正删除,而是放到了recyclebin中,这个过程类似 windows里面删除的文件会被临时放到回收站中。
2.删除的表系统会自动给他重命名就是你看到的 【BIN$】开头的名字
通过 show recyclebin 命令可以查看被删掉的表的详细信息,或者查询
select * from recyclebin;
3.收回表的命令
flashback table 原表名 to before drop;
4.情况回收站的命令:
purge recyclebin;
5.如果不想删除的表经过回收站
drop table 表名 purge;
或者停用数据库的回收战功能
10.1版本中,修改隐藏参数 _recyclebin
alter system set "_recyclebin" = false;
10.2版本中
alter system set recyclebin = off;
6.清空默认生成的表名,可以通过以下命令
drop table 'BIN$qLechQyAZbzgVAAjfT4Z9Q==$0' purge
闪回:后进先出
7.恢复同一个 schema 下准备闪回的表已有同名的对象存在,闪回 drop 需要重命名.
SQL> flashback table t1 to before drop rename to test_old;
举例说明:
如果一个表上面有索引和约束,drop 后再闪回表,索引和约束还在吗?
create table t (id int,name char(10));
alter table t add constraint pk_t primary key(id);
insert into t values (1,'sohu');
insert into t values (2,'sina');
commit;
SQL> select * from t;
看一眼约束和索引
SQL> select * from user_indexes;
SQL> select * from user_constraints;
再看约束和索引
SQL> select * from user_indexes; 索引回来了,有效(考点),但乱码
SQL> select * from user_constraints; 约束也在,有效(考点),但乱码
分别重命名索引和约束
SQL> alter index "BIN$yF3hbvIbioTgQAB/AQAJlg==$0" rename to pk_t;
SQL> alter table t rename constraint "BIN$yF3hbvIaioTgQAB/AQAJlg==$0" to pk_t;





