Oracle Flashback之Flashback database
2012-01-17 16:19:06
我来说两句
[字体: ]
在Oracle 10g中,Flash back家族分为以下成员:
Flashback Database
Flashback Drop
Flashback Table
Flashback Query(分Flashback Query,Flashback Version Query,Flashback Transaction Query)
下面介绍一下Flashback Database
1. Flashback Database 不能解决Media Failure, 这种错误RMAN恢复仍是唯一选择
2. 如果删除了数据文件或者利用Shrink技术缩小数据文件大小,这时不能用Flashback Database技术回退到改变之前的状态,这时候就必须先利用RMAN把删除之前或者缩小之前的文件备份restore 出来, 然后利用Flashback Database 执行剩下的Flashback Datbase。
3. 如果控制文件是从备份中恢复出来的,或者是重建的控制文件,也不能使用Flashback Database。
4. 使用Flashback Database锁能恢复到的最早的SCN, 取决与Flashback Log中记录的最早SCN。
Flashback Database 架构
Flashback Database 整个架构包括一个进程Recover Writer(RVWR)后台进程,Flashback Database Log日志 和Flash Recovery Area。一旦数据库启用了Flashback Database, 则RVWR进程会启动,该进程会向Flash Recovery Area中写入Flashback Database Log, 这些日志包括的是数据块的" 前镜像(before image)", 这也是Flashback Database 技术不完全恢复块的原因。
启用Flashback Database
数据库的Flashback Database功能缺省是关闭的,要想启用这个功能,就需要做如下配置。
1. 配置Flash Recovery Area
要想使用Flashback Database, 必须使用Flash Recovery Area,因为Flashback Database Log只能保存在这里。 要配置的2个参数如下,一个是大小,一个是位置。如果数据库是RAC,flash recovery area 必须位于共享存储中。数据库必须处于archivelog 模式.
启用Flash Recovery Area:
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=2G SCOPE=BOTH;
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='D:\oracle\product\10.2.0\flash_recovery_area\' SCOPE=BOTH;
禁用Flash Recovery Area:
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='' ;
对于Flash Recovery Area,Oracle 是这样建议的,flash recovery area 设置的越大,flashback database 的恢复能力就越强,因此建议flash recovery area 能够放的下所有的数据文件,增量备份,以及所有尚未备份的归档文件,当然还有它自己产生的flashback logs。
在数据库运行过程中,oracle 自动向该区域写入文件,当剩余空间不足15%的时候,它就会在alert 中增加警告,提示你空间不足。但此时不会影响数据库的正常运转,直到所有空间统统被用掉之后,oracle 首先尝试删除寻些过期的文件,冗余文件或备份过的文件,如果这些做完了,还是没有空闲空间的话,数据库就被hang 住了。
对于因Flash Recovery Area导致的数据库hang的处理,请参考:http://blog.csdn.net/tianlesoftware/archive/2009/10/14/4668991.x
或者http://user.qzone.qq.com/251097186/blog/1244650673
2. 启用Flashback 功能
1). 数据库启动到mount状态
SQL> startup mount;
2). 检查Flashback 功能, 缺省时功能是关闭的。
SQL> SQL> select name, current_scn, flashback_on from v$database;
NAME CURRENT_SCN FLASHBACK_ON
--------- ----------- ------------------
ORCL 3757148 NO
3). 启动Flashback功能,通过show parameter flashback是看不见的.
必须在MOUNT EXCLUSIVE状态改:否则会有下面的错误
SQL> alter database flashback on;
alter database flashback on
ERROR at line 1:
ORA-38759: Database must be mounted by only one instance and not open.
SQL>STARTUP MOUNT EXCLUSIVE;
SQL> alter database flashback on;
Database altered.
-- off为不打开,改为off可以在open状态下改,改完后flash_recovery_area\下的flashback log文件会被自动删掉.
这时候会在开始设定的目录D:\oracle\product\10.2.0\flash_recovery_area 下生成一个ORCL\FLASHBACK目录(ORCL根据数据库名称变化),下面放的是flashback log文件.
SQL> select name, current_scn, flashback_on from v$database;
NAME CURRENT_SCN FLASHBACK_ON
--------- ----------- ------------------
ORCL 0 YES
4). 设置初始化参数:DB_FLASHBACK_RETENTION_TARGET:
SQL>alter system set db_flashback_retention_target=1440 scope=both;
该参数用来控制flashback log 数据保留的时间,或者说,你希望flashback database 能够恢复的最早的时间点。默认值是1440,单位是minute,即24 小时,需要注意的是该参数虽然未直接指定flash recovery area大小,但却受其制约,举个例子假如数据库每天有10%左右的数据变动的话,如果该初始化参数值设置为1440,则flash recovery area 的大小至少要是当前数据库实际容量的10%,如果该初始化参数设置为2880,则flash recovery area 的大小就至少是数据库所占容量的20%。
5). 启动数据库
SQL>alter database open;
Flashback Database操作示例
1. 检查是否启动了flash recovery area:
SQL> show parameter db_recovery_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string D:\oracle\product\10.2.0\flash _recovery_area\
db_recovery_file_dest_size big integer 2G
2. 检查是否启用了归档
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
3. 检查是否启用了flashback database
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
在恢复点之前的数据库的数据:test1表和test2表各有一条数据如下
SQL> select * from test1;
ID NAME
---------- ----------
3759479 A
SQL> select * from test2;
ID VAL
---------- ----------
3759479 A
这里3759479 是一个scn的值,用这个值好形象的说明表示这些数据是在恢复点之前的数据.
4. 查询当前的scn
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
3761875
5. 查询当前的时间
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;
TIME
-----------------
12-01-13 15:26:34
到时候做恢复的时候只恢复到上面的点.
6. 在恢复点后的操作:
一个用户不小心将test1表里的数据删除了而且提交了,想找回来.
SQL> delete from test1;
1 row deleted.
SQL> commit;
Commit complete.
同时,另一个用户在test2表里增加了数据.
SQL> insert into test2 values(dbms_flashback.get_system_change_number,'B');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from test2;
ID VAL
---------- ----------
3759479 A
3761885 B
7. Flashback Database 实际是对数据库的一个不完全恢复操作,因此需要关闭数据库重启到mount状态。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 213912452 bytes
Database Buffers 390070272 bytes
Redo Buffers 7135232 bytes
Database mounted.
8. 执行恢复:分timestamp 或者SCN两种
SQL> Flashback database to scn 3761875;
Flashback complete.
通过时间点闪回: Flashback database to timestamp to_timestamp('12-01-13 15:26:34','yy-mm-dd hh24:mi:ss');
9. 打开数据库:
在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:
1). 先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。
2). 直接alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。
SQL> alter database open read only;
Database altered.
SQL> select * from test1;
ID NAME
---------- ----------
3759479 A
对于test1表,这里我们发现恢复点之前的数据已经闪回.这时候应该将闪回的test1表的数据导出,对数据库做完整的恢复,然后将数据导入.
SQL> select * from test2;
ID NAME
---------- ----------
3759479 A
对于test2表,这里我们发现恢复点之前的数据也存在,但是恢复点之后的数据(3761885 B)丢失了.
SQL> shutdown immediate
SQL> startup mount
SQL> recover database;
Media recovery complete.
SQL> alter database open;
Database altered.
再来验证数据:
SQL> select * from test1;
no rows selected
SQL> select * from test2;
ID VAL
---------- ----------
3759479 A
3761885 B
是完整恢复后的正确数据,把开始test1表的导出数据导入test1表,数据找回完成.
和Flashback Database 相关的2个视图:
1. V$database
这个视图可以查看是否启用了Flashback database功能
SQL> select flashback_on from v$database;
2. V$flashback_database_log
Flashback Database 所能回退到的最早时间,取决与保留的Flashback Database Log 的多少, 该视图就可以查看许多有用的信息。
Oldest_flashback_scn / Oldest_flashback_time : 这两列用来记录可以恢复到最早的时点
Flashback_size: 记录了当前使用的Flash Recovery Area 空间的大小
Retention_target: 系统定义的策略
Estimated_flashback_size: 根据策略对需要的空间大小的估计值
3. V$flashback_database_stat
这个视图用来对Flashback log 空间情况进行更细粒度的记录和估计。 这个视图以小时为单位记录单位时间内数据库的活动量,Flashback_Data 代表Flashback log产生数量,DB_Date 代表数据改变数量,Redo_Date代表日志数量,通过这3个数量可以反映出数据的活动特点,更准确的预计Flash Recovery Area的空间需求