ITPub博客

首页 > 数据库 > Oracle > (转)oracle10g新特性之 flashback

(转)oracle10g新特性之 flashback

原创 Oracle 作者:polestar123 时间:2009-04-02 16:41:32 0 删除 编辑

1、flashback drop

目前,Oracle10g为了加快用户错误操作的恢复,提供了flashback drop新特性。

flashback drop功能可以允许你从当前数据库中恢复一个被drop了的对象,在执行drop操作时,现在Oracle不是真正删除它,而是将该对象自动将放入回收 站。“回收站”我们可以理解为一个虚拟的容器,它用来存放所有被删除的对象。在回收站中,被删除的对象将占用创建时的同样的空间,你甚至还可以对已经删除 的表查询,也可以利用flashback功能来恢复它, 这个就是flashback drop功能。

回收站内的相关信息我们可以从recyclebin /user_recyclebin/dba_recyclebin等视图中获取,或者通过SQL*Plus的show recyclebin 命令查看。

例:

SQL> create table myemp as select * from emp

表创建.

SQL> drop table myemp

表删除.

SQL> show recyclebin

ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME

---------------- ------------------------------ ------------ -------------------

MYEMP BIN$3oMpfWHfR6q1ccyEgXwBvg==$0 TABLE 2008-05-17:09:42:54

-----------------------闪回还原

SQL> flashback table myemp to before drop

2 /

闪回完成。

SQL> select empno ,ename ,job,sal deptno from myemp where deptno=20

2 /

3

4 EMPNO ENAME JOB DEPTNO

5 ---------- ---------- --------- ----------

6 7369 SMITH CLERK 800

7 7566 JONES MANAGER 2975

8 7788 SCOTT ANALYST 3000

9 7876 ADAMS CLERK 1100

10 7902 FORD ANALYST 3000

注意:使用"purge recyclebin"可以清除回收站中的所有对象。

同时,您也可以通过purge user_recyclebin或purge dba_recyclebin来清除不同的回收站对象。通过PURGE TABLESPACE TSNAME,PURGE TABLESPACE TSNAME USER USERNAME命令来选择清除回收站。

假如需要彻底删除一个表,不想放到回收站中,可以在drop语句中增加purge选项,例如:drop table tablename purge

注释:您需要注意的是sysdba的Drop操作不会被记录,Oracle从不推荐用户用sysdba身份来创建用户对象。

SQL> drop table keep_scn;
Table dropped
SQL> flashback table keep_scn to before drop;

Done
SQL> drop table keep_scn;

Table dropped
改变恢复后的表名 rename to
SQL> flashback table keep_scn to before drop rename to keep_scnback;

Done

2、flashback database

如果想启动FLASHBACK DATABASE的功能,您必须在MOUNT模式下,执行alter database flashback on命令。或者是alter tablespace tsname flashback on,数据库将采集falshback log,如果需要关闭该功能,则修改On为OFF。
如果想执行flashback database命令,你可以在两种方式下执行:RMAN与SQLPLUS。

SQL >flashback database to time to_date(xxx);
SQL >flashback database to time TO_TIMESTAMP (xxx);
SQL >flashback database to scn xxx
SQL >flashback database to sequence xxx thread 1
SQL>flashback database to timestamp(sysdate-1/24)

我们下面看看具体的例子说明

SQL>shutdown immediate;--立即关闭数据库和实例

Database closed.
Database dismounted.
ORACLE instance shut down.


SQL> startup mount; --启动实例并加载数据库
ORACLE instance started.
Total System Global Area 113246208 bytes
Fixed Size 787708 bytes
Variable Size 87030532 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
Database mounted.


SQL> alter database flashback on;--打开闪回功能
alter database flashback on
*
ERROR at line 1:
ORA-38706: Cannot turn on FLASHBACK DATABASE logging.
ORA-38707: Media recovery is not enabled.
可以看到,flashback还必须要归档的保证


SQL> alter database archivelog;--设为归档模式
Database altered.


SQL> alter database flashback on;
Database altered.


SQL> alter database open;--打开数据库
Database altered.


SQL> archive log list; --查看当前模式
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 13
Next log sequence to archive 15
Current log sequence 15
经过以上步骤,我们确保了flashback database的功能,我们还可以发现,10g的自动归档是不需要手工干预的,只要开启了归档,就是自动归档了,归档区也在DB_RECOVERY_FILE_DEST参数指定的地点。

通过如下的查询
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> SELECT OLDEST_FLASHBACK_SCN, OLDEST_FLASHBACK_TIME FROM V$FLASHBACK_DATABASE_LOG;


OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
-------------------- -------------------
1135440 2008-05-17 15:20:54

我们可以知道,可以前滚恢复到的最早的SCN与时间点是多少,如果没有确保flashback database,该视图将没有查询结果。

