--=====================================

-- Oracle 闪回特性(FLASHBACK DATABASE)

--=====================================

闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回、表级别闪回、事务

级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询。闪回恢复将修改数据,闪回点之后的数据将全部丢失。而闪回查询则可

以查询数据被DML的不同版本,也可以在此基础之上确定是否进行恢复等。本文主要描述flashback database的使用。

一、flashback database特性

flashback data1base闪回到过去的某一时刻

闪回点之后的工作全部丢失

使用resetlogs创建新的场景并打开数据库(一旦resetlogs之后,将不能再flashback至resetlogs之前的时间点)

常用的场景:truncate table、多表发生意外错误等

使用闪回日志来实现数据库闪回,闪回点之后的数据将丢失

二、flashback database的组成

闪回缓冲区:当启用flashback database,则sga中会开辟一块新区域作为闪回缓冲区,大小由系统分配

启用新的rvwr进程:rvwr进程将闪回缓冲区的内容写入到闪回日志中,注意闪回日志不同于联机重做日志,闪回日志在联机重做日志基础之

上生成,是完整数据块映像的日志。联机日志则是变化的日志。闪回日志不能复用,也不能归档。闪回日志使用循环写方式。

三、flashback database的配置

flashback database要求数据库必须处于归档模式,且闪回之后必须使用resetlogs打开数据库

a.查看数据库的归档模式及闪回是否启用

SQL>  select log_mode,open_mode,flashback_on from v$database;

LOG_MODE     OPEN_MODE  FLASHBACK_ON

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

ARCHIVELOG   READ WRITE NO             --FLASHBACK_ON为NO,则表示闪回特性尚未启用

b.查看及设置闪回目录、闪回目录空间大小等

--下面查看恢复目录及恢复目路分配的大小

--可以使用alter system set db_recovery_file_dest 来设置新路径

--可以使用alter system set db_recovery_file_dest_size来设定新的大小

SQL> show parameter db_recovery

NAME                                 TYPE        VALUE

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

db_recovery_file_dest                string      /u01/app/oracle/flash_recovery

_area

db_recovery_file_dest_size           big integer 2G

c.设置闪回保留目标生存期

SQL> show parameter db_flashback      --缺省为分钟,即小时

NAME                                 TYPE        VALUE

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

db_flashback_retention_target        integer     1440

SQL> alter system set db_flashback_retention_target=30; --设定保留时间为半小时

d.在mount状态下来启用flashback,如在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.

--一致性关闭数据库后,在mount状态下设置flashback

SQL>startup mount exclusive;

SQL> select status from v$instance;

STATUS

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

MOUNTED

SQL> alter database flashback on;     --开启闪回数据库功能

SQL> ho ps -ef | grep rvw             --可以看到新增了后台进程rvwr

oracle    3563     1  0 12:12 ?        00:00:00 ora_rvwr_orcl

--下面查看闪回区分配的大小为大约M,闪回分钟以内的数据则需要M左右的空间

--注意列oldest_flashback_time说明了允许返回的最早的时间点

SQL> select oldest_flashback_scn old_flhbck_scn,oldest_flashback_time old_flhbck_tim,

2  retention_target rete_trgt,flashback_size/1024/1024 flhbck_siz,

3  estimated_flashback_size/1024/1024 est_flhbck_size

4  from v$flashback_database_log;

OLD_FLHBCK_SCN OLD_FLHBC  RETE_TRGT FLHBCK_SIZ EST_FLHBCK_SIZE

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

915137 24-OCT-10         30     7.8125      11.2519531

SQL> select * from v$flashback_database_stat;   --查看闪回

BEGIN_TIM END_TIME  FLASHBACK_DATA    DB_DATA  REDO_DATA ESTIMATED_FLASHBACK_SIZE

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

24-OCT-10 24-OCT-10        7905280   86802432   96329728                        0

SQL> select * from v$sgastat where name like 'flashback%';       --查看sga中分配的闪回空间大小

