- List item
题记:本文图文深入理解Oracle Total Recall技术。
1. Oracle Total Recall 概述
Oracle Total Recall(也称为 Flashback Data Archive - 闪回数据归档)提供了一种用于跟踪数据库更改的机制,可自动跟踪数据库历史更改:
• 在表级别启用设置 UNDO 数据保留期限,不会出现快照太旧的错误。
• 启用后,所有数据更改的存储都是对应用程序透明的、并能够防止篡改。在表的整个生命期内跟踪并存储对该表的所有事务处理更改,无需将此功能内置到应用程序中。
• 超出归档保留期限的记录会被自动删除。
• 可使用闪回查询检索数据表的历史记录
SELECT ... AS OF TIMESTAMP...
SELECT ... VERSIONS BETWEEN TIMESTAMP and TIMESTAMP...
2. Oracle Total Recall 工作原理
以下图片是来自官方文档的解释:
- 工作原理
Oracle Total Recall是Oracle数据库中一种强大的数据历史记录功能。,Oracle Total Recall利用数据库中的undo日志和历史表功能,实现对数据历史记录的跟踪和存储。当数据库中的数据发生变化时,Total Recall会捕获这些变化,并将它们存储在指定的历史表空间中,以便后续进行闪回查询。 - 核心组件
Undo日志:Oracle数据库中的undo日志用于记录数据的更改历史。当数据发生变化时,undo日志会记录更改前的数据状态,以便在需要时进行回滚。
历史表空间:用于存储Total Recall捕获的数据更改历史。这些表空间可以包含一个或多个闪回数据归档(Flashback Data Archive),每个归档都有其特定的保留时间和空间配额。
闪回数据归档(FDA):是Oracle Total Recall的核心组件,用于跟踪和存储数据库表的更改历史。通过为表启用闪回归档,可以自动捕获并存储对该表的所有事务处理更改。
3. Oracle Total Recall的工作流程
默认情况下,闪回归档对任何表都处于关闭状态。
- 启用闪回归档:首先,需要为数据库表启用闪回归档。这可以通过ALTER TABLE语句指定FLASHBACK ARCHIVE子句来完成。启用后,该表的所有后续更改都会被自动捕获并存储在指定的闪回数据归档中。
- 捕获数据更改:当表中的数据发生变化时,Oracle Total Recall会利用undo日志捕获这些更改。捕获的更改包括插入、更新和删除操作。
- 存储历史记录:捕获的数据更改会被存储在启用了闪回归档的表的历史表空间中。这些更改以事务为单位进行存储,并保留了更改的时间戳和SCN(System Change Number)信息。
- 闪回查询:用户可以通过闪回查询来检索数据库表在过去某个时间点的状态。这可以通过SELECT语句的AS OF TIMESTAMP子句或VERSIONS BETWEEN TIMESTAMP AND TIMESTAMP子句来完成。查询结果将显示指定时间点或时间段内的数据状态。
4. Oracle Total Recall 的使用场合:
1. Oracle Total Recall 常用于以下场合:
• 审计支持:查找自去年以来重复的保险索赔。
• 合规性支持:监视平静期的股票交易情况。
• 信息生命周期管理 (ILM - Information Lifecycle Management):确保能对病人病历的连续跟踪访问。
• 执行保留策略:自动清除五年以前的记录。
• 历史报告:检索客户的信用及付款历史记录。
• 错误恢复:还原被错误地删除或更新的记录。
2. racle Total Recall 设置:
-
默认情况下,系统没有闪回数据归档。可以使用以下两种方式之一设置默认的数据归档:
-- create the Flashback Data Archive
CREATE FLASHBACK ARCHIVE DEFAULT fla1
TABLESPACE tbs1 QUOTA 10G RETENTION 5 YEAR;
-- Specify the default Flashback Data Archive
ALTER FLASHBACK ARCHIVE fla1 SET DEFAULT; -
数据表启用闪回数据归档。如果自动还原管理处于禁用状态,则在修改表时会出现ORA-55614 错误。
-- Enable/Disable Flashback Data Archive(使用默认归档)
ALTER TABLE inventory FLASHBACK ARCHIVE;
ALTER TABLE inventory NO FLASHBACK ARCHIVE; -
使用闪回查询访问已归档的历史数据
SELECT product_number, product_name, count FROM inventory
AS OF TIMESTAMP TO_TIMESTAMP ('2007-01-01 00:00:00','YYYYMM-DD HH24:MI:SS'); -
增加归档的空间:
ALTER FLASHBACK ARCHIVE fla1 ADD TABLESPACE tbs3 QUOTA 5G;
-
更改保留时间:
ALTER FLASHBACK ARCHIVE fla1 MODIFY RETENTION 2 YEAR;
-
清除数据:
ALTER FLASHBACK ARCHIVE fla1 PURGE BEFORE TIMESTAMP(SYSTIMESTAMP-INTERVAL '1' day);
-
删除闪回数据归档(直接删除闪回数据归档的全部表空间会引发错误)
DROP FLASHBACK ARCHIVE fla1;
5. 调整Oracle Total Recall
使用 DBMS_FLASHBACK_ARCHIVE 程序包中的取消关联或关联过程,可执行不被自动支持的所有 DDL 更改。
• 可以使用 DISASSOCIATE_FBA 和 REASSOCIATE_FBA 过程从闪回数据归档取消关联和重新关联给定的表。
• 取消关联是对指定的表禁用数据归档,以执行更复杂的 DDL 操作(如:升级、拆分表,等等)。
• 重新关联时将执行方案完整性检查,验证基表和历史记录表必须在相同的Schema 中。
注:应谨慎使用此项功能,因为在取消关联期间,历史记录也可能会更改。
在启用了闪回数据归档的表中使用某些 DDL 语句会导致 ORA-55610 错误。例如:
--ALTER TABLE 语句,其中包含 UPGRADE TABLE 子句;
--ALTER TABLE 语句,用于移动或交换分区或子分区操作;
--DROP TABLE 语句;
• 如果基表使用 Hybrid Columnar 压缩,则对基表不能启用 Total Recall。
• 如果使用取消关联,则不能保证历史记录的固定不变(但可以清除之前的历史记录)。
• 历史记录表没有可移植性。
6. 使用Oracle Total Recall的准则
•使用 SCN 进行精确时间查询。如果使用时间戳,查询的实际时间可能会比指定的时间提前 3 秒钟。Oracle DB 在内部使用 SCN,并以 3 秒钟的粒度级别将它们映射到时间戳。
• 获取 SCN:可以使用函数DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER
• 获取时间戳:可将 SYSTIMESTAMP 函数的值加上或减去一个 INTERVAL 值。
• 所有闪回处理过程都使用当前会话设置(如国家/地区语言和字符集),而不是在所查询的时间有效的设置。
• 在查询过去的数据之前,先执行 COMMIT 或 ROLLBACK 操作,确保数据库的一致性。
• 不能从动态性能(V$) 视图检索过去的数据,此类视图只返回当前的数据。
• 但是,可以在静态数据字典视图(如*_TABLES)中执行对过去数据的查询。
7. 查看闪回数据归档
本篇完结
码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,后续不定期分享DB核心知识和排障案例及经验、性能调优等。