FLASHBACK恢复技术

1、闪回删除:利用回收站恢复删除的表

1)创建测试表,并删除
SQL> create tablet1 (no number);

表已创建。

SQL> drop table t1;

表已删除。

2)当表删除后,其实只是将其重名,查看scott用户拥有的表,会发现多出一行
SQL> set wrap off;
SQL> select * from tab;
在列 CLUSTERID 前截断 (按要求)


TNAME TABTYPE
------------------------------------------------------------ --------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
BIN$NQzxLfRlQAKBq7RriSxCrA==$0 TABLE

3)查看回收站
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------

T1 BIN$NQzxLfRlQAKBq7RriSxCrA==$0 TABLE 2011-12-23:20:43:54

4)恢复删除的表t1
SQL> flashback table t1 to before drop;

闪回完成。

SQL> desc t1;
名称 是否为空? 类型
----------------------------------------- -------- ---------------------

NO NUMBER

2、闪回查询和闪回表

1)删除emp表一行数据
SQL> select count(*) from emp;

COUNT(*)
----------
14

SQL> delete from emp where empno=7934;

已删除 1 行。

SQL> commit;

提交完成。

SQL> select count(*) from emp;

COUNT(*)
----------
13

2)使用闪回查询,可以查看到指定时间点之前的数据
SQL> select * from emp as of timestamp
to_timestamp('20111223 20:50:00','yyyy dd hh24:mi:ss');
在列 SAL 前截断 (按要求)

在列 COMM 前截断 (按要求)

在列 DEPTNO 前截断 (按要求)


EMPNO ENAME JOB MGR HIREDATE
---------- -------------------- ------------------ ---------- --------------
7369 SMITH CLERK 7902 17-12月-80
7499 ALLEN SALESMAN 7698 20-2月 -81
7521 WARD SALESMAN 7698 22-2月 -81
7566 JONES MANAGER 7839 02-4月 -81
7654 MARTIN SALESMAN 7698 28-9月 -81
7698 BLAKE MANAGER 7839 01-5月 -81
7782 CLARK MANAGER 7839 09-6月 -81
7788 SCOTT ANALYST 7566 19-4月 -87
7839 KING PRESIDENT 17-11月-81
7844 TURNER SALESMAN 7698 08-9月 -81
7876 ADAMS CLERK 7788 23-5月 -87

EMPNO ENAME JOB MGR HIREDATE
---------- -------------------- ------------------ ---------- --------------
7900 JAMES CLERK 7698 03-12月-81
7902 FORD ANALYST 7566 03-12月-81
7934 MILLER CLERK 7782 23-1月 -82

已选择14行。

3)利用闪回查询的结果,把数据插入回表
SQL> insert into emp select * from emp as of timestamp to_timestamp('20111223 20
:50:00','yyyymmdd hh24:mi:ss') where empno=7934;

已创建 1 行。

SQL> commit;

提交完成。

4)也可以使用闪回表的方式
启动行移动功能
SQL> alter table emp enable row movement;

表已更改。

SQL> flashback table emp to timestamp to_timestamp('20111223 20:50:00','yyyymmdd
hh24:mi:ss');

闪回完成。


注意:
•FLASHBACK TABLE 命令可作为单个事务处理执行,以获取DML 互斥锁。
• 不闪回统计信息。
• 保留当前索引和相关对象。
• 闪回表操作:
– 不能对系统表执行
– 不能跨多个DDL 操作
– 会生成还原和重做数据


3、闪回数据库

1)关机并启动flashback功能

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 197135236 bytes
Database Buffers 406847488 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
SQL> alter database flashback on;

数据库已更改。

SQL> alter database open;

数据库已更改。

2)查看当前scn
SQL> select current_scn from v$database;

CURRENT_SCN
-----------
653354

3)删除表t1,并进行数据库闪回恢复

删除表t1
SQL> truncate table t1;

表被截断。

闪回数据库
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 201329540 bytes
Database Buffers 402653184 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
SQL>
SQL> flashback database to scn 653354;

闪回完成。

使用resetlogs打开数据库,并查看恢复数据
SQL> alter database open resetlogs;

数据库已更改。

SQL> select count(*) from t1;

COUNT(*)
----------
50318

注意:
在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:
1). 直接alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。
2). 先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。

参考文献:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值