天天看点

Oracle恢复方法(表、包)

微信公众号:IT邦德

Oracle恢复方法(表、包)

1.Truncate表

oracle 10g 恢复

Fy_Recover_Data是利用Oracle表扫描机制、数据嫁接机制恢复TRUNCATE或者损坏数据的工具包,由纯PLSQL编写

linux下使用终端,如下:

1.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.pck

3.使用sys用户执行解压后的脚本(我这里解压后的文件在/home/oracle/)

SQL> @/home/oracle/FY_Recover_Data.pck

这个脚本实际是在sys用户下创建了一个名为FY_Recover_Data的package

4.执行
exec fy_recover_data.recover_truncated_table('SCOTT','T');
注:执行上的SQL产生2个表空间FY_REC_DATA、FY_RST_DATA
5.使用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.
可以看到被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.

2.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;      
Oracle恢复方法(表、包)

3.闪回查询 (DML 误操作)

as of timestamp to_timestamp(‘2020-07-17 09:30:00’, ‘yyyy-mm-dd hh24:mi:ss’)      

4.闪回存储过程、包(sys用户)

1.找回ID
SELECT obj#
FROM obj$ AS OF TIMESTAMP TO_TIMESTAMP('2020-07-24  14:30:00', 'YYYY-MM-DD HH24:MI:SS')
WHERE NAME = 'PKG_COG'
2.通过ID反查
SELECT source
FROM source$ AS OF TIMESTAMP TO_TIMESTAMP('2020-07-24  14:30:00', 'YYYY-MM-DD HH24:MI:SS')
where obj# = 138324;      

3.脚本输出

–输出脚本命令

set echo off;
 set feedback off;
 set verify off;
 set term off;
 set trimspool on;
 set linesize 3000;
 –set pagesize 999;
 set newpage none;
 set heading off;
 spool /oracle/scr/wpp.sql; --输出指定目录的文件
 @/home/oracle/scr/test.sql; --执行SQL脚本(sql语句查询)
 SQL> @/home/oracle/scr/wdd.sql      

5.闪回表 (undo)

1.闪回表通常是把表的状态回退到以前的某个时刻或者 SCN 上。(其实向前向后都能闪),自动恢复相关的属性,包括索引、触发器等。前提是对表启用行移动。

语法:flashback table <table_name> to timestamp | scn

原理:利用的是Undo表空间的undo数据,闪回表到某个时间点或某个SCN,适用于Delete

SQL>delete student;
 SQL>commit;
 SQL>alter table student enable row movement;
 SQL>flashback table student to scn XXXXX      

闪回查询确认过去的这个时间点是不是我们想要的数据:

select * from fb_1 as of scn 973099;

执行闪回,可以执行多次闪回操作:

flashback table fb_1 to scn 973099;

SYS@ORCL> flashback table scott.t to timestamp to_timestamp(‘2020-08-19 01:20:00’,‘yyyy-mm-dd hh24:mi:ss’);