闪回数据归档:


概览


闪回数据归档是一种历史记录数据存储。Oracle Database 11g通过新的闪回数据归档后台进程FBDA自动跟踪和归档启用了闪回数据归档的表中的数据。使用此功能可满足超过还原保留期的长期保留要求。闪回数据归档可确保闪回查询能够获得对数据库对象版本的SQL 级别访问权限,而不会出现快照太旧的错误。


闪回数据归档由一个或多个表空间(或其中的几部分)组成。您可以拥有多个闪回数据归档。每个闪回数据归档都具有特定的保留持续时间。您应根据保留持续时间的要求创建不同的闪回数据归档,例如,为必须保留一年的所有记录创建一个闪回数据归档,为必须保留两年的所有记录创建另一个闪回数据归档等。


FBDA将异步收集原始数据并将其写入闪回数据归档。它并不包括原始索引,因为检索历史记录信息的模式与检索当前信息的模式可能大不相同。


注:可能需要针对历史记录查询持续时间创建适合的索引。



闪回数据归档比较



闪回数据归档技术与闪回数据库的比较:


• 使用闪回数据归档可以访问任意时间点的数据,而不会实际更改当前数据。这与闪回


数据库相反,闪回数据库会使数据库实际返回到某个时间点。


• 必须启用跟踪才能访问历史记录,而闪回数据库需要预配置。闪回数据库属于脱机操


作,需要资源。闪回数据归档属于联机操作(历史记录访问与当前访问无缝共存)。


由于使用了新的后台进程,所以它对现有的进程几乎没有影响。


• 闪回数据归档在表级别启用,而闪回数据库只能在数据库级别运行。


• 使用闪回数据归档,可以返回到一个表的不同行或多个不同表的多个不同时间点,而


使用闪回数据库则只能返回到特定调用的一个时间点。




闪回数据归档:


体系结构


闪回数据归档后台进程(FBDA) 随数据库启动。


1.FBDA首先对缓冲区高速缓存中的还原数据执行操作。


2.如果还原数据已不在缓冲区高速缓存中,FBDA也可以从还原段读取所需值。


3.FBDA将合并启用了闪回归档的表中的修改行,并将其写入相应的历史记录表,这些表将组成闪回数据归档。


可以通过查询*_FLASHBACK_ARCHIVE_TABLES视图查找历史记录表的内部分配名称。历史记录表是压缩的数据,并已在内部进行了分区。


数据库将在保留期到期后的第一天自动清除所有历史记录信息(删除数据,而不破坏闪回数据归档)。例如,如果保留期为10 天,则会在每10 天后的第一天删除最旧的信息,在归档中仅保留10 天的信息。这是实现数字粉碎的一种方法。




准备数据库


要启用闪回数据归档,执行下列任务:


为数据归档创建一个或多个表空间,并对“归档管理员”授予访问权限和适合的限额。


同时,为归档管理员授予FLASHBACK ARCHIVE ADMINISTER系统权限,允许其执行下列语句:


• CREATE FLASHBACK ARCHIVE


• ALTER FLASHBACK ARCHIVE


• DROP FLASHBACK ARCHIVE


要允许特定用户使用特定闪回数据归档,请为归档用户授予对该闪回数据归档的FLASHBACK ARCHIVE对象权限。这样,归档用户可以使用特定闪回数据归档对表启用闪回归档。


以归档管理员身份执行以下示例:


GRANT FLASHBACK ARCHIVE ON FLA1 TO HR;



用户很有可能会使用其它闪回功能。要允许在查询期间访问特定对象,授予对查询涉及的所有对象的FLASHBACK和SELECT权限。


如果用户需要访问DBMS_FLASHBACK程序包,则需要为他们授予对此程序包的SELECT权限。这样,用户就可以使DBMS_FLASHBACK.ENABLE和DBMS_FLASHBACK.DISABLE过程来启用或禁用闪回数据归档。




配置还原:


– 创建还原表空间(默认设置为:可自动扩展的表空间)


– 启用自动还原管理(11g的默认设置)


– 了解还原的自动优化:


— 固定大小的表空间:可获得最佳保留期的自动优化