POOL         NAME                            BYTES

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

shared pool  flashback generation buff     3981204

shared pool  flashback_marker_cache_si        9196

SQL> ho ls -hlt $ORACLE_BASE/flash_recovery_area/ORCL/flashback  --查看生成的闪回日志

total 7.9M

-rw-r----- 1 oracle oinstall 7.9M Oct 24 12:37 o1_mf_6d7dkogw_.flb

四、使用flashback database闪回数据库

步骤(前提归档日志可用)

关闭数据库

启动数据库到mount状态(exclusive模式)

闪回至某个时间点,SCN或log sequence number

使用resetlogs打开数据库

1.使用sqlplus实现闪回

可以接受一个时间标记或一个系统改变号实参

sqlplus几种常用的闪回数据库方法

FLASHBACK [STANDBY] DATABASE [<database_name>]  TO [BEFORE] SCN <system_change_number>   --基于SCN闪回

FLASHBACK [STANDBY] DATABASE [<database_name>]  TO [BEFORE] TIMESTMP <system_timestamp_value>--基于时间戳闪回

FLASHBACK [STANDBY] DATABASE [<database_name>]  TO [BEFORE] RESTORE POINT <restore_point_name>--基于时点闪回

如下面的示例:

SQL> flashback database to timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss');

SQL> flashback database to scn 918987;

SQL> flashback database ro restore point b1_load;

a.基于时间戳闪回

SQL> select count(1) from usr1.tb1;   --查询用户usr1下表tb1中的记录数

COUNT(1)

----------

404944

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual;  --获得系统当前的时间

TM

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

2010-10-24 13:04:30

SQL> drop user usr1 cascade;     --删除帐户usr1,同时帐户usr1下的所有对象将被删除

SQL> conn scott/tiger;           --使用scott 帐户登陆

SQL> create table tb_emp as select * from emp;  --新创建表tb_emp

SQL> shutdown immediate;        --关系系统

SQL> startup mount ;             --重新到mount状态

SQL> flashback database to timestamp  --实施闪回

2  to_timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss') ;

SQL> alter database open resetlogs;

SQL> select count(1) from usr1.tb1;    --帐户usr1及其对象tb1被成功闪回

COUNT(1)

----------

404944

SQL> select count(1) from scott.tb_emp;   --闪回成功后,在闪回点之后修改的数据全部丢失

select count(1) from scott.tb_emp

*

ERROR at line 1:

ORA-00942: table or view does not exist

b.基于SCN号闪回

SQL> select current_scn from v$database;   --获得当前的SCN号

CURRENT_SCN

-----------

918987

SQL> drop table usr1.tb1;   --删除用户usr1下的表tb1

SQL> alter system checkpoint;    --手动执行检查点

SQL>  select file#,checkpoint_change# from v$datafile;

FILE# CHECKPOINT_CHANGE#

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

5             921478

SQL> shutdown abort;

SQL> startup mount;

SQL> flashback database to scn 918987;

SQL> select count(1) from usr1.tb1;

COUNT(1)

----------

404944

c.基于时点闪回

SQL> create table t(id int,col varchar2(20));   --创建表t

SQL> insert into t values(1,'ABC');

SQL> insert into t values(2,'DEF');

SQL> commit;

SQL> create restore point bef_damage;    --创建闪回点

SQL> insert into t values(3,'GHI');

SQL> select ora_rowscn,id,col from t;   --查看表t的记录

ORA_ROWSCN         ID COL

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

1874406          1 ABC

1874406          2 DEF

1874406          3 GHI

SQL> shutdown immediate;

SQL> startup mount exclusive;

SQL> flashback database to restore point bef_damage;  --实施时点闪回

SQL> alter database open resetlogs;

SQL> select * from t;   --闪回成功后,闪回点之后的数据丢失

ID COL

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

1 ABC

2 DEF

2.使用RMAN进行flashback database

使用RMAN进行闪回数据库的几种常用办法

RMAN> flashback database to scn=918987;

RMAN> flashback database to sequence=85  thread=1;

SQL> create table scott.tb_emp as select * from scott.emp;

SQL> select count(1) from scott.tb_emp;

COUNT(1)

----------

14

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual;

TM

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

2010-10-24 13:59:38

SQL> drop table scott.tb_emp;

SQL> shutdown abort;

SQL> startup mount;

RMAN>  flashback database

2> to time="to_date('2010-10-24 13:59:00','yyyy-mm-dd hh24:mi:ss')";

SQL> select count(1) from scott.tb_emp;

COUNT(1)

----------

14

查询视图:v$recovery_file_dest将显示闪回区的使用情况

SQL> select name,space_limit/1024/1024 sp_limt

2   ,space_used/1024/1024 sp_usd,space_reclaimable/1024/1024 sp_recl,

3  number_of_files num_fils from v$recovery_file_dest;

NAME                                             SP_LIMT     SP_USD    SP_RECL   NUM_FILS

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

/u01/app/oracle/flash_recovery_area                 2048 472.070313 380.671875         18

可以将某些表空间排除在闪回之外

SQL> alter tablespace users flashback off;

SQL> select name,flashback_on from v$tablespace where ts#=4;

NAME            FLA

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

USERS           NO

如果需要对上述表空间启用闪回功能,则需要在mount模式下对该表空间进行开启该功能。

五、总结

闪回策略是针对Oracle撤销功能的增强,为快速恢复数据库提供了更多的便利。数据库的闪回恢复的速度要快于RMAN以及基于用户管理的备份与恢复,其主要原因是因为数据库闪回使用的是闪回日志,而闪回日志中保存的是数据块的完整镜像。其次闪回能够恢复的程度取决于闪回空间的大小以及闪回的保留策略,闪回空间大小会被循环使用,而闪回的保留策略则决定了闪回日志保留的时间长度。总之,合理的平衡恢复速度与可用空间依赖于具体服务要求。

六、更多参考

有关基于用户管理的备份和备份恢复的概念请参考:

Oracle 冷备份

Oracle 热备份

Oracle 备份恢复概念

Oracle 实例恢复

Oracle 基于用户管理恢复的处理(详细描述了介质恢复及其处理)

有关RMAN的恢复与管理请参考:

RMAN 概述及其体系结构

RMAN 配置、监控与管理

RMAN 备份详解

RMAN 还原与恢复

有关Oracle体系结构请参考:

Oracle 实例和Oracle数据库(Oracle体系结构)

Oracle 表空间与数据文件

Oracle 密码文件

Oracle 参数文件

Oracle 数据库实例启动关闭过程

Oracle 联机重做日志文件(ONLINE LOG FILE)

Oracle 控制文件(CONTROLFILE)

Oracle 归档日志

