Flashback Database是Oracle 10g的新增功能,在启用Flashback Database功能之后,数据库会定期将发生变化的数据块的前镜像写入闪回日志的日志文件中,在进行数据库闪回时,这些数据块可以被直接复制回来以满足数据库的恢复需求,同时Redo Log可以被应用以辅助数据恢复到更精确的时间点,从而极大的缩短了恢复时间。
在传统的数据库恢复中,如果为了应对用户错误,那么通常需要进行基于时间点的不完全恢复,恢复的过程需要恢复数据文件、归档日志,再通过日志应用恢复到指定的时间点,这种恢复方式可能需要更长的恢复时间,而闪回数据库则可以避免文件恢复的过程,从而缩减恢复时间。
闪回数据库的日志文件不是由传统的Log Writer(LGWR)进程写入,而是由一个称作RecoVery WRiter(RVWR)的新过程写入,这是Oracle 10g新增的一个后台进程:
$ ps -ef|grep rvwr|grep -v grep oracle 27231 1 0 17:10:30 ? 0:00 ora_rvwr_eygle
复制
在Windows系统上,可以通过动态视图找到相关信息:
SQL> select sid,program from v$session where program like '%RVWR%'; SID PROGRAM ---------- ------------------------------ 156 ORACLE.EXE (RVWR)
复制
闪回日志文件由RVWR进程在恢复区中自动创建和维护。
闪回数据库的特性缺省是关闭的,启用闪回数据库特性需要在Mount状态下进行:
SQL> startup mount; ORACLE 例程已经启动。 Total System Global Area 289406976 bytes Fixed Size 1248600 bytes Variable Size 113246888 bytes Database Buffers 171966464 bytes Redo Buffers 2945024 bytes 数据库装载完毕。 SQL> alter database flashback on; 数据库已更改。 SQL> alter database open; 数据库已更改。
复制
数据库的闪回状态可以从v$database视图中查询得到:
SQL> select dbid,name,flashback_on,current_scn 2 from v$database; DBID NAME FLASHBACK_ON CURRENT_SCN ---------- --------- ------------------ ----------- 1417824532 EYGLE YES 586483
复制
初始化参数db_flashback_retention_target用于定义一个时间上限,用于设置数据库能够闪回的最大时间上限,单位是分钟。这个参数设置的只是一个期望值,确切的闪回时间取决于闪回区中保留的闪回数据:
SQL> show parameter db_flashback NAME TYPE VALUE ------------------------------------ ----------- ------------------ db_flashback_retention_target integer 1440
复制
来看一下闪回数据库的用途,测试用户eygle下有两张测试表:
SQL> connect eygle/eygle 已连接。 SQL> select count(*) from eygle; COUNT(*) ---------- 1 SQL> select count(*) from test; COUNT(*) ---------- 15
复制
分别在不同时间Truncate这两张表,Truncate的数据是不能使用闪回查询恢复的,此时可以通过闪回数据库进行恢复:
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 会话已更改。 SQL> select sysdate from dual; SYSDATE ------------------- 2007-03-10 13:41:52 SQL> truncate table eygle; 表被截断。 SQL> select sysdate from dual; SYSDATE ------------------- 2007-03-10 13:42:04 SQL> truncate table test; 表被截断。 SQL> select sysdate from dual; SYSDATE ------------------- 2007-03-10 13:42:13
复制
闪回需要在mount状态下进行,可以指定Timestamp/SCN/Sequence进行闪回。
首先将数据库闪回到第一个时间点,以Read Only的方式打开数据库:
SQL> startup mount; ORACLE 例程已经启动。 Total System Global Area 289406976 bytes Fixed Size 1248600 bytes Variable Size 117441192 bytes Database Buffers 167772160 bytes Redo Buffers 2945024 bytes 数据库装载完毕。 SQL> flashback database to timestamp 2 to_timestamp ('2007-03-10 13:41:52','yyyy-mm-dd hh24:mi:ss'); 闪回完成。 SQL> alter database open read only; 数据库已更改。
复制
此时检查,两个数据表的数据都已经恢复:
SQL> select count(*) from eygle.eygle; COUNT(*) ---------- 1 SQL> select count(*) from eygle.test; COUNT(*) ---------- 15
复制
如果数据恢复得不够理想,可以关闭数据库继续进行恢复:
SQL> flashback database to timestamp 2 to_timestamp ('2007-03-10 13:42:04','yyyy-mm-dd hh24:mi:ss'); 闪回完成。 SQL> alter database open read only; 数据库已更改。 SQL> select count(*) from eygle.eygle; COUNT(*) ---------- 0 SQL> select count(*) from eygle.test; COUNT(*) ---------- 15
复制
可以看到此时eygle表的数据已经被截断,test表的数据仍然存在。
从alert文件中,可以看到恢复过程的提示信息:
Sat Mar 10 13:54:57 2007 flashback database to timestamp to_timestamp ('2007-03-10 13:42:04','yyyy-mm-dd hh24:mi:ss') Sat Mar 10 13:54:58 2007 Flashback Restore Start Flashback Restore Complete Flashback Media Recovery Start Sat Mar 10 13:55:00 2007 Recovery of Online Redo Log: Thread 1 Group 1 Seq 34 Reading mem 0 Mem# 0 errs 0: D:\ORADATA\EYGLE\ONLINELOG\O1_MF_1_2G8OGOQG_.LOG Mem# 1 errs 0: D:\ORADATA\FLASH_RECOVERY_AREA\EYGLE\ONLINELOG\O1_MF_1_2G8OGTJH_.LOG Sat Mar 10 13:55:02 2007 Incomplete Recovery applied until change 587319 Flashback Media Recovery Complete Completed: flashback database to timestamp to_timestamp ('2007-03-10 13:42:04','yyyy-mm-dd hh24:mi:ss') Sat Mar 10 13:55:09 2007
复制
如果确认恢复了需要的数据,那么就可以resetlogs打开数据库,恢复工作。
SQL> alter database open resetlogs; 数据库已更改。
复制
注意:一旦resetlogs之后,将不能再flashback至resetlogs之前的时间点。