• 描述和使用Oracle Total Recall
– 创建和启用闪回数据归档(FDA)
– 管理FDA
– 查看元数据
• 描述和使用闪回回收站
– 从回收站还原删除的表
– 管理回收站的空间使用量
– 查询回收站
Oracle Total Recall 概览
自动跟踪数据库历史更改:
• 在你指定的保留期内在表级别启用。
• 所有后续更改都是透明存储的并能够防止篡改。
• 早于保留期的记录会被自动删除。
• 使用闪回技术检索历史记录。
SELECT … AS OF TIMESTAMP…
SELECT … VERSIONS BETWEEN TIMESTAMP and TIMESTAMP…
Oracle Total Recall 概览
Oracle Database 11g中的Oracle Total Recall(也称为闪回数据归档)选件提供了一种用于跟踪生产数据库更改的机制,这种机制是一种安全、高效、易于使用和应用程序透明的机制。
使用Oracle Total Recall 技术,你可以自动跟踪和存储启用了闪回数据归档的表中的数据。
这可确保闪回查询能够获得对数据库对象版本的SQL 级别访问权限,而不会出现快照太旧的错误。
利用闪回数据归档功能,可以在“跟踪的”表的整个生命期内跟踪并存储对该表的所有事务处理更改。
不再需要将此智能功能内置到应用程序中。
可将Oracle Total Recall 用于合规性报告、审计报表、数据分析和决策支持系统。闪回数据归档后台进程随数据库一起启动。
使用情形示例:
• 审计支持:查找自去年以来重复的保险索赔。
• 合规性支持:监视平静期的股票交易情况。
• 信息生命周期管理(ILM):确保对病历的永久访问权。
• 保留策略执行:自动清除五年以前的记录。
• 历史报告:检索客户的信用及付款历史记录。
• 错误恢复:还原被错误地删除或更新的记录。
设置过程
1. 创建用于保存FDA 的新表空间。
2. 使用FLASHBACK ARCHIVE ADMINISTER系统权限:创建闪回数据归档,将它分配到表空间,并指定其保留期。
CREATE FLASHBACK ARCHIVE fda1
TABLESPACE fda_tbs1 QUOTA 10M RETENTION 1 YEAR;
3. 使用FLASHBACK ARCHIVE对象权限:变更基表以启用归档并将其分配到一个闪回归档。
ALTER TABLE HR.EMPLOYEES FLASHBACK ARCHIVE fda1;
闪回数据归档的过程
一个闪回数据归档包含一个或多个表空间。可以拥有多个闪回数据归档,它们都配置有保留时间。你应根据保留时间的要求创建不同的闪回数据归档-例如,为必须保留两年的所有记录创建一个闪回数据归档,为必须保留五年的所有记录创建另一个闪回数据归档。
数据库将在保留期到期后的第一天自动清除所有历史记录信息。
1.为闪回数据归档创建表空间。空间大小取决于基表及预期的DML 和DDL 活动。
2.创建一个闪回数据归档并设置保留时间。归档在闪回数据归档中的数据的保存时间等于配置的保留时间。此任务需要FLASHBACK ARCHIVE ADMINISTER系统权限。
如果需要不同的保留期,必须创建不同的归档。
3.为(整个)表启用闪回归档(然后再禁用此归档)。此任务需要FLASHBACK ARCHIVE对象权限。即使为某个表启用了闪回归档,也仍然不允许对该表执行某些
DDL 语句。默认情况下,闪回归档对任何表都处于关闭状态。
- Total Recall 的工作原理
由fdba后台进程以自优化间隔从还原(及缓冲区高速缓存)中捕获历史数据。默认间隔为5 分钟。不论更新的列有多少,都会存储所更新的整个基表行。
• 使用OLTP 表压缩(而不是Hybrid Columnar 压缩)对历史数据进行压缩。
注:如果基表使用Hybrid Columnar 压缩,则表无法启用闪回数据归档。
• 每个闪回归档分区至少为1 天和1 MB 数据,基于ENDSCN 进行分区。对归档进行闪回查询可避免查询不相关的分区。
• fbda进程最多可调用10 个闪回归档从属进程。
• 如果闪回归档进程和从属进程太忙,则归档可能会按顺序执行,这对用户的响应时间有很大影响。
- Oracle Total Recall 场景
使用闪回数据归档访问历史数据:
-- create the Flashback Data Archive
CREATE FLASHBACK ARCHIVE DEFAULT fla1
TABLESPACE tbs1 QUOTA 10G RETENTION 5 YEAR;
创建了一个名为fla1的默认闪回数据归档,该归档最多可以使用tbs1表空间的10 GB 空间,其数据的保留期为五年。
-- Specify the default Flashback Data Archive
ALTER FLASHBACK ARCHIVE fla1 SET DEFAULT;
指定了默认闪回数据归档。默认情况下,系统没有任何闪回数据归档。可以使用以下两种方式之一设置它:
• 在ALTER FLASHBACK ARCHIVE语句的SET DEFAULT子句中指定某个现有闪回数据归档的名称。
• 在创建闪回数据归档时,在CREATE FLASHBACK ARCHIVE语句中包括DEFAULT。
-- Enable Flashback Data Archive
ALTER TABLE inventory FLASHBACK ARCHIVE;
ALTER TABLE stock_data FLASHBACK ARCHIVE;
启用了闪回数据归档。如果自动还原管理处于禁用状态,则在尝试修改表时会出现ORA-55614。
SELECT product_number, product_name, count FROM inventory AS
OF TIMESTAMP TO_TIMESTAMP ('2007-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');
显示了如何检索2007 年年初的所有物料库存。
Oracle Total Recall 场景
可以使用CREATE FLASHBACK ARCHIVE语句创建闪回数据归档。
• 可以为系统指定默认的闪回数据归档(可选)。
• 需要提供闪回数据归档的名称。
• 需要提供闪回数据归档的第一个表空间的名称。
• 可以确定闪回数据归档在表空间中允许使用的最大空间量。默认值为“Unlimited(无限制)”。
如果第一个表空间中的空间限额不是无限制的,则必须指定该值,否则会引发ORA-55621。
• 需要提供保留时间(即需要保证表的闪回数据归档数据存储多少天)。
Oracle Total Recall 场景
可以选择增加空间:
ALTER FLASHBACK ARCHIVE fla1
ADD TABLESPACE tbs3 QUOTA 5G;
将tbs3表空间的最多5 GB 空间添加至fla1闪回数据归档。
可以选择更改保留时间:
ALTER FLASHBACK ARCHIVE fla1 MODIFY RETENTION 2 YEAR;
将闪回数据归档fla1的保留时间更改为两年。
可以选择清除数据:
ALTER FLASHBACK ARCHIVE fla1 PURGE BEFORE TIMESTAMP
(SYSTIMESTAMP - INTERVAL '1' day);
从闪回数据归档fla1中清除了一天前的所有历史数据。通常会在保留时间到期后的第一天执行自动清除。也可以覆盖此设置进行临时清除。
可以选择删除闪回数据归档:
DROP FLASHBACK ARCHIVE fla1;
删除闪回数据归档fla1和历史数据,但不删除其表空间。
要对表启用闪回归档,请在CREATE TABLE或ALTER TABLE语句中包括FLASHBACK ARCHIVE子句。在FLASHBACK ARCHIVE子句中,可指定用于存储表的历史数据的闪回数据归档。默认值为系统的默认闪回数据归档。要对表禁用闪回归档,请在ALTER TABLE语句中指定NO FLASHBACK ARCHIVE。
使用ALTER FLASHBACK ARCHIVE命令可以:
- 更改闪回数据归档的保留时间
- 清除部分或全部数据
- 增加、修改和删除表空间
注:删除闪回数据归档的全部表空间会引发错误。
- 透明的方案演化
• DDL 支持:
– 添加、删除、重命名和修改列
– 删除和截断分区
– 重命名和截断表
• 闪回查询可以跨DDL 更改运行。
• 不能自动支持所有其它DDL。
透明的方案演化
闪回数据归档可以使用最常用的DDL 命令。闪回查询会随相应方案返回对应的一行或多行。
- 完整方案演化
取消关联或关联DBMS_FLASHBACK_ARCHIVE程序包中的过程:
• 对指定的表禁用Total Recall 并允许更复杂的DDL(升级、拆分表,等等)。
• 在关联期间执行方案完整性检查。(基表和历史记录表必须为相同的方案。)
注:应谨慎使用此项功能,请注意此功能会导致归档不再保持不变,因为在取消关联期间历史记录可能会更改。
可以通过DBMS_FLASHBACK_ARCHIVE程序包执行不被自动支持的所有DDL 更改。可以使用DISASSOCIATE_FBA和REASSOCIATE_FBA过程从闪回数据归档取消关联和重新关联给定的表。
注:应谨慎使用此项功能,请注意此功能会导致归档不再保持不变,因为在取消关联期间历史记录可能会更改。取消关联发生时,系统目录会有记录。
上图中显示了下列工作流:
• 如果有FLASHBACK ARCHIVE ADMINISTER权限,你可以从基表中取消关联归档。
• 为基表进行必要的更改。
• 为相应的归档进行必要的更改。
• 然后使用相同方案将表与归档关联。Total Recall 验证关联方案是否相同。
- 限制
• 如果使用Hybrid Columnar 压缩,则对基表不能启用Total Recall。
• 如果使用取消关联,则不能保证历史记录的永久性(但你总可以通过正确的权限清除之前的历史记录。)
• 历史记录表没有可移植性。
限制
针对启用了闪回数据归档的表使用DDL 语句时,某些DDL 语句会导致ORA-55610错误。例如:
• ALTER TABLE语句,包含UPGRADE TABLE子句并且使用或不使用INCLUDING DATA子句
• ALTER TABLE语句,用于移动或交换分区或子分区操作
• DROP TABLE语句
- 准则
• 使用SCN 进行精确查询。或者为方便可使用闪回技术。
• 闪回使用当前系统设置。
• 在查询过去的数据之前,使用COMMIT或ROLLBACK操作确保数据库的一致性。
• 不能从动态性能(V$) 视图检索过去的数据。它们包含当前数据。
• 但是,可以在静态数据字典视图(如*_TABLES)中执行对过去数据的查询。
准则
• 为了方便起见,可以对你编写的SQL 代码使用闪回查询、闪回版本查询或闪回事务处理查询。
• 记住,所有闪回处理过程都使用当前会话设置(如国家/地区语言和字符集),而不是在所查询的时间有效的设置。
• 要查询某个精确时间的过去数据,可使用SCN。如果使用时间戳,查询的实际时间可能会比指定的时间提前3 秒钟。Oracle DB 在内部使用SCN,并以3 秒钟的粒度级别将它们映射到时间戳。
• 要获得稍后与闪回功能一起使用的SCN,可以使用DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER函数。
• 要计算或检索一个过去时间供查询使用,可以使用一个函数返回值作为时间戳或SC参数。例如,将SYSTIMESTAMP函数的值加上或减去一个INTERVAL值。
• 要确保数据库的一致性,始终在查询过去数据之前执行COMMIT或ROLLBACK操作。
• 不能从动态性能(V$) 视图检索过去的数据。对此类视图的查询总是返回当前数据。但是,可以在静态数据字典视图(如*_TABLES)中执行对过去数据的查询。
- 查看闪回数据归档
查看结果:
视图名称(DBA/USER) 说明
*_FLASHBACK_ARCHIVE 显示有关闪回数据归档的信息
*_FLASHBACK_ARCHIVE_TS 显示闪回数据归档的表空间
*_FLASHBACK_ARCHIVE_TABLES 显示有关启用了闪回归档的表的信息
查看闪回数据归档
可使用动态数据字典视图查看跟踪的表和闪回数据归档元数据。要访问USER_FLASHBACK_*视图,必须拥有表的所有权。要检查DBA_FLASHBACK_*视图,
需要SYSDBA权限。
- 闪回删除和回收站
使用FLASHBACK TABLE命令,可以在无需使用时间点恢复的情况下,还原DROP TABLE语句的结果。
注:初始化参数RECYCLEBIN用于控制闪回删除功能是打开(ON) 还是关闭(OFF)。如果将该参数设置为OFF,则删除的表不会进入回收站。如果将该参数设置为ON,则删除的表将进入回收站,并且可以进行恢复。默认情况下,RECYCLEBIN设置为ON。
- 回收站
如果不启用回收站,则删除表时,与该表及其从属对象关联的空间会立即变为可回收(也就是说,该空间可用于其它对象)。
如果启用了回收站,则删除表时,与该表及其从属对象关联的空间不会立即变为可回收,即使该空间确实显示在DBA_FREE_SPACE中。
相反,会在回收站中引用删除的对象,这些对象仍属于其各自的所有者。在空间不紧张时,绝不会把回收站对象使用的空间自动回收。
这样,你就能在尽可能长的期限内恢复回收站对象。
将删除的表“移动”到回收站时,将使用系统生成的名称对该表及其关联对象和约束条件进行重命名。重命名惯例如下:BIN$unique_id$version。
其中,unique_id是该对象的全局唯一标识符,包含26 个字符,用于在所有数据库之间唯一地标识回收站名称,而version是数据库分配的版本号。
回收站本身是一个数据字典表,用于维护已删除对象的原始名称与各自系统生成名称之间的关系。可使用DBA_RECYCLEBIN视图查询回收站。
以上说明了这种行为:
1.你已经在表空间中创建了一个名为EMPLOYEES的表。
2.删除EMPLOYEES表。
3.此时,EMPLOYEES占用的区被视为空闲空间。
4.EMPLOYEES被重命名且新名称将记录到回收站中。
- 从回收站还原表
• 还原删除的表和从属对象。
• 如果多个回收站条目具有相同原始名称,则:
– 使用系统生成的唯一名称来还原特定版本
– 使用原始名称时,还原的表遵循后进先出(LIFO) 的规则
• 重命名原始名称(如果当前正在使用该名称)。
FLASHBACK TABLE <table_name> TO BEFORE DROP [RENAME TO <new_name>];
从回收站还原表
使用FLASHBACK TABLE ... TO BEFORE DROP命令从回收站恢复表及其所有可能的从属对象。可以指定表的原始名称或删除对象时分配给对象的系统生成名称。
如果指定原始名称,且回收站包含多个具有该名称的对象,则最先恢复最晚移动到回收站的对象(LIFO:后进先出)。如果需要检索表的较早版本,则可以指定要检索的表的系统生成名称,或发出其它FLASHBACK TABLE ... TO BEFORE DROP语句,直到检索到所需的表。
如果删除原始表后又在同一方案中创建了同名的新表,则会返回错误,除非还指定了RENAME TO子句。
注:闪回删除的表时,恢复的索引、触发器和约束条件将保留各自的回收站名称。因此,建议在闪回删除的表前查询回收站和DBA_CONSTRAINTS。使用这种方法,可以将恢复的索引、触发器和约束条件重命名为更实用的名称。
- 回收站:自动回收空间
只要回收站对象使用的空间没有被回收,就可以使用闪回删除功能恢复这些对象。下面是回收站对象的回收策略:
• 显式发出PURGE命令时执行手动清除
• 空间不足时执行自动清除:对象在回收站中时,DBA_FREE_SPACE也会报告其对应空间,因为这些空间是可以自动回收的。
然后按以下顺序使用特定表空间中的空闲空间:
1.与回收站对象不对应的空闲空间。
2.与回收站对象对应的空闲空间。在这种情况下,将使用先进先出(FIFO) 算法自动将回收站对象从回收站中清除。
3.自动分配的空闲空间(如果表空间是可以自动扩展的)假设在TBS1表空间内创建一个新表。如果向此表空间分配了与回收站对象不对应的空闲空间,则首先使
用此空闲空间。如果该空间不够,则使用与TBS1内驻留的回收站对象对应的空闲空间。如果使用了某些回收站对象的空闲空间,则会从回收站中自动清除这些
对象。此时,将无法再使用闪回删除功能恢复这些对象。如果仍未满足空间要求,则作为最后的方法,会在可能的情况下扩展TBS1表空间。
- 回收站:手动回收空间
PURGE {TABLE <table_name>|INDEX <index_name>}
PURGE TABLESPACE <ts_name> [USER <user_name>]
PURGE [USER_|DBA_]RECYCLEBIN
使用PURGE命令可从回收站中永久地删除对象。从回收站中清除某个对象时,会从数据库中永久地删除该对象及其从属对象。因此,将无法再使用闪回删除功能恢复从回收站中清除的对象。
下面是可能使用的一些PURGE命令:
• PURGE TABLE用于清除指定表。
• PURGE INDEX用于清除指定索引。
• PURGE TABLESPACE用于清除驻留在指定表空间中的所有对象。此外,也可能清除从属的、驻留在其它表空间中的对象。
• PURGE RECYCLEBIN用于清除属于当前用户的所有对象。RECYCLEBIN和USER_RECYCLEBIN同义。
• PURGE DBA_RECYCLEBIN用于清除所有对象。要发出此命令,必须具有足够的系统权限或SYSDBA系统权限。
还可以使用Oracle Enterprise Manager 从回收站中清除表。在“Schema folder(方案文件夹)”选项卡中,单击“Tables(表)”,选择删除的对象所在的方案,然后单击“Recycle Bin(回收站)”按钮。从结果列表中选择表并单击“Purge(清除)”按钮。
注:对于PURGE TABLE和PURGE INDEX命令,如果指定原始名称且回收站包含多个具有该名称的对象,则首先清除在回收站中的时间最长的对象(FIFO)。
- 不使用回收站
DROP TABLE <table_name> [PURGE];
DROP TABLESPACE <ts_name> [INCLUDING CONTENTS] ;
DROP USER <user_name> [CASCADE] ;
回收站的安全注意事项:
ALTER SYSTEM SET RECYCLEBIN=OFF SCOPE=SPFILE;
使用DROP TABLE PURGE命令可从数据库中永久地删除表及其从属对象。使用此命令时,对应的对象不会移到回收站中。此命令提供的功能与以前版本中DROP TABLE命令的功能相同。
发出DROP TABLESPACE ... INCLUDING CONTENTS命令后,表空间中的对象不会移到回收站中。而且,回收站中属于该表空间的对象也会被清除。发出不带INCLUDING CONTENTS子句的以上命令时,表空间必须为空,之后才能成功执行命令。但回收站中可以有属于该表空间的对象。这种情况下,会清除这些对象。
发出DROP USER ... CASCADE命令后,将从数据库中永久地删除该用户及其拥有的所有对象。回收站中属于已删除用户的所有对象都将被清除。
为增加安全性,你可以决定禁用回收站。
以SYSDBA身份连接,你可以:
• 使用以下命令查看回收站状态:
SHOW PARAMETER RECYCLEBIN
• 使用以下命令禁用回收站:
ALTER SYSTEM SET RECYCLEBIN=OFF SCOPE=SPFILE;
发出此命令后,你需要重新启动数据库。
- 查询回收站
SELECT owner, original_name, object_name, type, ts_name, droptime, related, space
FROM dba_recyclebin
WHERE can_undrop = 'YES';
SQL> SELECT original_name, object_name, ts_name, droptime
FROM user_recyclebin WHERE can_undrop = 'YES';
ORIGINAL_NAME OBJECT_NAME TS_NAM DROPTIME
------------- ----------------------- ------ -------------------
EMPLOYEES2 BIN$NE4Rk64w...gbpQ==$0 USERS 2007-07-02:15:45:13
SQL> SHOW RECYCLEBIN
通过查询user_recyclebin或RECYCLEBIN可查看所有已删除的对象。为便于使用,它具有同义词RECYCLEBIN。
dba_recyclebin视图可显示所有用户删除的且仍在回收站中的所有对象。
还可以使用SQL*Plus SHOW RECYCLEBIN命令。此命令只显示可“取消删除”的那些对象。
以下示例显示了如何从回收站中提取重要信息:
• original_name是删除对象前的对象名称。
• object_name是删除对象后系统生成的对象名称。
• type是对象的类型。
• ts_name是对象所属表空间的名称。
• droptime是删除对象的日期。
• related是删除对象的对象标识符。
• space是对象当前使用的块数。
还可以使用Database Control 查看回收站的内容。