10g新特性 flashback

Flashback database


  闪回数据库可以迅速的时数据库回到误操作或人为错误的前一个时间点,如实际中的“撤消”操作,将可以不利用备份就快速的实现时间点的恢复(有后悔药可以吃了)。实际上,Oracle为了实现这一个功能,创建了另外一组日志,就是Flashback Logs(前滚日志),记录数据库的前滚操作。如果希望能闪回数据库,需要设置如下参数:
  DB_RECOVER_FILE_DEST
  DB_RECOVER_FILE_DEST_SIZE
  这两个参数来确定Flashback日志的存放地点与该恢复区的大小。在创建数据库的时候,Oracle将自动创建恢复区(需要注意,该恢复区可不仅仅是为了flashback log,还可以用来归档,备份与恢复),但是默认是关闭Flashback database功能。如果想要利用这一功能,DBA就必须正确的配置该日志区的大小,如一个数据库的数据库,每天有10%的块发生改变,那么一天(24小时)的Flash Recovery Area就是1/10个数据库大小。DBA也可以动态的改变其大小以满足不同的需求。
  另外一个参数DB_FLASHBACK_RETENTION_TARGET参数允许您设定闪回数据的保存时间,单位是分。默认是一天(24*60)
  如果想启动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> 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
  2 FROM V$FLASHBACK_DATABASE_LOG;
  OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
  -------------------- -------------------
  1135440 2004-04-06 15:20:57
  我们可以知道,可以前滚恢复到的最早的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
  -------------------
  2004-04-06 15:29:33
  我们确定了一个时间点
  现在,我们分别truncate一个表与drop一个表,模拟误操作。
  15:30:10 SQL> truncate table t2;
  Table truncated.
  15:30:43 SQL> drop table t3;
  Table dropped.
  没有备份,我们利用flashback来恢复数据库到2004-04-06 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('2004-04-06 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
  15:45:05 2 FROM V$FLASHBACK_DATABASE_LOG;
  
  OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
  -------------------- -------------------
  1136169 2004-04-06 15:41:50
  同时发现数据库的最早的flashback的时间与scn都回到resetlog的时间点了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值