Oracle 闪回特性(FLASHBACK DATABASE)的更多相关文章

  1. Oracle 闪回归档(Flashback Database)

    cmd --管理员身份打开 sqlplus / as sysdba --管理数据库 shu immediate; --独占方式开始 startup mount --修改日期模式 alter datab ...

  2. 6. Oracle闪回特性

    Oracle 闪回 (flashback)是9i版本提供的新特性.这一特性:其他数据库(PostgreSQL,Mysql)是羡慕不已.对数据恢复提供非常便捷的方式.闪回技术通常用于快速简单恢复数据库中 ...

  3. oracle闪回(flashback)的部分实用操作(彻底删除的除外)

    一.数据delete并且commit提交之后的闪回 (一):根据时间来恢复:1.查询数据库当前时间(目的是为了检查数据库时间是否与你电脑时间相近,避免时间不同而将数据恢复到错误时间点)select  ...

  4. Oracle闪回技术(Flashback)

    闪回技术有闪回表.闪回删除.闪回查询.闪回事务查询.闪回事务.闪回数据库.闪回数据归档.其中,闪回查询.闪回事务查询用来“观察”过去:闪回数据归档并不是一个独立的功能,其功能是扩展闪回查询的时间窗口: ...

  5. Oracle闪回(FlashBack)数据库

    Flashback Database功能非常类似与RMAN的不完全恢复,它可以把整个数据库回退到过去的某个时点的状态,这个功能依赖于Flashback log日志.比RMAN更快速和高效,因此Flas ...

  6. Oracle 闪回归档(Flashback Data Archive)

    --检查权限 SELECT * FROM dba_sys_privs WHERE privilege LIKE '%FLASH%'; --设置权限 GRANT dba TO testuser;--设置 ...

  7. Oracle 闪回

    Oracle 闪回特性(FLASHBACK DATABASE) 本文来源于:gerainly 的<Oracle 闪回特性(FLASHBACK DATABASE) > -========== ...

  8. Oracle闪回flashback

    参考资料:Using Oracle Flashback Technology Oracle 11g的新特性闪回操作 闪回查询 闪回查询 闪回版本查询 闪回事务查询 闪回数据 闪回表 闪回删除 闪回数据 ...

  9. Oracle 闪回总结

    一.闪回查询(Flashback Query)1.闪回查询技术1.1 闪回查询机制    闪回查询是指利用数据库回滚段存放的信息查看指定表中过去某个时间点的数据信息,或过去某个时间段数据的变化情况,或 ...

随机推荐

  1. ZendStudio中设置SVN:ignore

    使用ZendStudio开发SVN中的代码时,经常容易将 .project..settings..buildpath 这类的zend的工程文件提交上去,非常麻烦,有几种方法可以去掉这个麻烦. 1.在Z ...

  2. Codeforces Round #256 (Div. 2) Multiplication Table

    C题, #include<cstdio> #include<cstring> #include<algorithm> #define maxn 5005 using ...

  3. httpclient 人人网

    登录的站点是3g.renren.com 因为是手机人人, 页面比较简单 首先用HttpGet取出"http://3g.renren.com"的html代码, 是用Jsoup解析出登 ...

  4. DataGridView之行的展开与收缩

    很多数据都有父节点与子节点,我们希望单击父节点的时候可以展开父节点下的子节点数据. 比如一个医院科室表,有父科室与子科室,点击父科室后,在父科室下面可以展现该科室下的所有子科室. 我们来说一下在Dat ...

  5. 主题:PageRank解释

    转自:http://www.iteye.com/topic/95079 PageRank解释 通过对由超过 50,000 万个变量和 20 亿个词汇组成的方程进行计算,PageRank 能够对网页的重 ...

  6. POJ 1731

    #include<iostream> #include<string> #include<algorithm> using namespace std; int m ...

  7. POJ2965The Pilots Brothers' refrigerator

    http://poj.org/problem?id=2965 这个题的话,一开始也不会做,旁边的人说用BFS,后来去网上看了众大神的思路,瞬间觉得用BFS挺简单易:因为要让一个“+”变为“-”,只要将 ...

  8. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】02-准备

    在上一讲中,介绍了什么是iOS开发.说简单一点,iOS开发,就是开发运行在iPhone或者iPad上的软件.这么一说完,应该有很多人就会产生一些疑惑,比如学习iOS开发是不是一定要买iPhone?需不 ...

  9. 安装eclipse for JavaEE 后的一些设置

    以下的设置是相对于一个workspace而设置的,如果更换了workspace则要重新设置. 1. 设置Text Editors: 2. 设置Content Assist 的快捷键(比较方便) 3. ...

  10. CSDN代码片排版

    CSDN上发博文,尤其是有代码的,要用好“插入代码”功能(见下图).这是必须的,未来的IT程序员,需要用这种方式,展示出自己的代码.这是尊重读者,树立品牌的需要. 相关方法,参考见视频<发布第一 ...