1、闪回删除:利用回收站恢复删除的表
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 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。
1). 直接alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。
2). 先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。
参考文献: