首页 > 代码库 > ORACLE FLASHBACK DATABASE 总结
ORACLE FLASHBACK DATABASE 总结
闪回数据库(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_recovery NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_recovery_file_dest string /u01/app/oraele/fast_recovery_ area db_recovery_file_dest_size big integer 4122M SQL> show parameter flashback NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_flashback_retention_target integer 1440
SQL> archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 5 Next log sequence to archive 7 Current 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 Production PL/SQL Release 11.2.0.3.0 - Production CORE 11.2.0.3.0 Production TNS for Linux: Version 11.2.0.3.0 - Production NLSRTL Version 11.2.0.3.0 - Production SQL> 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 - 64bi PL/SQL Release 10.2.0.5.0 - Production CORE 10.2.0.5.0 Production TNS for Linux: Version 10.2.0.5.0 - Production NLSRTL Version 10.2.0.5.0 - Production SQL> select flashback_on from v$database; FLASHBACK_ON ------------------ NO SQL> select status from v$instance; STATUS ------------ OPEN 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> 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 immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 267227136 bytes Fixed Size 2227504 bytes Variable Size 192938704 bytes Database Buffers 67108864 bytes Redo Buffers 4952064 bytes Database mounted. SQL> flashback database to scn 1121575; Flashback complete. SQL> alter database open read only; Database altered. SQL> select * from test; no rows selected SQL> startup mount force ORACLE instance started. Total System Global Area 267227136 bytes Fixed Size 2227504 bytes Variable Size 192938704 bytes Database Buffers 67108864 bytes Redo Buffers 4952064 bytes Database mounted. SQL> SQL> SQL> SQL> SQL> SQL> shutdown immediate ORA-01109: database not open Database dismounted. ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 267227136 bytes Fixed Size 2227504 bytes Variable Size 192938704 bytes Database Buffers 67108864 bytes Redo Buffers 4952064 bytes Database 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 only SQL> alter database open read only; Database altered. SQL> select * from test; ID SCN ---------- -------------------- 0 1121575 SQL> startup mount force ORACLE instance started. Total System Global Area 267227136 bytes Fixed Size 2227504 bytes Variable Size 192938704 bytes Database Buffers 67108864 bytes Redo Buffers 4952064 bytes Database mounted. SQL> alter database open resetlog; alter database open resetlog * ERROR at line 1: ORA-02288: invalid OPEN mode SQL> 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 sysdba SQL*Plus: Release 11.2.0.3.0 Production on Tue Jan 27 09:13:12 2015 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> recover database using backup controlfile; ORA-00279: change 1138457 generated at 01/26/2015 16:10:27 needed for thread 1 ORA-00289: suggestion : /u01/app/oraele/fast_recovery_area/ORCL/archivelog/2015_01_27/o1_mf_1_1_%u_.arc ORA-00280: change 1138457 for thread 1 is in sequence #1 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} /u01/app/oraele/oradata/orcl/redo01.log Log applied. Media recovery complete. SQL> alter database open resetlogs; Database altered. SQL> select * from test; ID SCN ---------- -------------------- 0 1121575 1 1126681 2 1138419 3 1150711 SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 267227136 bytes Fixed Size 2227504 bytes Variable Size 192938704 bytes Database Buffers 67108864 bytes Redo Buffers 4952064 bytes Database 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 NUMBER SQL> 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 identifier SQL> c/oldd/old 1* select oldest_flashback_scn from v$flashback_database_log SQL> / OLDEST_FLASHBACK_SCN -------------------- 1150901 SQL>
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 ----------- 1188094 SQL> 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 immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 267227136 bytes Fixed Size 2227504 bytes Variable Size 192938704 bytes Database Buffers 67108864 bytes Redo Buffers 4952064 bytes Database 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 open SQL> alter tablespace users read only; alter tablespace users read only * ERROR at line 1: ORA-01109: database not open SQL> alter database open; Database altered. SQL> alter tablespace users offline; Tablespace altered. SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 267227136 bytes Fixed Size 2227504 bytes Variable Size 192938704 bytes Database Buffers 67108864 bytes Redo Buffers 4952064 bytes Database 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 RESETLOGS ORA-01110: data file 4: '/u01/app/oraele/oradata/orcl/users01.dbf'
flashback off的表空间在闪回数据库之前要offline(不参与闪回),所有数据文件scn不一致前不能打开数据库。
联机前要对offline的数据文件做部分还原和不完全恢复,但相对也能节省时间
ORACLE FLASHBACK DATABASE 总结