ITPub博客

首页 > 数据库 > Oracle > Oracle恢复方法(表、包)

Oracle恢复方法(表、包)

原创 Oracle 作者:wddwr7307914 时间:2021-03-06 16:30:04 0 删除 编辑

1.Truncate表
oracle 10g 恢复
Fy_Recover_Data是利用Oracle表扫描机制、数据嫁接机制恢复TRUNCATE或者损坏数据的工具包,由纯PLSQL编写
linux下使用终端,如下:
1.windows下输入以下网址:
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;

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');

2.查询系统当前SCN两条命令
SQL> select current_scn from v$database;


6. 【12c】新特性:使用RMAN恢复表或表分区

当对一张表进行误操作,比如删除了数据、drop表,或者truncate表,我们可以通过使用闪回表、闪回drop,或者TSPITR可以进行恢复,但在以下场景下,上面的恢复技术将会束手无策:
* 表逻辑损坏或使用了purge选项的删除;
* UNDO不可用时,便不可使用闪回技术对表进行恢复;
* 对表误操作后,执行了DDL操作;
* 使用TSPITR,将会恢复表空间里的所有对象,不利于只恢复某些表的场景。

从Oracle 12c版本开始,Oracle引入了可以从RMAN备份中进行表和表分区的恢复,这样可大大简化了对表和表分区的恢复,本篇将对这一新特性进行演示。
1 备份数据库
rman target /
rman target sys/oracle@PDB1  --登陆PDB
RMAN> backup database;
2.创建测试数据
SQL> create table alen(id number,name varchar2(100));
SQL> insert into alen values(1,'Alen');
SQL> commit;
SQL> truncate table alen;

3 利用RMAN备份进行恢复
RMAN> recover table pms.alen
until time '2020-08-19 02:20:00'
auxiliary destination '/home/oracle/recover'
datapump destination '/home/oracle/exp'
dump file 'alen.dat'
notableimport;
4 使用IMPDP导入
impdp sys/oracle directory=EXP_BACK dumpfile=scott.alen.dat tables=scott.alen

create or replace directory EXP_BACK as '/home/oracle/exp'

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69947868/viewspace-2761561/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
中国DBA联盟(ACDU)成员,Oracle PostgreSQL ACE,CSDN博客专家及B站知名UP主,全网粉丝10万+,目前服务于工业互联网,擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复,安装迁移,性能优化、故障应急处理。

注册时间:2020-06-13

  • 博文量
    203
  • 访问量
    213260