Oracle 闪回技术详解

概述

闪回技术是Oracle强大数据库备份恢复机制的一部分,在10g的时候就被推出一直延续到现在。在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成)。需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了,还是得借助于Oracle一些高级的备份恢复工具如RAMN去完成。

本文描述了Oracle闪回区的特性及其配置闪回区,监控闪回区等。

闪回区

闪回区特性及其配置

就是分配一个特定的目录位置(普通磁盘上的目录或ASM磁盘)来存放一些特定的恢复文件,用于集中和简化管理数据库恢复工作。闪回区单词缩写为FRA。

闪回区可存储文件的类型

  • 完全的数据文件备份
  • 增量备份
  • 数据文件副本
  • 当前的控制文件,备份的控制文件,spfile文件,快照控制文件
  • 联机日志文件,归档日志
  • 块跟踪文件、闪回日志

启用与禁用闪回区

设置下面的初始化参数

  • DB_RECOVERY_FILE_DEST_SIZE:用于设置闪回区的大小,此参数应优先于DB_RECOVERY_FILE_DEST参数修改,否则报ORA-32001错误。

  • DB_RECOVERY_FILE_DEST:用于设置闪回区的目录

  • DB_FLASHBACK_RETENTION_TARGET:指定数据库可以闪回的时间范围,单位为分钟,默认1440分钟,也就是一天。

数据库闪回分为多种情形,其闪回日志存放在FRA,可闪回的时间同时还取决于闪回恢复区的大小。
将DB_RECOVERY_FILE_DEST参数设置为空,可以停用FRA,但是启用flashback database,则不能取消FRA,需要先禁用flashback database

数据库FRA可以为每个数据库配置不同的闪回区,也可以为多个数据库配置相同路径的闪回区。
当为多个数据库配置相同的闪回区位置时,应考虑闪回区所在磁盘挂载点的总大小以及使用不同的DB_NAME
其路径为:FRA_HOME/<db_name>/<file_type>//<file_name> 。

闪回区的保留策略

闪回区中的文件保留与否由RMAN保留策略来决定。通过执行RMAN configure retention policy命令来设置其策略。

  • 对于没有关联保留策略或是永久文件,文件永远不会被删除;
  • 对于关联保留策略的文件,没有过时的情况下不会被删除,一旦过时,在空间压力下会自动被删除。

闪回区与多路日志归档

如果设置了归档日志参数log_archive_dest_n,归档时会使用该位置而不是使用闪回区。
如果未设置参数log_archive_dest_n,而是启用闪回区,则可以不需要再单独设置归档日志参数log_archive_dest_n,归档日志会位于闪回区。
对于启用闪回区后,不可再设置log_archive_dest、log_archive_duplex_dest,也就是说存在排他模式。可参考:Oracle 归档日志
对于既要归档到log_archive_dest_n,又要归档到闪回区的情形,需要设置参数log_archive_dest_10(缺省情况)给闪回区,如下:

alter system set log_archive_dest_10='LOCATION=USE_DB_RECOVERY_FILE_DEST';
alter system set log_archive_dest_1='LOCATION=/u03/database/archdir';

撤销段(UNDO SEGMENT)

在讲闪回技术前,需要先了解Oracle中一个逻辑结构–撤销段。因为大部分闪回技术都需要依赖撤销段中的撤销数据。撤销数据是反转DML语句结果所需的信息,只要某个事务修改了数据,那么更新前的原有数据就会被写入一个撤销段。(事务回滚也会用到撤销段中的数据)。事务启动时,Oracle 会为其分配一个撤销段,事务和撤销段存在多对一的关系,即一个事务只能对应一个撤销段,多个事务可以共享一个撤销段(不过在数据库正常运行时一般不会发生这种情况)。

闪回技术

Oracle提供了四种可供使用的闪回技术(闪回查询,闪回删除,闪回归档,闪回数据库),每种都有不同的底层体系结构支撑,但其实这四种不同的闪回技术部分功能是有重叠的,使用时也需要根据实际场景合理选择最合适的闪回功能。

1.基本闪回查询

功能描述:可以查询过去某个时间段的数据库状态。

工作原理:Oracle 会提取所需要的撤销数据(前提是撤销是可用的,即撤销数据还没被覆盖)进行回滚,但这种回滚是临时的,仅针对当前session可见。

SQL> select * from  dept as of timestamp to_timestamp('2016-09-10 11:00:00','yyyy-mm-dd hh24:mi:ss');

2.闪回表

功能描述:可将某个表回退到过去某个时间点

工作原理:同样,Oracle会先去查询撤销段,提取过去某个时间点之后的所有变更,构造反转这些变更的SQL语句进行回退,闪回操作是一个单独的事务,所以若由于撤销数据过期之类的原因导致无法闪回,整个操作会回滚,不会存在不一致的状态。

步骤:

1)启用表闪回首先要在表上支持行移动(在数据字典中设置标识来标识该操作可能会改变行ID,即同一条数据闪回成功后主键都一样,但行ID其实已经发生变化了)

 SQL> alter table emp enable row movement;

