ITPub博客

首页 > 数据库 > Oracle > Oracle闪回数据库

Oracle闪回数据库

原创 Oracle 作者:llnnmc 时间:2017-05-19 16:04:41 1 删除 编辑

闪回数据库就像给数据库增加了倒带按钮的功能,它将当前的数据库视为起点,然后在时间上顺序回退所有的工作,直到回退到设定的时间点。最终结果就好像执行了不完整恢复,位于闪回点之后的所有工作将丢失。

闪回数据库只能恢复用户逻辑错误,如果遇到物理损坏或介质丢失,如丢失数据文件,则闪回技术不适用,对此必须使用传统的备份还原和恢复技术。作为用户操作错误后替代不完整恢复的一种手段,闪回数据库往往是更加灵活快捷的方法,它影响的停机时间通常较短,并且容易使用。这样的例子包括误认为连接到测试库而删除了生产系统中的用户,重要的表被截断而不是删除时也可以考虑使用闪回数据库。

闪回数据库是多个进程和数据结构的组合。除了需要启用闪回日志外,还需要重做日志来完成闪回到一致的数据库版本,因此它需要数据库处于归档模式。另外闪回数据库需要在加载模式下进行,因此需要占用一定的停机时间。

1、闪回数据库体系结构

一旦启用了闪回数据库,修改的块的映像会不时的从数据库缓冲区缓存复制到SGA中一个新的存储区域,即闪回缓冲区。通过一个新的后台进程恢复写入器(Recovery Writer,RVWR)将闪回缓冲区刷新到磁盘闪回日志。与重做日志不同,闪回日志记录不是记录变化的日志,而是记录完整块映像的日志,并且不能多路复用和归档闪回日志,它们是系统自动创建和管理的。

对性能至关重要的一点是,系统并不是将所有变化复制到闪回缓冲区,而只是记录变化的一个子集。内部算法限制将哪些块的哪些版本放置在闪回缓冲区,以便限制填充闪回缓冲区以及写入磁盘的块的大小和频率。这些算法的初衷是在启用闪回数据库时确保不会对性能造成负面影响。

当执行数据库闪回时,Oracle将会读取闪回日志以提取每个改变的数据库块的版本,并将这些版本复制回数据文件。这样做的效果是通过反转DBWn进程执行的写入操作及时回退数据库。由于不是将每个变化的块的所有版本都复制到闪回缓冲区和随后的闪回日志中,因此不可能闪回到某个精确的时间点。一个块可能被修改多次,但是闪回日志只记录这些变化的一个子集。闪回操作将尽可能接近期望的时间(但不能晚于该时间)回退每个更改的块。因此,闪回数据库构造一个恰好在希望的时间点之前的数据文件版本。数据文件的这种版本可能完全不一致,不同的块将置于不同的系统变更号。要完成闪回过程,Oracle可以使用重做日志。它将把所有的块严格恢复到请求的时间,从而将所有数据文件同步到相同的SCN上。最后再回滚在那个时间点还未提交的任何事务。

因此,闪回数据库实际上是多个进程和数据结构的组合。归纳为以下几个步骤:
1)在SGA中分配一些内存(这是自动进行的,无法控制缓冲区的大小)并在磁盘上分配一些空间来存储闪回数据,同时启用RVWR进程来支持闪回日志记录。
2)当执行闪回时,Oracle会使用闪回日志将数据库及时回退到期望的时间之前的某个时间点。
3)按照不完整恢复中的常规方式应用重做日志,将数据文件前滚到希望的确切时间,并回滚那个时间点尚未提交的事务。
4)使用RESETLOGS选项打开数据库,创建数据库的一个新的化身。

由此看到,闪回数据库要求使用归档模式,因为如果归档日志数据流不可用,则无法将应用闪回日志得到的不一致的数据库版本转换到能够打开的一致的数据库版本。

与不完整恢复相比,不完整恢复总是耗时的,因为部分过程是完全还原。不完整恢复的时间在很大程度上与数据库的大小成正比。而数据库闪回所需的时间主要取决于需要撤销的更改的数据量,与数据库的总数据量相比,更改的数据量往往是很少的,因此闪回操作应该会快很多倍。另外,相比不完整恢复,闪回数据库也很容易使用。

2、配置闪回数据库

