当前位置: 首页 > news >正文

图文深入理解Oracle Total Recall

  1. 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 工作原理

以下图片是来自官方文档的解释:
在这里插入图片描述

  1. 工作原理
    Oracle Total Recall是Oracle数据库中一种强大的数据历史记录功能。,Oracle Total Recall利用数据库中的undo日志和历史表功能,实现对数据历史记录的跟踪和存储。当数据库中的数据发生变化时,Total Recall会捕获这些变化,并将它们存储在指定的历史表空间中,以便后续进行闪回查询。
  2. 核心组件
    Undo日志:Oracle数据库中的undo日志用于记录数据的更改历史。当数据发生变化时,undo日志会记录更改前的数据状态,以便在需要时进行回滚。
    历史表空间:用于存储Total Recall捕获的数据更改历史。这些表空间可以包含一个或多个闪回数据归档(Flashback Data Archive),每个归档都有其特定的保留时间和空间配额。
    闪回数据归档(FDA):是Oracle Total Recall的核心组件,用于跟踪和存储数据库表的更改历史。通过为表启用闪回归档,可以自动捕获并存储对该表的所有事务处理更改。

3. Oracle Total Recall的工作流程

在这里插入图片描述
默认情况下,闪回归档对任何表都处于关闭状态。

  1. 启用闪回归档:首先,需要为数据库表启用闪回归档。这可以通过ALTER TABLE语句指定FLASHBACK ARCHIVE子句来完成。启用后,该表的所有后续更改都会被自动捕获并存储在指定的闪回数据归档中。
  2. 捕获数据更改:当表中的数据发生变化时,Oracle Total Recall会利用undo日志捕获这些更改。捕获的更改包括插入、更新和删除操作。
  3. 存储历史记录:捕获的数据更改会被存储在启用了闪回归档的表的历史表空间中。这些更改以事务为单位进行存储,并保留了更改的时间戳和SCN(System Change Number)信息。
  4. 闪回查询:用户可以通过闪回查询来检索数据库表在过去某个时间点的状态。这可以通过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 设置:

  1. 默认情况下,系统没有闪回数据归档。可以使用以下两种方式之一设置默认的数据归档:
-- 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;
  1. 数据表启用闪回数据归档。如果自动还原管理处于禁用状态,则在修改表时会出现ORA-55614 错误。
-- Enable/Disable Flashback Data Archive(使用默认归档)
ALTER TABLE inventory FLASHBACK ARCHIVE;
ALTER TABLE inventory NO FLASHBACK ARCHIVE;
  1. 使用闪回查询访问已归档的历史数据
SELECT product_number, product_name, count FROM inventory
AS OF TIMESTAMP TO_TIMESTAMP ('2007-01-01 00:00:00','YYYYMM-DD HH24:MI:SS');
  1. 增加归档的空间:
ALTER FLASHBACK ARCHIVE fla1 ADD TABLESPACE tbs3 QUOTA 5G;
  1. 更改保留时间:
ALTER FLASHBACK ARCHIVE fla1 MODIFY RETENTION 2 YEAR;
  1. 清除数据:
ALTER FLASHBACK ARCHIVE fla1 PURGE BEFORE TIMESTAMP(SYSTIMESTAMP-INTERVAL '1'  day);
  1. 删除闪回数据归档(直接删除闪回数据归档的全部表空间会引发错误)
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核心知识和排障案例及经验、性能调优等。


http://www.mrgr.cn/news/56443.html

相关文章:

  • MySQL实现主从同步
  • 93. 查看或设置gltf几何体顶点
  • @moohng/postcss-px2vw,如何配置响应式参数?
  • 安卓流式布局实现记录
  • ECharts饼图-饼图自定义样式,附视频讲解与代码下载
  • 猎板PCB的金属基板知识你都知道吗?
  • 【JavaEE初阶】网络编程TCP协议实现回显服务器以及如何处理多个客户端的响应
  • GJS-WCP
  • [ 钓鱼实战系列-基础篇-5 ] 一篇文章教会你用红队思维设计钓鱼模板(附常见的钓鱼邮件模板)
  • Tcp协议讲解与守护进程
  • Docker基础知识教程(最详细最全)
  • Android 拦截第三方推送的通知消息或系统消息或通知栏
  • 【C++、数据结构】二叉排序树(二叉查找树、二叉搜索树)(图解+完整代码)
  • C++入门知识
  • 【二刷hot100】day 4
  • Python程序设计 内置模块 随机函数
  • 【C++】— 一篇文章让你认识STL
  • Git的原理和使用(六)
  • 开源医疗管理的未来:参与码良诊所管理系统,助力智能医疗
  • 中国古代数学的杰出研究成果之一 - 杨辉三角 - 怎么用go、C++进行编程解决
  • 二叉树展开为链表
  • 代码随想录算法训练营第51天|101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104.建造最大岛屿
  • 集合框架16:HashMap的使用
  • C++编程语言:抽象机制:特殊运算符(Bjarne Stroustrup)
  • 容灾与云计算概念
  • Javascript基础面试题