2)闪回表操作

SQL> flashback table dept to timestamp to_timestamp('2016-09-10 11:00:00','yyyy-mm-dd hh24:mi:ss');

闪回表可能会失败,有可能有以下几种情况:

a.违反了数据库约束,比如用户不小心删除了子表中的数据,现在想利用闪回表技术进行回退,恰好在这中间,父表中与该数据对应的那条记录也被删除了,在这种情况下,由于违反了外键约束,导致闪回表操作失败了;

b.撤销数据失效,比如用于支撑闪回操作的撤销数据被覆盖了,这种情况闪回表操作自然会失败;

c.闪回不能跨越DDL,即在闪回点和当前点之间,表结构有过变更,这种情况闪回操作也会失败。

注意:上述闪回功能都是基于撤销数据的,而撤销数据是会被重写的(Expired会被重写,Active不会被重写),所以,在需要使用这几种闪回功能去恢复数据的时候(确切地说,是需要使用基于撤销数据的闪回功能时),最短时间发现错误,第一时间执行闪回操作,才能最大程度地保证闪回功能的成功。

闪回删除(Flashback Drop)

功能描述:闪回删除可以轻松将一个已经被Drop的表还原回来。相应的索引,数据库约束也会被还原(除了外键约束)

原理描述:Drop命令其实是Rename命令,早期的Oracle版本(10g之前),闪回删除意味着从数据字典中删除了该表的所有引用,虽然表中数据可能还存在,但已成了孤魂野鬼,没法进行恢复了,10g版本之后,Drop命令则仅仅是一个Rename操作,所以恢复就很容易了。

闪回删除操作执行命令很简单

SQL> flashback table emp to before

如果要还原的表名在当前系统中已经被占用,也可以在闪回删除的时候对表重命名

SQL> flashback table emp to before drop rename to emp_new

也可以通过回收站查看当前用户那些表被删除了,每个用户都有一个回收站,这个回收站是个逻辑结构,它不是一块独立的存储空间,它存在在当前表空间内,所以如果有别的操作需要空间,比如现在需要创建一张表,没有足够空间可用,回收站中的数据就会被清理,这也是导致闪回删除失败的原因。

SQL> SHOW RECYCLEBIN;

彻底删除表,闪回删除也无能为力

SQL> DROP TABLE EMP PURGE;

清空回收站

SQL> PURGE RECYCLEBIN;

注意:闪回删除只针对Drop命令,注意区分truncate操作和drop操作,truncate称为表截断,会清空表中数据(调节Oracle高水位线实现),表结构不受影响,速度很快,弊端是此过程不会产生任何撤销数据或是重做日志,如果误删,恢复异常麻烦,要慎重使用。而Drop则会删除数据+表结构,闪回删除仅针对Drop操作。

闪回数据归档(Flashback Data Archive )

功能描述:闪回数据归档可使表具有回退到过去任何时间点的能力,前面提到的闪回查询,闪回表都会受限于撤销数据是否失效,如果撤销数据被覆盖重写了,闪回操作自然会失败,闪回删除则受限于表空间是否有足够可用空间,而闪回数据归档,则没有这些限制。

创建闪回归档

1)创建一个用户闪回数据归档的表空间,当然,也可以使用已经存在的表空间。

SQL> create tablespace test_tb datafile 'test.dbf' size 20m;

2)创建一个保留时间为2年的闪回归档

SQL> create flashback archive test_fa tablespace test_tb retention 2 year;

为scott用户下的emp表启用闪回归档

1)赋予用户归档的权限

SQL> grant flashback archive on test_fa to scott;

2)连接用户

SQL> conn scott/tiger;

3)为emp表启用闪回归档

SQL> alter table emp flashback archive test_fa;

至此,emp表就拥有了可以查询或回退到过去2年任意时间点的能力!

闪回数据库(Flashback Database)

功能描述:闪回数据库可将整个数据库回退到过去某个时间点,闪回表是某张表的时空穿梭,闪回数据库则是整个数据库的时空穿梭。当然,闪回点之后的所有工作就丢失了,其实就相当于数据库的不完整恢复,所以只能以resetlogs模式打开数据库。闪回数据库会造成停机时间,当然相比于传统备份恢复机制,恢复过程会快很多。

工作原理:闪回数据库不使用撤销数据,使用另外一种机制来保留回退所需要的恢复数据,当启用闪回数据库,发生变化的数据块会不断从数据库缓冲区缓存中复制到闪回缓冲区,然后,称为恢复写入器(Recovery Writer)的后台进程会将这些数据刷新到磁盘中的闪回日志文件中。闪回的过程,则是一个 提取闪回日志–>将块映像复制回数据文件 的过程。

配置闪回数据库(闪回数据库要求数据库为归档模式)

1)指定闪回恢复区,也就是存放闪回日志的位置,但闪回恢复区不仅仅是为了存放闪回日志,Oracle的很多备份恢复技术都用到这个区域,比如控制文件的自动备份等都会存放到此区域。