配置一个数据库启用闪回模式需要在加载模式下发出命令,因此是需要停机时间的。以下通过一个例子来演示配置过程。

1)确保数据库处于归档日志模式
select log_mode from v$database;

LOG_MODE
------------
ARCHIVELOG

2)创建闪回恢复区
闪回恢复区是存放闪回日志的场所,可以使用两个实例参数来设置闪回恢复区,一个是db_recovery_file_dest,用来指定闪回恢复区目录,另一个是db_recovery_file_dest_size,用来指定恢复区大小。
show parameter db_recovery_file_dest;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      c:\oracle\flash_recovery_area
db_recovery_file_dest_size           big integer 3912M

如果需要修改目标位置和大小
alter system set db_recovery_file_dest='e:\flash_recovery_area';
alter system set db_recovery_file_dest_size=4g;

show parameter db_recovery_file_dest;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      e:\flash_recovery_area
db_recovery_file_dest_size           big integer 4G

3)设置闪回日志保留目标时间
该时间通过实例参数db_flashback_retention_target来控制,单位分钟,默认值1440分钟,即1天。闪回日志空间以循环的方式重用,更新的数据将覆盖旧的数据。该参数指示Oracle在重写它之前保存闪回数据的分钟数,然而这只是一个目标时间,如果闪回恢复区的大小不足,则Oracle可能无法保持该目标。
show parameter db_flashback_retention_target;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     1440

以下将闪回日志保留时间改为12小时
alter system set db_flashback_retention_target=720;

show parameter db_flashback_retention_target;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     720

4)干净的关闭并加载数据库
shutdown immediate;
startup mount;

5)启用闪回日志记录
alter database flashback on;

这将启动RVWR进程并在SGA中分配闪回缓冲区。查询视图v$process可以看到该进程已启动
select pname, program from v$process where pname='RVWR';

PNAME PROGRAM
----- ----------------------------------------------------------------
RVWR  ORACLE.EXE (RVWR)

6)打开数据库
alter database open;

从现在起将会启用从数据库缓冲区缓存到闪回缓冲区的数据块映像日志记录功能。

7)如果是要更改闪回恢复区的位置,则按以下步骤执行
操作系统中创建好新的闪回恢复区目录
修改初始化参数
alter system set db_recovery_file_dest='d:\flash_recovery_area';
干净的关闭并加载数据库
shutdown immediate
startup mount
关闭并重开闪回
alter database flashback off;
alter database flashback on;
打开数据库
alter database open;

3、监视闪回数据库

闪回监视最基本的层次是确认启用了它,这可以通过查询视图v$database来确认
select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

查询视图v$process也可以看到闪回写进程已启动
select pname, program from v$process where pname='RVWR';

PNAME PROGRAM
----- ----------------------------------------------------------------
RVWR  ORACLE.EXE (RVWR)

为了监视当前的闪回能力并估计为满足目标时间闪回日志所需的空间,可以查询视图v$flashback_database_log。该查询显示由db_flashback_retention_target实例参数指定的保留目标时间的设定值(单位是分钟),默认值是1天,并显示闪回日志文件占用的实际空间大小、闪回日志可将数据库回退到的确切时间和SCN、预估的需要的闪回恢复区大小。
select * from v$flashback_database_log;

OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------------- ------------------- ---------------- -------------- ------------------------
            10214885 2017-01-25 22:33:32             1440       15941632                249102336

另一个视图v$flashback_database_stat提供了一个有关数据文件、联机重做日志文件和闪回日志文件占用磁盘I/O比例的历史视图。显示出了与正常数据库活动相比较的I/O量,体现了启用闪回数据库而付出的代价,计量单位是字节数。该视图每小时显示一行数据。
select * from v$flashback_database_stat;

BEGIN_TIME          END_TIME            FLASHBACK_DATA    DB_DATA  REDO_DATA ESTIMATED_FLASHBACK_SIZE
------------------- ------------------- -------------- ---------- ---------- ------------------------
2016-03-12 20:36:09 2016-03-12 21:17:23        6782976   10706944    3343872                        0
2016-03-12 19:36:06 2016-03-12 20:36:09        7913472   13164544    4203008                 52731904
2016-03-12 18:36:01 2016-03-12 19:36:06       22691840   30851072   18845184                 56094720
2016-03-12 17:35:57 2016-03-12 18:36:01        7897088   12869632    4201984                 49541120
2016-03-12 16:35:54 2016-03-12 17:35:57        7954432   13213696    4218368                 53751808
2016-03-12 15:35:46 2016-03-12 16:35:54        7159808   14540800    4313088                 60461056
2016-03-12 14:35:41 2016-03-12 15:35:46       29949952   36323328   25719808                 74510336
2016-03-12 13:19:18 2016-03-12 14:35:41       12419072   18210816    8408064                 39018496

闪回缓冲区的大小不受DBA的控制,要查看它当前的大小,可以查询视图v$sgastat
select * from v$sgastat where name = 'flashback generation buff';

POOL         NAME                                                    BYTES
------------ -------------------------------------------------- ----------
shared pool  flashback generation buff                            15937344

可以看到闪回缓冲区位于共享池当中。

虽然可以设定参数db_flashback_retention_target的闪回时间总目标,但并不保证一定可以闪回到那个时间点,因为闪回日志是由闪回恢复区管理的,而闪回恢复区是备份优先存储,如果因为需要放置备份而导致闪回恢复区空间不足,则Oracle会删除部分闪回日志以获取空间。因此需要注意闪回恢复区的空间使用情况,必要时增加闪回恢复区空间大小。

查看闪回恢复区空间使用信息
col name for a50
select * from v$recovery_file_dest;

NAME                                               SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------------------------------------- ----------- ---------- ----------------- ---------------
e:\flash_recovery_area                              4294967296   15941632                 0            1

查看闪回恢复区各类文件分布情况
select * from v$flash_recovery_area_usage;

FILE_TYPE            PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE                          0                         0               0
REDO LOG                              0                         0               0
ARCHIVED LOG                          0                         0               0
BACKUP PIECE                          0                         0               0
IMAGE COPY                            0                         0               0
FLASHBACK LOG                       .37                         0               1
FOREIGN ARCHIVED LOG                  0                         0               0

4、使用闪回数据库

闪回数据库的使用包括以下几个步骤:
1)关闭数据库
2)加载数据库
3)闪回到某个时间点、SCN或日志切换序列号
4)使用RESETLOGS打开数据库

只要拥有需要的所有归档日志,闪回操作将能够完全自动的运行。下面在已经配置好闪回数据库的MES库上进行闪回实验。

假定在2016-03-12 22:30一名开发人员不小心删除了MES数据库的RMES用户模式,从而将RMES用户的所有表全部删除了。这种错误常常发生在例如原本以为连接的是一个开发库或测试库,而实际上连接的是生产库。10分钟之后发现了错误,而该生产库又是一个业务量繁忙的数据库,必须尽快恢复。

首先就是关闭数据库
shutdown abort;

此时使用其它任何类型的关闭都是毫无意义的,无论怎样都会丢失正在进行的所有工作,而需要的是最小化停机时间,然后重启到加载模式
startup mount;

将数据库回退到22:30这个预估的时间点上,并用READ ONLY模式打开数据库
flashback database to timestamp to_timestamp('2016-03-12 22:30:00', 'yyyy-mm-dd hh24:mi:ss');
alter database open read only;

当在READ ONLY模式下时,可以针对删除的模式运行查询。如果发现用户模式仍可用,如查询表RMES.R_WIP_TRACKING_T发现表仍存在,那么或许能够恢复更多一些的用户数据。现在我们把恢复时间改到22:35,此时需要借助恢复命令来完成
shutdown abort;
startup mount;
recover database until time '2016-03-12 22:35:00';
alter database open read only;

重新运行查询,发现恢复5分钟的数据后,RMES用户模式又不见了,则它必定是在22:30~22:35之间删除的。因此可采用平分法则设定闪回到时间22:32:30
shutdown abort;
startup mount;
flashback database to timestamp to_timestamp('2016-03-12 22:32:30', 'yyyy-mm-dd hh24:mi:ss');
alter database open read only;

如果现在RMES用户模式还不可用,就再往前闪回一点时间。如果发现模式可用,就执行一点时间的恢复。可以重复执行闪回和恢复命令,直到找到希望的时间,在此期间通过在只读模式下运行查询来测试。最后我们确定将MES数据库恢复到的满意时间为22:32:00。

