暂无图片
暂无图片
暂无图片
暂无图片
2
暂无图片

Truncate和Drop 表恢复操作

敖子🍖 2024-04-17
373

案例一、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

0

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;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论

北柚
暂无图片
9月前
评论
暂无图片 0
这个恢复工具是不是需要提前在数据库中部署才可以做到恢复truncate表操作?
9月前
暂无图片 点赞
1
敖子🍖
暂无图片
9月前
回复
暂无图片 0
是的
9月前
暂无图片 点赞
回复