案例一、Oracle Truncate恢复
Fy_Recover_Data是利用Orac表扫描机制、数据稼接机制恢复TRUNCATE或者损坏数据的工具包,由纯PLSQL编写,Oracle内部人员使用,官方未公开。
网址下载恢复包:
http://www.hellodba.com/Download/FY_Recover_Data.zip
环境:oracle11g RAC
1、上传压缩包解压缩(/home/oracle)
chown oracle:oinstall FY_Recover_Data.zip chmod 755 FY_Recover_Data.zip oracle用户: unzip FY_Recover_Data.zip
2、使用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';
3、Truncate 表(误操作)
在user1 用户下新建一张表test1 CREATE TABLE test1 ( id NUMBER, name VARCHAR2(100) )tablespace DATA1; SQL>begin for i in 1..20000 loop insert into test1 values(i,'aqj'||i); end loop; commit; end; / SQL>select count(*) from test1; COUNT(*) ---------- 20000 SQL>truncate table test1; #误操作truncate 表 SQL>select count(*) from test1; COUNT(*) ---------- 0
4、执行恢复(sys用户)
SQL>conn / as sysdba SQL>exec fy_recover_data.recover_truncated_table('USER1','TEST1'); #执行对象为user1用户下的test1表 #执行上的SQL产生2个表空间FY_REC_DATA、FY_RST_DATA
5、使用sys用户把恢复的数据从USER1.test1$$中插回USER1.test1表
注:user1.test1$$中是user1.test1表truncate之前的数据
SQL>insert into user1.test1 select * from user1.test1$$; SQL> select count(*) from user1.test1; COUNT(*) ---------- 20000
可以看到被truncate的数据已经恢复。
6、使用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 11G 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;
文章被以下合辑收录
评论