当找到满意的时间点后执行最后一次数据库关闭并使用RESETLOGS打开来创建数据库的一个新化身
shutdown abort;
startup mount;
alter database open resetlogs;

之后MES数据库就可以正常使用了。这种方法可以最小化数据损失,并且相对于不完整恢复,花费的停机时间是较短的。

在RMAN环境中,有三种闪回命令选择,闪回到某个时间点、SCN或日志切换序列号,如下例子
RMAN> flashback database to time = to_date('2016-03-12 22:30:00', 'yyyy-mm-dd hh24:mi:ss');
RMAN> flashback database to scn = 2728665;
RMAN> flashback database to sequence = 2123 thread = 1;

SQL*Plus的闪回语法可以接受时间戳或SCN参数,与RMAN不同的是,它不接受日期或日志切换序列号
SQL> flashback database to timestamp to_timestamp('2016-03-12 22:32:30', 'yyyy-mm-dd hh24:mi:ss');
SQL> flashback daatabase to scn 678854;

除了语法上的微小变化外,RMAN闪回与SQL*Plus闪回操作相同,都是采用重复应用闪回与恢复,直到找到打开数据库的最佳点。

采用Database Control的Web模式、RMAN模式或是SQL*Plus模式,它们之间还有一点区别是闪回粒度的不同。Database Control的基于时间的闪回粒度只能是分钟,而RMAN可以闪回到秒,SQL*Plus则可以闪回到时间戳---百万分之一秒。

5、限制生成的闪回数据量

Oracle用来限制写入到闪回日志中的数据量的算法是精心设计的,以便尽量减小对性能的影响。但有时可能还希望进一步降低它的影响。这可以对表空间是否加入闪回日志加以选择。将一些表空间排除在闪回日志记录之外将有助于提高联机性能,但付出的代价是必须执行属于恢复过程的部分还原。

默认情况下,如果启用了闪回数据库,那么会记录所有表空间的闪回数据,使用如下命令可关闭表空间的闪回属性
alter tablespace <tablespace_name> flashback off;

可以在任何时候执行上面的命令。而使用如下命令可开启表空间的闪回属性,但必须要求数据库处于加载模式时才能执行
alter tablespace <tablespace_name> flashback on;

为了查看表空间的闪回状态,v$tablespace视图中提供了这样一个列
select name, flashback_on from v$tablespace;

NAME                           FLA
------------------------------ ---
SYSTEM                         YES
SYSAUX                         YES
UNDOTBS1                       YES
USERS                          YES
TEMP                           YES
CMES                           YES
RMES                           YES
INDX                           YES

如果一个或多个表空间不生成闪回数据,那么在执行闪回操作之前必须使构成表空间的文件脱机。在闪回操作后使构成表空间的数据文件联机,然后还原并执行不完整恢复,一直到闪回的时间点。这样才能同步所有的数据文件,并随后可以使用RESETLOGS打开数据库。

6、复原点的使用

复原点就是SCN的别名,但更容易记忆。以下创建一个普通的复原点
create restore point rp1;

通过数据字典v$restore_point查询创建的复原点
col name for a10
select name, scn, storage_size, guarantee_flashback_database from v$restore_point;

NAME              SCN STORAGE_SIZE GUA
---------- ---------- ------------ ---
RP1          10421437            0 NO

该复原点并不保证闪回数据一定成功,因为它依赖于闪回日志数据是否存在。

以下则创建有保证的复原点,在闪回恢复区空间可以保证的情况下总可以闪回到该复原点,如果闪回恢复区空间不足,则数据库会关闭
create restore point grp1 guarantee flashback database;

再次查询创建的复原点,可以看到guarantee_flashback_database为yes
col name for a10
select name, scn, storage_size, guarantee_flashback_database from v$restore_point;

NAME              SCN STORAGE_SIZE GUA
---------- ---------- ------------ ---
GRP1         10423592     15941632 YES
RP1          10421437            0 NO

不需要复原点时,可将其删除
drop restore point rp1;
drop restore point grp1;


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

上一篇: Oracle闪回查询
下一篇: Oracle闪回删除
请登录后发表评论 登录
全部评论
刘鲁宁的个人博客。

注册时间:2016-12-29

  • 博文量
    113
  • 访问量
    287690