SQL> alter system set db_recovery_file_dest ='/flash_recovery_area';

2)指定恢复区大小

SQL> alter system set db_recovery_file_dest_size=4G;

3)指定闪回日志保留时间为2小时,即通过闪回操作,可以将数据库回退到前两小时内的任意时间点

SQL> alter system set db_flashback_retention_target=120;

4)有序关闭数据库–mount模式下启用闪回数据库–打开数据库

SQL> shutdown immediate;

SQL> startup mount;

SQL> alter database flashback on;

SQL> alter database open;

至此,闪回数据库配置完成!

使用闪回数据库功能

SQL> shutdown immediate;

SQL> startup mount;

SQL> flashback database to timestamp sysdate-60/1440;

SQL> alter database open resetlogs;

本节列举了四类闪回技术,其中,闪回查询,包括基本闪回查询,闪回表等技术都依赖于撤销数据(还有一类闪回技术为闪回事务,可以对指定事务进行闪回操作,原理类似,借助于撤销数据来构建用于反转事务的SQL语句),依赖于撤销数据,则自然受限于撤销数据的保留时间,可能会由于撤销数据被覆写而导致闪回失败。闪回删除,则是由于10g版本后对表的删除仅表现为一个rename操作,引入回收站的概念,但此回收站仅是当前表空间的一块逻辑划分,所以会受限于当前表空间的可用空间的限制;闪回归档可提供查询或回退到过去任意时间点的功能,闪回数据库则是一中更极端的数据库恢复功能,相当于不完整恢复,依赖于闪回日志。

闪回区空间分配与监控

对于启用闪回区特性之后,闪回区帮助管理全部的磁盘空间分配。Oracle会自动监控闪回区空间的使用情况。
关于闪回区空间分配大小应根据当前数据库备份的方式,备份是否压缩,每天归档日志大小,是否启用了闪回等多项因素综合来考量。
闪回区中可用空间达到不安全的程度或不够用的情形,可以通过OEM或DBA_OUTSTANDING_ALERTS获得相关信息。
会在Alert日志文件中生成警告:

  • 当可回收空间低于DB_RECOVERY_FILE_DEST_SIZE定义值的15%时,生成警报;
  • 当可回收空间低于DB_RECOVERY_FILE_DEST_SIZE定义值的3%时,生成严重警报;
  • 当整个闪回区被完全填满时,系统不可用,直接报ORA-19815,ORA-19809 :limit exceeded for recovery files (闪回区空间被填满,不表示当前的磁盘挂载点空间不够)

FRA空间不够用或出现严重告警的情形,应考虑从以下方面着手解决:

  • 如果仅仅是参数DB_RECOVERY_FILE_DEST_SIZE大小限制,磁盘空闲空间很多,则直接修改该参数到一个更大的值;
  • 如果磁盘空闲空间不多,应考虑分配更多的磁盘空间给文件系统,然后再修DB_RECOVERY_FILE_DEST_SIZE参数到一个更大的值;
  • 如果无法分配额外的磁盘空间,可以考虑迁移闪回区到有较多可用空间的另外一个文件系统,可以使用backup recovery area命令将整个FRA内容移动到另外的位置。

删除FRA中较早备份集或归档日志,建议使用RMAN命令来删除,若直接从os删除,Oracle认为FRA的空间并没有释放(需要crosscheck再delete)

Oracle除了在alert日志中对有关FRA空间产生警告之外,还提供了一系列相关的视图来监控闪回区。

DBA_OUTSTANDING_ALERTS:可以查询闪回区空间相关的问题(空间问题记录到该视图中存在一定程度的延迟)。
V$RECOVERY_FILE_DEST:该视图中描述了与闪回区有关的定义信息,包括闪回区的位置、大小、所使用的空间数量、可回收空间等等。

V$FLASH_RECOVERY_AREA_USAGE:该视图提供了关于占用闪回区空间的文件类型的详细信息。按文件类型进行分组,分别列出该类文件已使用的,可回收的百分比以及文件数量。

启动闪回功能

查看是否开启闪回功能:

SQL> select flashback_on from V$database;

FLASHBACK_ON
------------------
NO

执行如下操作启动闪回功能

$ cd /oracle

--生成闪回目录
$ mkdir flashback

SQL> alter system set db_recovery_file_dest_size=30G scope=both;

SQL> alter system set db_recovery_file_dest='/oracle/flashback'  scope=both;

SQL> shutdown immediate

SQL> startup mount

SQL> alter database archivelog;

SQL> alter database flashback on;

SQL> alter database open;

再次查看是否开启闪回功能

SQL> select flashback_on from V$database;

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

参考:
本文整理自文章:Oracle闪回区(FRA)Oracle 闪回技术详解
更多内容可参考:https://docs.oracle.com/en/database/oracle/oracle-database/19/haovw/ha-features.html#GUID-5E4FDB4B-465B-441E-8AE1-6BB0CF274A28

猜你喜欢

转载自blog.csdn.net/Ruishine/article/details/120966677