FLASHBACK恢复技术
发布时间:2020-12-15 18:49:13 所属栏目:百科 来源:网络整理
导读:1、闪回删除:利用回收站 恢复 删除的表 1)创建测试表,并删除 SQL create? table ?t1 (no number); 表已创建。 SQL drop table t1; 表已删除。 2)当表删除后,其实只是将其重名,查看scott用户拥有的表,会发现多出一行 SQL set wrap off; SQL select * f
1、闪回删除:利用回收站恢复删除的表
1)创建测试表,并删除
SQL> create?
table?t1 (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 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。?
参考文献:
http://wallimn.iteye.com/category/55615?page=2&show_full=true
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |