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
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的数据文件做部分还原和不完全恢复,但相对也能节省时间
- ORACLE FLASHBACK DATABASE 总结
- Oracle Flashback技术总结(一)—— Flashback Database
- Oracle Flashback之Flashback database
- Oracle Flashback之flashback database
- oracle flashback database
- oracle flashback database
- oracle dg flashback database
- Oracle Flashback技术之Flashback Database
- ORACLE FLASHBACK DATABASE 知识整理
- Oracle Flashback 技术 总结
- Oracle Flashback 技术总结
- Oracle Flashback 技术总结
- Oracle Flashback 技术总结
- Oracle Flashback 技术 总结
- Oracle Flashback 技术 总结
- Oracle Flashback 技术总结
- Oracle Flashback技术总结
- Oracle Flashback 技术 总结
- 可下拉的PinnedHeaderExpandableListView的实现
- break,continue,return
- UIScrollViewDelegate以及如何判断滚到底部
- 数据科学20:文本挖掘2
- R语言学习笔记一
- ORACLE FLASHBACK DATABASE 总结
- Windows10 自带壁纸
- poj3252--Round Numbers
- Linux命令小结
- 253 - Cube painting
- 使用注解方式进行spring和hibernate整合
- ad系统full gc触发
- spring mvc 自己编写异常
- JAVA灰度化、二值化图片如此简单方便