— 可自动扩展的还原表空间:可获得运行时间最长的查询的自动优化


– 建议对闪回使用以下设置:固定大小的还原表空间



Oracle Database 11g使用下列默认数据库初始化参数:


• UNDO_MANAGEMENT='AUTO'


• UNDO_TABLESPACE='UNDOTBS1'


• UNDO_RETENTION=900


换句话说,默认情况下启用自动还原管理。可自动扩展的还原表空间基于数据库安装而创建。


• 对于固定大小的还原表空间,Oracle DB 会自动优化系统,以便为还原表空间提供可能的最佳还原保留期。


• 对于可自动扩展的还原表空间(默认),Oracle DB 会保留还原数据,其保留时间至少满足运行时间最长的查询所需的保留期,以及UNDO_RETENTION参数指定的还原保留期阈值。


使用固定大小的还原表空间,自动优化还原保留期通常会产生较好的结果。如果由于此原因或其它原因而希望将还原表空间更改为固定大小,还原指导可帮助您确定要分配的正确固定大小。



如果不能确定空间要求或者无法访问还原指导,请执行以下步骤:


1.以可自动扩展的还原表空间开始。


2.在一个业务循环(例如,1 天或2 天或更长时间)中观察它。


3.使用V$UNDO_STAT视图收集还原块信息,计算空间要求,并使用它们创建大小适合的固定还原表空间(《Oracle 数据库管理员指南》中提供了计算公式)。


4.查询V$UNDOSTAT.TUNED_UNDORETENTION以确定对于当前还原表空间还原数据的保留持续时间。设置UNDO_RETENTION参数并不能保证未到期的还原数据不会被覆盖。如果系统需要较多的空间,Oracle DB 可以用最新生成的还原数据覆盖未到期的还原数据。


- 为还原表空间指定RETENTION GUARANTEE子句,以确保不会丢弃未到期的还原数据。


- 为了满足超过还原保留期的长期保留要求,可创建闪回数据归档。




闪回数据归档:


工作流


第一步是创建闪回数据归档。闪回数据归档由一个或多个表空间组成。您可以拥有多个闪回数据归档。


第二步是为系统指定默认的闪回数据归档,该步骤是可选的。闪回数据归档配置有保留时间。将在此保留时间内保留在闪回数据归档中归档的数据。


在第三步中,可以对表先启用闪回归档(然后再禁用它)。对表启用闪回归档时,系统不允许对该表执行某些DDL 语句。默认情况下,不对任何表启用闪回归档。


在第四步中,查看闪回数据归档数据。当查询的数据超过了可能的还原保留期时,会以透明方式重新编写该查询以使用闪回数据归档中的历史记录表。



使用闪回数据归档


访问历史记录数据的基本工作流:


1.创建闪回数据归档:



CREATE FLASHBACK ARCHIVE fla1


TABLESPACE tbs1 QUOTA 10G RETENTION 5 YEAR;


2.对FLA1归档中的表启用历史记录跟踪:


ALTER TABLE inventory FLASHBACK ARCHIVE fla1;


3.查看历史记录数据:


SELECT product_number, product_name, count


FROM inventory AS OF TIMESTAMP TO_TIMESTAMP


('2007-01-01 00:00:00', 'YYYY-MM-DDHH24:MI:SS');



使用CREATE FLASHBACK ARCHIVE语句创建闪回数据归档。


• 可以为系统指定默认的闪回数据归档(可选)。如果省略此选项,则以后仍可以将此闪回数据归档指定为默认选项。


• 需要提供闪回数据归档的名称。


• 需要提供闪回数据归档的第一个表空间的名称。


• 可以确定表空间中闪回数据归档可以使用的最大空间量。默认设置是不受限制。如果第一个表空间中的空间限额不是无限制的,则必须指定该值,否则会引发ORA-55621。


• 需要提供保留时间(表的闪回数据归档数据的保留天数)。


创建并使用闪回数据归档的基本工作流只包含三个步骤:


1.归档管理员创建名为fla1的闪回数据归档,这最多占用10 GB 的tbs1表空间,其中的数据会保留五年。