我们创建三个一样的表
SQL> create table t1 as select * from dba_objects;
Table created.
SQL> create table t2 as select * from t1;
Table created.
SQL> create table t3 as select * from t1;
Table created.
SQL> set time on;
SQL> select sysdate from dual;
SYSDATE
-------------------
2008-05-17 15:29:33

我们确定了一个时间点
现在,我们分别truncate一个表与drop一个表,模拟误操作。

SQL> set time on;
15:30:10 SQL> truncate table t2;
Table truncated.
15:30:43 SQL> drop table t3;
Table dropped.
没有备份,我们利用flashback来恢复数据库到2008-05-17 15:29:33时间点。


15:39:02 SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.


15:39:31 SQL> startup mount exclusive
ORACLE instance started.


15:41:19 SQL> FLASHBACK DATABASE TO timestamp(to_date(2008-05-17 15:29:33','yyyy-mm-dd hh24:mi:ss'));
Flashback complete.


之后,我们可以用 ALTER DATABASE OPEN READ ONLY 来检查结果是否正确,如果满足结果,则可以用resetlog来正式启动数据库,注意,一旦resetlogs之后,将不能再flashback的resetlogs之前的时间点。


15:41:32 SQL> alter database open resetlogs;
Database altered.
我们现在查询那三个表
15:42:10 SQL> select count(*) from t1;
COUNT(*)
----------
47708
15:42:47 SQL> select count(*) from t2;
COUNT(*)
----------
47708
15:42:50 SQL> select count(*) from t3;
COUNT(*)
----------
47708


发现truncate的记录或者是drop的表都存在,现在数据库已经前滚到前一个时间点了。


15:44:56 SQL> SELECT OLDEST_FLASHBACK_SCN, OLDEST_FLASHBACK_TIME FROM $FLASHBACK_DATABASE_LOG;

OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
-------------------- -------------------
1136169 2008-05-17 15:41:50
同时发现数据库的最早的flashback的时间与scn都回到resetlog的时间点了。

测试如下:

Microsoft Windows [版本 5.2.3790]
(C) 版权所有 1985-2003 Microsoft Corp.

C:Documents and SettingsAdministrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 4月 2 16:53:38 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.

SQL> conn sys as sysdba;
输入口令:
已连接到空闲例程。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area 293601280 bytes
Fixed Size 1248600 bytes
Variable Size 92275368 bytes
Database Buffers 192937984 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL>
SQL>
SQL>
SQL> alter database flashback on;

数据库已更改。

SQL> alter database open
2 ;

数据库已更改。

SQL> set timing on;
SQL>
SQL>
SQL>
SQL> select 'ff' from dual;

'F
--
ff

已用时间: 00: 00: 00.00
SQL>
SQL>
SQL>
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area 293601280 bytes
Fixed Size 1248600 bytes
Variable Size 88081064 bytes
Database Buffers 197132288 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL>
SQL> FLASHBACK DATABASE TO timestamp(to_date(2009-04-02 16:58:49','yyyy-mm-dd hh
24:mi:ss'));
ERROR:
ORA-01756: 引号内的字符串没有正确结束


已用时间: 00: 00: 00.00
SQL> FLASHBACK DATABASE TO timestamp(to_date('2009-04-02 16:58:49','yyyy-mm-dd
hh24:mi:ss'));

闪回完成。

已用时间: 00: 00: 08.14
SQL> alter database open resetlog;
alter database open resetlog
*
第 1 行出现错误:
ORA-02288: 无效的 OPEN 模式


已用时间: 00: 00: 00.01
SQL> alter database open resetlogs;

数据库已更改。

已用时间: 00: 00: 48.68
SQL>
SQL>
SQL>
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area 293601280 bytes
Fixed Size 1248600 bytes
Variable Size 92275368 bytes
Database Buffers 192937984 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL>
SQL>
SQL> FLASHBACK DATABASE TO timestamp(to_date('2009-04-02 16:59:37','yyyy-mm-dd
hh24:mi:ss'));

闪回完成。

已用时间: 00: 00: 09.56
SQL> alter database open resetlogs;

数据库已更改。

已用时间: 00: 00: 40.96
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
SQL>
SQL>
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area 293601280 bytes
Fixed Size 1248600 bytes
Variable Size 96469672 bytes
Database Buffers 188743680 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL> FLASHBACK DATABASE TO timestamp(to_date('2009-04-02 16:59:29','yyyy-mm-dd
hh24:mi:ss'));

闪回完成。

已用时间: 00: 00: 11.10
SQL> alter database open resetlogs;

数据库已更改。

已用时间: 00: 00: 37.63
SQL>

[@more@]

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

请登录后发表评论 登录
全部评论

注册时间:2009-05-22

  • 博文量
    110
  • 访问量
    438369