PLSQL_闪回操作6_Flashback Database

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 2014-12-09 Created By BaoXinjian 一、Flashback Database Flashback 技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数。

2014-12-09 Created By BaoXinjian

一、Flashback Database


Flashback 技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数。要使用flashback 的特性,必须启用自动撤销管理表空间。

1. 在Oracle 10g中, Flash back家族分为以下成员:

  • Flashback Database;
  • Flashback Drop;
  • Flashback Query(分Flashback Query,Flashback Version Query,Flashback Transaction Query 三种);
  • Flashback Table;

2. Flashback Database 功能非常类似与RMAN的不完全恢复, 它可以把整个数据库回退到过去的某个时点的状态, 这个功能依赖于Flashback log 日志。

   比RMAN更快速和高效。 因此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 技术不完全恢复块的原因。

[oracle@dba ~]$ ps -ef|grep rvw
oracle   12620 12589  0 13:21 pts/1    00:00:00 grep rvw 

 

三、Flashback Database 启用方式


数据库的Flashback Database功能缺省是关闭的,要想启用这个功能,就需要做如下配置。

1. 配置Flash Recovery Area

要想使用Flashback Database, 必须使用Flash Recovery Area,因为Flashback Database Log只能保存在这里。 要配置的2个参数如下,一个是大小,一个是位置。

如果数据库是RAC,flash recovery area 必须位于共享存储中。数据库必须处于archivelog 模式.

(1). 启用Flash Recovery Area:

SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G SCOPE=BOTH;
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/DBA/FB' SCOPE=BOTH; 

(2). 禁用Flash Recovery Area:

SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='' ; 

(3). 总结

对于Flash Recovery Area,Oracle 是这样建议的,flash recovery area 设置的越大,flashback database 的恢复能力就越强,因此建议flash recovery area 能够放的下所有的数据文件,增量备份,以及所有尚未备份的归档文件,当然还有它自己产生的flashback logs。

在数据库运行过程中,oracle 自动向该区域写入文件,当剩余空间不足15%的时候,它就会在alert 中增加警告,提示你空间不足。但此时不会影响数据库的正常运转,直到所有空间统统被用掉之后,oracle 首先尝试删除寻些过期的文件,冗余文件或备份过的文件,如果这些做完了,还是没有空闲空间的话,数据库就被hang 住了。

(4).对于因Flash Recovery Area导致的数据库hang的处理,请参考:

http://blog.csdn.net/tianlesoftware/archive/2009/10/14/4668991.aspx

或者

http://user.qzone.qq.com/251097186/blog/1244650673

 

2. 启用数据库Flashback 功能

Step1. 数据库启动到mount状态

SQL> startup mount; 

Step2. 检查Flashback 功能, 缺省时功能是关闭的。

SQL> select name, current_scn, flashback_on from v$database;
NAME    CURRENT_SCN  FLASHBACK_ON
--------    -----------          ------------------
DBA      945715          NO

Step3. 启动Flashback功能

SQL>  alter database flashback on;
数据库已更改。 
SQL>  select name, current_scn, flashback_on from v$database;
NAME      CURRENT_SCN FLASHBACK_ON
--------- ----------- ------------------
DBA                 0 YES

Step4. 设置初始化参数: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%。

Step5. 启动数据库

SQL>alter database open; 

 

四、Flashback Database 操作示例


做操作前先备份数据库 RMAN> backup database;

Step1. 检查是否启动了flash recovery area:­

SQL> show parameter db_recovery_file
NAME                    TYPE        VALUE
------------------------------------  ----------- ------------------------------
db_recovery_file_dest       tring       D:\oracle/flash_recovery_area
db_recovery_file_dest_size  big integer 1G 

Step2. 检查是否启用了归档­

SQL> archive log list;
数据库日志模式      存档模式
自动存档            启用
存档终点            USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列  9
下一个存档日志序列  11
当前日志序列        11 

Step3. 检查是否启用了flashback database  

SQL> select flashback_on from v$database;
FLASHBACK_ON      
------------------  
YES               

Step4. 查询当前的scn­

SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
947921 

Step5. 查询当前的时间

SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;
TIME
-----------------
09-10-14 14:37:05 

Step6. 删除表A

SQL> select * from A;
ID  NAME
---------- ----------
1  tianle
2  dave

SQL> drop table A;
表已删除。

SQL> commit; 

Step7. Flashback Database 实际是对数据库的一个不完全恢复操作,因为需要关闭数据库重启到mount状态。

SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area  209715200 bytes
Fixed Size                  1248116 bytes
Variable Size              79692940 bytes
Database Buffers          121634816 bytes
Redo Buffers                7139328 bytes
数据库装载完毕。 

Step8. 执行恢复:分timestamp 或者SCN两种

SQL> Flashback database to timestamp to_timestamp('09-10-14 14:37:05','yy-mm-dd hh24:mi:ss');
闪回完成。
或者:

SQL> Flashback database to scn 947921;
闪回完成。 

Step9. 打开数据库:

在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:

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

(2). 先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,

再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,

然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。

(3). 这里演示,就以resetlogs方式打开:

SQL> alter database open resetlogs;
数据库已更改。
验证数据:

SQL> select * from A;
        ID NAME
---------- ----------
         1 tianle
         2 dave

 

五、Flashback Database 相关的2个视图


1. 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: 根据策略对需要的空间大小的估计值
SQL> select oldest_flashback_scn os, to_char(oldest_flashback_time,'yy-mm-dd hh24:mi:ss') ot, retention_target rt,flashback_size fs, estimated_flashback_size es
      from v$flashback_database_log;

OS       OT             RT      FS        ES
----------  -----------------     ----------  ----------    ----------
946088  09-10-14 13:49:59  1440     16384000  350920704 

 

3. V$flashback_database_stat

这个视图用来对Flashback log 空间情况进行更细粒度的记录和估计。

这个视图以小时为单位记录单位时间内数据库的活动量,

  • Flashback_Data 代表Flashback log产生数量
  • DB_Date 代表数据改变数量
  • Redo_Date代表日志数量

通过这3个数量可以反映出数据的活动特点,更准确的预计Flash Recovery Area的空间需求

SQL> alter session set nls_date_format='hh24:mi:ss';
会话已更改。

SQL> select *from v$flashback_database_stat;
BEGIN_TI END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
-------- -------- -------------- ---------- ---------- ------------------------
14:43:10 15:15:28        6455296   29310976    3898368              0 

 

Thanks and Regards

参考: http://www.cnblogs.com/coohoo/archive/2011/01/16/1936888.html

ERP技术讨论群: 288307890
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建
相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
相关文章
|
SQL 存储 安全
在 Go 中如何使用 database/sql 来操作数据库
在 Go 中如何使用 database/sql 来操作数据库
201 0
如何使用ABAP code inspector找出所有在LOOP里访问database的操作
如何使用ABAP code inspector找出所有在LOOP里访问database的操作
151 0
|
数据库 内存技术 关系型数据库
|
SQL Oracle 关系型数据库