ORACLE FLASHBACK DATABASE 总结

来源:互联网 发布:用户网络行为画像 zip 编辑:程序博客网 时间:2024/05/22 09:07

闪回数据库(FLASHBACK DATABASE)是oracle数据库非常重要的一项功能,与通过undo 获取表数据的历史版本进而执行逻辑错误恢复的功能相比,flashback database 的功能完全不同:undo数据是针对整个数据库的;undo数据的保存时间是有限的;undo 的本质是为了保持数据的一致性。而flashback database可以只针对某表空间保存历史数据,并且只要存储空间允许,flashback database可以保存任意长的历史时间。flashback database 日志中存储的是数据库数据的前镜像。

   


闪回数据库整个架构包括一个进程(rvmr),一段存储空间(flash recovery area),一种日志(flashback database log)。数据块的”前镜像“存储在闪回日志中(flashback database log)。


    启用闪回数据库

    

    要想使用Flashback Database, 必须使用Flash Recovery Area。 要配置的2个参数如下,一个是大小,一个是位置。如果数据库是RAC,flash recovery area 必须位于共享存储中。数据库必须处于archivelog 模式.参数db_flashback_retention_target控制闪回日志的保留时间,默认是1440,即24小时。


SQL> show parameter db_recoveryNAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------db_recovery_file_dest                string      /u01/app/oraele/fast_recovery_                                                 areadb_recovery_file_dest_size           big integer 4122MSQL> show parameter flashbackNAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------db_flashback_retention_target        integer     1440

SQL> archive log listDatabase log mode              Archive ModeAutomatic archival             EnabledArchive destination            USE_DB_RECOVERY_FILE_DESTOldest online log sequence     5Next log sequence to archive   7Current log sequence           7
要开启闪回数据库功能,可以使用alter database flashback on;

在11g下,可以在mount和open模式来执行该命令:


SQL> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit ProductionPL/SQL Release 11.2.0.3.0 - ProductionCORE    11.2.0.3.0      ProductionTNS for Linux: Version 11.2.0.3.0 - ProductionNLSRTL Version 11.2.0.3.0 - ProductionSQL> alter database flashback on;Database altered.SQL> select status from v$instance;STATUS------------OPEN

在10g下,需要在mount状态下,执行该命令

SQL> select * from v$version;BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64biPL/SQL Release 10.2.0.5.0 - ProductionCORE    10.2.0.5.0      ProductionTNS for Linux: Version 10.2.0.5.0 - ProductionNLSRTL Version 10.2.0.5.0 - ProductionSQL> select flashback_on from v$database;FLASHBACK_ON------------------NOSQL> select status from v$instance;STATUS------------OPENSQL> 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> truncate table test;Table truncated.SQL> insert into test values((select count(*) from test),(select current_scn from v$database));1 row created.SQL> commit;Commit complete.SQL>  insert into test values((select count(*) from test),(select current_scn from v$database));1 row created.SQL> commit;Commit complete.SQL>  insert into test values((select count(*) from test),(select current_scn from v$database));1 row created.SQL> commit;Commit complete.SQL> select * from test;        ID SCN---------- --------------------         0 1121575         1 1131647         2 1142043

    

在执行完flashback database 命令之后,可以使用多种方式修复数据库: 

1). 直接alter database open resetlogs 打开数据库,指定scn 或者timestamp 时间点之后产生的数据统统丢失。 

2). 先执行alter database open read only 命令以read-only 模式打开数据库,查看恢复后的数据是否满足要求,如果满足要求,则通过resetlogs打开数据库,否则,重新执行flashback 操作。

3). 先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。 

下面演示第二种方式:

SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area  267227136 bytesFixed Size                  2227504 bytesVariable Size             192938704 bytesDatabase Buffers           67108864 bytesRedo Buffers                4952064 bytesDatabase mounted.SQL> flashback database to scn  1121575;Flashback complete.SQL> alter database open read only;Database altered.SQL> select * from test;no rows selectedSQL> startup mount forceORACLE instance started.Total System Global Area  267227136 bytesFixed Size                  2227504 bytesVariable Size             192938704 bytesDatabase Buffers           67108864 bytesRedo Buffers                4952064 bytesDatabase mounted.SQL>SQL>SQL>SQL>SQL>SQL> shutdown immediateORA-01109: database not openDatabase dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area  267227136 bytesFixed Size                  2227504 bytesVariable Size             192938704 bytesDatabase Buffers           67108864 bytesRedo Buffers                4952064 bytesDatabase mounted.SQL> flashback database to scn  1121600;Flashback complete.SQL> select * from test;select * from test              *ERROR at line 1:ORA-01219: database not open: queries allowed on fixed tables/views onlySQL> alter database open read only;Database altered.SQL> select * from test;        ID SCN---------- --------------------         0 1121575SQL> startup mount forceORACLE instance started.Total System Global Area  267227136 bytesFixed Size                  2227504 bytesVariable Size             192938704 bytesDatabase Buffers           67108864 bytesRedo Buffers                4952064 bytesDatabase mounted.SQL> alter database open resetlog;alter database open resetlog                    *ERROR at line 1:ORA-02288: invalid OPEN modeSQL> alter database open resetlogs;Database altered.SQL> select * from test;        ID SCN---------- --------------------         0 1121575


  与flashback database 相关的视图

   V$database 

  通过这个视图可以查看是否启用了Flashback database功能 

SQL> select flashback_on from v$database; 

FLASHBACK_ON 

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

YES 

 

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的空间需求 

 

SQL> desc v$flashback_database_stat Name                                      Null?    Type ----------------------------------------- -------- ---------------------------- BEGIN_TIME                                         DATE END_TIME                                           DATE FLASHBACK_DATA                                     NUMBER DB_DATA                                            NUMBER REDO_DATA                                          NUMBER ESTIMATED_FLASHBACK_SIZE                           NUMBER

闪回数据库的工作原理

   为了实现闪回数据库,Oracle需要记录数据块的前景象before image到一种日志中,这种日志被命名为flashback database logs闪回日志。当一个数据块首次被修改时,前台进程会将该数据块的before image拷贝到位于shared pool中的flashback log buffer中,RVWR进程定期地将flashback log buffer中的记录刷新到磁盘上。 在DBWR进程可以写出相关脏块到磁盘之前,DBWR必须保证该buffer header相关FBA(Flashback Byte Address)的flashback log buffer已经写出到闪回日志。 这被称作 先写闪回日志 机制。在常规的闪回日志维护操作中 , RVWR进程定期地插入闪回标记(flashback markers)到flashback database logs中。 闪回标记(flashback markers)的作用是在闪回数据库是告知Oracle如何flashback 到之前的某个时间点。  在闪回操作执行过程中, Oracle 会用闪回标记(flashback markers)中的信息来决定多大范围的flashback database log需要用来还原数据块景象block image; 之后Oracle 会利用前向恢复(forward recovery)的方式把数据库穿越到用户指定闪回的SCN或者时间点。需要注意的是不是数据库中的每一次block change 都会触发before image被记录到闪回日志flashback log中。 如果每一次block change都记录flashback log record 那么闪回日志会要比 redo log大的多!对于hot block热块,Oracle仅在一段时间内记录一次block image到闪回日志; Oracle 内部通过闪回分界线(flashback barriers)实现这一点。在常规数据库状态下,flashback barriers被周期性的触发(一般为15分钟),对应每一个闪回分界线(flashback barriers)会有一个(flashback markers)被写出到闪回日志。常规情况下,对于每一个被修改的数据块在一个闪回区域(被分界线barriers分割的区域)内仅记录一个block image ,无论这个数据块在这段区域内被修改了多少次、被写出过多少次到磁盘上。

    当进行闪回时,先恢复到对应target time,即我们的之前的某个镜像上,然后根据redo log,重新应用redo log,将数据恢复到我们指定的闪回的时间点上。从这里可以看出,闪回数据库是需要redo log和归档日志支持的。

闪回数据库的限制

1:闪回数据库不能用于介质恢复

2:闪回数据库不能用于恢复使用了shrink技术的数据文件,不能用于恢复已经删除的数据文件

3:不能从重建控制文件或者恢复的控制文件,进行闪回数据库,因为控制文件中的闪回日志信息被过期丢弃了

4:我们不能使用闪回数据库将数据库闪回到执行nologging操作的时间点,因为有可能会造成数据快损坏


模拟一下控制文件恢复的情景:

[oraele@vm1 ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.3.0 Production on Tue Jan 27 09:13:12 2015Copyright (c) 1982, 2011, Oracle.  All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> recover database using backup controlfile;ORA-00279: change 1138457 generated at 01/26/2015 16:10:27 needed for thread 1ORA-00289: suggestion :/u01/app/oraele/fast_recovery_area/ORCL/archivelog/2015_01_27/o1_mf_1_1_%u_.arcORA-00280: change 1138457 for thread 1 is in sequence #1Specify log: {<RET>=suggested | filename | AUTO | CANCEL}/u01/app/oraele/oradata/orcl/redo01.logLog applied.Media recovery complete.SQL> alter database open resetlogs;Database altered.SQL> select * from test;        ID SCN---------- --------------------         0 1121575         1 1126681         2 1138419         3 1150711SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area  267227136 bytesFixed Size                  2227504 bytesVariable Size             192938704 bytesDatabase Buffers           67108864 bytesRedo Buffers                4952064 bytesDatabase mounted.SQL> flashback database to scn 1138419;flashback database to scn 1138419*ERROR at line 1:ORA-38729: Not enough flashback database log data to do FLASHBACK.SQL> desc v$flashback_database_log Name                                      Null?    Type ----------------------------------------- -------- ---------------------------- OLDEST_FLASHBACK_SCN                               NUMBER OLDEST_FLASHBACK_TIME                              DATE RETENTION_TARGET                                   NUMBER FLASHBACK_SIZE                                     NUMBER ESTIMATED_FLASHBACK_SIZE                           NUMBERSQL> select olddest_flashback_scn from v$flashback_database_log;select olddest_flashback_scn from v$flashback_database_log       *ERROR at line 1:ORA-00904: "OLDDEST_FLASHBACK_SCN": invalid identifierSQL> c/oldd/old  1* select oldest_flashback_scn from v$flashback_database_logSQL> /OLDEST_FLASHBACK_SCN--------------------             1150901SQL>
SQL> select begin_time from v$flashback_database_stat;BEGIN_TIM---------27-JAN-15

在使用闪回数据库技术或者其他闪回技术时,我们需要指定需要闪回到的scn或者时间点,为了简化工作,可以 创建restroe point来配合数据库闪回。

restore point分为normal restorepoint 和 guaranteed restore point两种。normal restore point 仅仅作为scn和时间点的别名使用,无其他用途,占用的控制文件空间也非常小,通常无需特别关注。控制文件会自动清除normal restore point 的信息,清除时遵循如下规则:

(1)    The most recent 2048 restorepoints are always kept in the control file, regardless of their age.

(2)    Any restore point more recentthan the value of CONTROL_FILE_RECORD_KEEP_TIME is retained,regardless of how many restore points are defined.


guaranteed restore point  同样作为scn和时间点的别名使用,但是控制文件不会自动清除guaranteed restore point ,必须通过手工才可以删除。另外,在不开启flashback  database的情况下,guaranteed restore point仍然可以使我们使用flashback database技术,只是此时我们只可以闪回到guaranteed restore point指定的时间点。此时,仍然会生出闪回日志,只是闪回日志中仅仅存储guaranteed restore point时间点之后数据块第一次发生改变时的“before image”。

我们知道,flashback database 与nologging的支持不太好,可能会造成坏块(间歇性的保持数据块前镜像,需要使用redo恢复数据)。但是在没有启用flashback database情况下的guaranteed restore point可以很好的支持nologging,因为此时不需要使用redo日志数据。在启用flashback  database log的情况下,如果创建guaranteed restore point,可以保证在guaranteed restore point到当前时间的任意时间点数据库都是可以闪回的。If you enableFlashback Database and define one or more guaranteed restore points, then thedatabase performs normal flashback logging.


flashback database 可以针对某表空间关闭,如:

SQL> alter database flashback on;Database altered.SQL>  alter tablespace users flashback off;Tablespace altered.SQL> create table test1 tablespace users as select * from test;Table created.SQL> insert into test values(1,1);1 row created.SQL> commit;Commit complete.SQL> insert into test1 select * from test;1 row created.SQL> commit;Commit complete.SQL> select current_scn from v$database;CURRENT_SCN-----------    1188094SQL> insert into test select * from test;1 row created.SQL> commit;Commit complete.SQL> insert into test1 select * from test1;1 row created.SQL> commit;Commit complete.SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area  267227136 bytesFixed Size                  2227504 bytesVariable Size             192938704 bytesDatabase Buffers           67108864 bytesRedo Buffers                4952064 bytesDatabase mounted.SQL> flashback database to scn  2   1188094;flashback database to scn*ERROR at line 1:ORA-38753: Cannot flashback data file 4; no flashback log data.ORA-01110: data file 4: '/u01/app/oraele/oradata/orcl/users01.dbf'SQL> alter tablespace users offline;alter tablespace users offline*ERROR at line 1:ORA-01109: database not openSQL> alter tablespace users read only;alter tablespace users read only*ERROR at line 1:ORA-01109: database not openSQL> alter database open;Database altered.SQL> alter tablespace users offline;Tablespace altered.SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area  267227136 bytesFixed Size                  2227504 bytesVariable Size             192938704 bytesDatabase Buffers           67108864 bytesRedo Buffers                4952064 bytesDatabase mounted.SQL> flashback database to scn 1188094;Flashback complete.SQL> alter database open resetlogs;Database altered.SQL> alter tablespace users online;alter tablespace users online*ERROR at line 1:ORA-01190: control file or data file 4 is from before the last RESETLOGSORA-01110: data file 4: '/u01/app/oraele/oradata/orcl/users01.dbf'

flashback off的表空间在闪回数据库之前要offline(不参与闪回),所有数据文件scn不一致前不能打开数据库。
联机前要对offline的数据文件做部分还原和不完全恢复,但相对也能节省时间



                                             
1 0
原创粉丝点击