ITPub博客

首页 > 数据库 > Oracle > 利用闪回拯救我们的数据(五)

利用闪回拯救我们的数据(五)

原创 Oracle 作者:realkid4 时间:2014-05-05 12:01:18 16777215 删除 编辑

 

Oracle数据库的闪回技术Flashback是作为传统备份还原的一种补充被退出。在传统的数据库领域,一旦发生数据损坏,无论是用户操作失误,还是系统软硬件故障,启用之前进行的备份进行还原动作,是通常的做法。依据不同的备份策略,还原后的数据有是否丢失、丢失多少的问题。

Flashback的特点是恢复速度快、影响面小,对资源消耗情况比传统的备份还原手段要低得多。如果发生单独数据表数据丢失、事务操作失误的情况,单独使用flashback query和transaction就可以快速进行恢复,而且不会影响其他人使用数据库。而且,Flashback将恢复的粒度从传统备份中的“数据库全库-表空间-文件-数据块”的层面,拓展到“schema-数据表-数据行-事务”的细粒度。

从技术本身看,Flashback并不是一套全新的技术体系,不同的Flashback特性依据的是不同的技术基础。比如,flashback query等就是依赖Undo前镜像检索到特定时间数据。Flashback Drop则是利用segment recyclebin的特性进行转储行为。而Flashback Database则是利用flashback log进行的数据还原。

本篇主要介绍Flashback Database的配置使用。在目前的各种Flashback中,Flashback Database是和其他技术兼容应用比较广泛的一种。在很多场合下,它是可以实现定点数据恢复的。

 

1、环境介绍

 

笔者使用数据库版本为11gR2,具体版本为11.2.0.4。

 

SQL> select * from v$version;

 

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Production

PL/SQL Release 11.2.0.4.0 - Production

CORE    11.2.0.4.0      Production

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

 

当前数据库处在归档模式下,Recovery Area启用。

 

SQL> archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     33

Next log sequence to archive   35

Current log sequence           35

 

Recovery Area留足足够空间。

 

SQL> show parameter recovery;

 

NAME                                 TYPE        VALUE

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

db_recovery_file_dest                string      /u01/app/fast_recovery_area

db_recovery_file_dest_size           big integer 10000M

recovery_parallelism                 integer     0

 

2、Flashback Database配置

 

默认情况下,flashback database是没有启动的。需要一次完全关闭数据库,并且切换到mount状态下。

 

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

 

Total System Global Area  372449280 bytes

Fixed Size                  1364732 bytes

Variable Size             318770436 bytes

Database Buffers           46137344 bytes

Redo Buffers                6176768 bytes

Database mounted.

 

启动flashback模式。

 

SQL> alter database flashback on;

Database altered.

 

SQL> alter database open;

Database altered.

 

SQL> select flashback_on from v$database;

 

FLASHBACK_ON

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

YES

 

视图v$database中的flashback_on字段,可以标识是否开启闪回数据库功能。另一个标志就是后台进行RVWR,一旦开启闪回功能,后台会自动启动进行进行Flashback Log管理收集。

 

[oracle@SimpleLinux ~]$ ps -ef | grep rvwr

oracle    5725     1  0 13:28 ?        00:00:00 ora_rvwr_ora11g

oracle    5776  1589  1 13:31 pts/0    00:00:00 grep rvwr

 

3、Flashback状态观察

 

flashback database是基于数据库对于flashback log的收集进行的。默认情况下,flashback log是保存在recovery area中的。

 

SQL> select * from v$flash_recovery_area_usage;

 

FILE_TYPE            PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES

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

CONTROL FILE                       0.09                         0               1

REDO LOG                            1.5                         0               3

ARCHIVED LOG                          0                         0               1

BACKUP PIECE                      10.86                         0               4

IMAGE COPY                            0                         0               0

FLASHBACK LOG                         1                         0               2

FOREIGN ARCHIVED LOG                  0                         0               0

 

和常见的归档模式备份还原策略不同,flashback database是针对短时间恢复技术而言的。数据库中存在参数,用于设置恢复时间段。

 

SQL> show parameter flashback;

 

NAME                                 TYPE        VALUE

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

db_flashback_retention_target        integer     1440

 

注意:这个参数默认为1440,单位是分钟。也就是说,开启flashback database的情况下,要求保留1440分钟,也就是24小时的备份。视图v$flashback_database_log中,可以查看到能够恢复到的最早时间。

 

SQL> select OLDEST_FLASHBACK_SCN, to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24:mi:ss') oldest_time, FLASHBACK_SIZE from v$flashback_database_log;

 

OLDEST_FLASHBACK_SCN OLDEST_TIME         FLASHBACK_SIZE

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

             1093695 2014-04-28 13:28:43      104857600

 

当前时间:

 

 

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

 

GET_SYSTEM_CHANGE_NUMBER TO_CHAR(SYSDATE,'YYYY-MM-DDHH2

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

                 1140051 2014-04-28 14:22:57

 

查看flashback log日志文件情况:

 

SQL> select * from v$flashback_database_logfile;

 

NAME                                                                     LOG#    THREAD#  SEQUENCE#      BYTES FIRST_CHANGE# FIRST_TIME  TYPE

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

/u01/app/fast_recovery_area/ORA11G/flashback/o1_mf_9ovsr9ty_.flb            1          1          1   52428800       1093747 28-四月-14  NORMAL

/u01/app/fast_recovery_area/ORA11G/flashback/o1_mf_9ovsrd5y_.flb            2          1          1   52428800             0             RESERVED

 

这里需要讨论两个问题,一个是对于参数db_flashback_retention_target的理解,另一个是对于flashback log大小的估算。

 

db_flashback_retention_target设置的是一个保存日志的最大时间段。应该说,它是一种“理想值”,和undo_retention相同。我们虽然设置了时间值,但是不同的数据库负载,redo log生成数量不同,对于flashback log保留需要的资源量就不同。设想一种情况,如果由于存储原因,Oracle不能保留参数时间段对应的所有日志,flashback database也是不能恢复到指定时间点的。所以,参数db_flashback_retention_target只是一个期望值,真正能否恢复到什么时间点,还需要查看视图v$flashback_database_log的最早恢复时间。

另一个是log大小的估算。单从recovery area的职责看,archive log、backup set和flashback log是三个比较消耗空间的项目。如果开启了flashback database功能,一定需要分配额外的存储给recovery area。大小估算要和每分钟生成redo log size相关,Oracle的经验公式是参考业务峰值的redo log size和保留时间进行估算。峰值redo size可以从Oracle AWR报告中找到。

 

4、恢复实验

 

下面进行flashback实验。当前存在schema名称为test,其中包括6个对象。

 

 

SQL> select count(*) from dba_objects where owner='TEST';

 

  COUNT(*)

----------

         6

 

模拟误删除test用户。

 

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

 

GET_SYSTEM_CHANGE_NUMBER TO_CHAR(SYSDATE,'YYYY-MM-DDHH2

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

                 1140051 2014-04-28 14:24:43

 

 

SQL> drop user test cascade;

User dropped

 

SQL> select count(*) from dba_objects where owner='TEST';

 

  COUNT(*)

----------

         0

 

启动到mount状态。

 

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

 

Total System Global Area  372449280 bytes

Fixed Size                  1364732 bytes

Variable Size             301993220 bytes

Database Buffers           62914560 bytes

Redo Buffers                6176768 bytes

Database mounted.

 

执行恢复操作。

 

SQL> select OLDEST_FLASHBACK_SCN, to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24:mi:ss') oldest_time, FLASHBACK_SIZE from v$flashback_database_log;

 

OLDEST_FLASHBACK_SCN OLDEST_TIME         FLASHBACK_SIZE

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

             1093695 2014-04-28 13:28:43      104857600

 

 

SQL> flashback database to scn 1140051;

Flashback complete.

 

flashback的方式支持三种,scn、timestamp和log sequence。其中SCN和timestamp比较方便。

执行成功后,open resetlogs启动数据库。

 

 

--Open Reset

SQL> alter database open resetlogs;

Database altered.

 

启动数据库后,test数据恢复。

 

SQL> select group#, sequence#, status from v$log;

 

    GROUP#  SEQUENCE# STATUS

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

         1          1 CURRENT

         2          0 UNUSED

         3          0 UNUSED

 

 

SQL> select count(*) from dba_objects where owner='TEST';

 

  COUNT(*)

----------

         6

 

实验成功。

 

5、结论

 

flashback database是一种很方便的数据恢复技术,可以快速的进行数据恢复动作。相对于传统的备份还原,具有很大优势。使用过程中,应该注意:启用flashback会带来一定程度的性能损耗,在生产环境下使用应该进行仔细评估。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17203031/viewspace-1154074/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    8041224