Chinaunix首页 | 论坛 | 博客
  • 博客访问: 191094
  • 博文数量: 50
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 641
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-11 19:48
文章分类

全部博文(50)

文章存档

2011年(2)

2010年(1)

2009年(5)

2008年(42)

我的朋友

分类: Oracle

2008-04-11 19:59:20

Oracle 10gflashback有了强劲的改进,从普通的falshback query发展到了多种形式,主要表现在如下几个主要方面。通过Oracle 10g,你甚至可以不需要从备份恢复,完成恢复工作。
1
Oracle Flashback Database
这个特性允许你通过SQL语句FLASHBACK DATABSE语句,让数据库前滚到当前的前一个时间点或者SCN,而不需要做时间点的恢复。
2
Oracle Flashback Table
这个特性允许你利用SQL语句FLASHBACK TABLE语句,确保回滚到表的前一个时间点。
3
Oracle Flashback Drop
Oracle 10g
开始提供一个类似垃圾站的功能,来恢复不小心被drop的表
4
Oracle Flashback Version Query
利用保存的回滚信息,你可以看到特定的表在时间段内的任何修改,如电影的回放一样,你将了解表在该期间的任何变化
5
Oracle Flashback Transaction Query
这个特性将确保您检查数据库的任何改变在一个事务级别。你可以利用它来诊断问题,性能分析和审计事务
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,如果需要关系该功能,则修改OnOFF
如果想执行flashback database命令,你可以在两种方式下执行:RMANSQLPLUS
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>flashback database to restore point restp1;

我们下面看看具体的例子说明
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之后,将不能再flashbackresetlogs之前的时间点。
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的时间点了。
能恢复到哪,受DB_FLASHBACK_RETENTION_TARGET指定的时间的影响。默认是一天,就是说能恢复到24小时之内的任何前一时间,当然,你还可以修改该参数,但是注意恢复区的大小是否足够。

一旦恢复一次之后,第二次就只能恢复到第一次恢复的以后的时间,因为数据库已经resetlogs

 

阅读(493) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~