2.在第二步中,归档用户启用闪回数据归档。如果自动还原管理处于禁用状态,则在试图修改表时会出现错误ORA-55614。


3.第三步使用AS OF查询显示所访问的历史记录数据。



配置默认闪回数据归档


使用默认闪回归档:


1.创建默认闪回数据归档:



CREATE FLASHBACK ARCHIVE DEFAULT fla2


TABLESPACE tbs1 QUOTA 10G RETENTION 2 YEAR;


2.对表启用历史记录跟踪:


ALTER TABLE stock_data FLASHBACK ARCHIVE;


注:因为使用了默认的闪回数据归档,所以不需要提供闪回数据归档名称。


3.禁用历史记录跟踪:


ALTER TABLE stock_data NO FLASHBACK ARCHIVE;



配置默认闪回数据归档


在FLASHBACK ARCHIVE子句中,可以指定将在其中存储表的历史记录数据的闪回数据归档。默认情况下,系统没有闪回数据归档。在前面的示例中,为系统指定了默认闪回数据归档。


可使用以下两种方式之一创建默认闪回归档:


• 在ALTER FLASHBACK ARCHIVE语句的SET DEFAULT子句中,指定现有闪回数据归档的名称。


• 创建闪回数据归档时,CREATE FLASHBACK ARCHIVE语句中包含DEFAULT。


可使用ALTER TABLE命令对表启用和禁用闪回归档。可通过指定闪回数据归档名称将内部归档表分配给特定闪回数据归档。如果省略了名称,将使用默认闪回数据归档。指定NO FLASHBACK ARCHIVE可禁用表归档。




填充闪回数据归档空间


闪回数据归档填满后,会发生什么?


• 空间使用率达到90%


• 引发错误:


– ORA-55623 "FlashbackArchive \"%s\" is blocking and tracking on all tables is suspended"


– ORA-55617 "Flashback Archive \"%s\" runs out of space and tracking on \"%s\" is suspended"


• 生成预警日志条目


• 挂起跟踪



填充闪回数据归档空间


用尽闪回数据归档中的空间后,FBDA及所有生成跟踪还原的前台进程会引发ORA-55617或ORA-55623错误。会增加一个预警日志条目,表明“闪回归档fla1 已满,归档已挂起。\n”默认情况下,分配空间的使用率达到90% 后即会发生此错误。


示例:


• 55623, 00000, "Flashback Archive \"%s\" is blocking and tracking on all tables is suspended"


// *Cause: Flashback archive tablespace has run out of space.


// *Action: Add tablespace or increase tablespace quota for the flashback archive.


//


• 55617, 00000, "Flashback Archive \"%s\" runs out of space and tracking on \"%s\" is suspended“


// *Cause: Flashback archive tablespace quota is running out.


// *Action: Add tablespace or increase tablespace quota for the flashback archive.


注:此后,由于FBDA无法归档这些操作,新的事务处理会受到阻止。跟踪数据中不会因丢失的操作而出现间断。提高限额或扩展分配的表空间会导致FBDA先处理未归档的事务处理,然后再处理正在进行的事务处理或新的事务处理。



维护闪回数据归档


1.增加空间:

ALTER FLASHBACK ARCHIVE fla1


ADD TABLESPACE tbs3 QUOTA 5G;


为闪回数据归档FLA1最多增加5 GB 的TBS3表空间(归档管理员不能超过由DBA 授予的表空间限额)。


2.更改保留时间:ALTER FLASHBACK ARCHIVE fla1 MODIFY RETENTION 2 YEAR;


将闪回数据归档FLA1的保留时间更改为两年。


3.清除数据:

ALTER FLASHBACK ARCHIVE fla1 PURGE BEFORE


TIMESTAMP(SYSTIMESTAMP - INTERVAL '1' day);


从闪回数据归档FLA1中清除了一天前的所有历史记录数据。通常会在保留时间到期后的第一天执行自动清除。也可以覆盖此设置以进行临时清除。


4.删除闪回数据归档:DROP FLASHBACK ARCHIVE fla1;


删除闪回数据归档FLA1和历史记录数据,但不删除其表空间。使用ALTER FLASHBACK ARCHIVE命令,可以:

- 更改闪回数据归档的保留时间


- 清除部分或全部数据


- 增加、修改和删除表空间


注:删除闪回数据归档的全部表空间会引发错误。




出于某些目的,组织需要存储历史记录数据。闪回数据归档功能可通过“as of”查询提供对历史记录数据的无缝访问。可将闪回数据归档功能用于兼容性报告、审计报表、数据分析和决策支持。




闪回数据归档:示例


1.强制执行数字粉碎:

CREATE FLASHBACK ARCHIVE tax7_archive


TABLESPACE tbs1 RETENTION 7 YEAR;


假设希望建立自己的数据库,以便在7 年后的第一天自动删除TAX7_ARCHIVE中的信息。


2.访问历史记录数据:

SELECT symbol, stock_price FROM stock_data


AS OF TIMESTAMP TO_TIMESTAMP ('2006-12-31 23:59:00',


'YYYY-MM-DD HH24:MI:SS')


要在2006 年12 月31 日营业时间结束时检索股票行情


3.恢复数据:


INSERT INTO employees


SELECT * FROM employees AS OF TIMESTAMP


TO_TIMESTAMP('2007-06-12 11:30:00','YYYY-MM-DD HH24:MI:SS')


WHERE name = 'JOE';


如果发现错误删除了JOE的雇员记录,但该记录在2007 年6 月12 日11:30 时仍然存在,可以重新将其插入




闪回数据归档:


DDL 限制


出于安全性和合法兼容性方面的考虑,上述限制可确保闪回数据归档中的数据不会失效。对启用了闪回数据归档功能的表使用下述任一DDL 语句都会导致错误ORA-55610:


• 执行以下任一操作的ALTER TABLE语句:


– 删除、重命名或修改列


– 执行分区或子分区操作


– 将LONG列转换为LOB列


– 包括UPGRADE TABLE子句(不管有无INCLUDING DATA子句)


• DROP TABLE语句




查看闪回数据归档


可使用动态数据字典视图查看跟踪表和闪回数据归档元数据。要访问USER_FLASHBACK视图,需要拥有表的所有权。对于其它视图,则需要拥有SYSDBA权限。


示例:


• 查询闪回数据归档的创建时间:


SELECT FLASHBACK_ARCHIVE_NAME, CREATE_TIME, STATUS


FROM DBA_FLASHBACK_ARCHIVE;


• 列出闪回数据归档使用的表空间:


SELECT *


FROM DBA_FLASHBACK_ARCHIVE_TS;


• 列出特定表的归档表名称:


SELECT ARCHIVE_TABLE_NAME


FROM USER_FLASHBACK_ARCHIVE_TABLES


WHERE TABLE_NAME = 'EMPLOYEES';


无法从动态性能(V$) 视图中检索过去的数据。对此类视图中的查询总是返回当前数据。不过,您可以在静态数据字典视图(如*_TABLES)中对过去的数据执行查询。



查看结果:


显示有关闪回数据归档的信息 *_FLASHBACK_ARCHIVE


显示闪回数据归档的表空间 *_FLASHBACK_ARCHIVE_TS


显示有关启用了闪回归档的表的信息 *_FLASHBACK_ARCHIVE_TABLES



标准和使用提示


• 为了确保数据库的一致性,应始终在查询过去的数据前执行COMMIT或ROLLBACK操作。


• 请记住,所有闪回处理都使用当前的会话设置(如国家语言和字符集),而不使用查询时生效的设置。


• 要获得稍后与闪回功能一起使用的SCN,可以使用DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER函数。


• 要计算或检索查询中使用的过去某个时间,请使用函数返回值作为时间戳或SCN 参数。例如,将SYSTIMESTAMP函数的值加上或减去一个INTERVAL值。使用以下公式计算过去的某个时间:(SYSTIMESTAMP - INTERVAL '10' MINUTE)


• 要查询某个精确时间的过去数据,请使用SCN。如果使用时间戳,查询的实际时间可以比指定的时间最多早3 秒。Oracle DB 在内部使用SCN 并将其映射到粒度为3 秒的时间戳。