8

作为我正在谈论的标题,在 oracle 中跟踪数据更改的最佳方法是什么?我只想知道哪一行被更新/删除/插入?

一开始我考虑的是触发器,但是我需要在每个表上写更多的触发器,然后将影响到我的更改表的rowid记录下来,这不好,然后我在Google中搜索,学习有关物化视图日志和更改的新概念数据抓取,

物化视图日志对我有好处,我可以将它与原始表进行比较,然后我可以获得不同的记录,甚至不同的字段,我认为方式与我从原始表创建/复制新表相同(但我不'不知道有什么不同?);

更改数据捕获组件对我来说很复杂 :),所以我不想浪费时间研究它。

任何人都有在 oracle 中跟踪数据更改的最佳方法的经验吗?

4

3 回答 3

5

您需要查看AUDIT语句。它收集 SYS.AUD$ 表中的所有审计记录。

例子:

AUDIT insert, update, delete ON t BY ACCESS

问候,
罗布。

于 2011-04-20T07:39:01.100 回答
2

你可能想看看金门。这使得捕获更改变得轻而易举,价格低廉,但具有良好的性能和快速的设置。

如果性能没有问题,触发器和审计可能是一个有效的解决方案。如果性能是一个问题并且 Golden Gate 被认为过于昂贵,您还可以使用 Logminer 或 Change Data Capture。考虑到这个选择,我更喜欢 CDC。如您所见,有很多选项,接近实时和离线。

手工编写解决方案也是有代价的,Golden Gate 值得研究。

于 2011-04-20T07:46:34.387 回答
2

Oracle 通过重做日志为您执行此操作,这取决于您尝试使用此信息做什么。我假设您需要复制(跟踪源实例的更改并传播到 1 个或多个目标实例)。

如果是这种情况,您可以考虑 Oracle 流(其他选项,例如高级复制,但您需要考虑您的需求):

来自甲骨文:

当您使用 Streams 时,DML 或 DDL 更改的复制通常包括三个步骤:

捕获进程或应用程序创建一个或多个逻辑更改记录 (LCR) 并将它们排入队列。LCR 是具有特定格式的消息,用于描述数据库更改。捕获过程将从重做日志捕获的更改重新格式化为 LCR,并且应用程序可以构建 LCR。如果更改是数据操作语言 (DML) 操作,则每个 LCR 都会将 DML 操作导致的行更改封装到源数据库的共享表中。如果更改是数据定义语言 (DDL) 操作,则 LCR 会封装对源数据库中的共享数据库对象所做的 DDL 更改。

传播将暂存的 LCR 传播到另一个队列,该队列通常驻留在与捕获 LCR 的数据库不同的数据库中。LCR 在到达目标数据库之前可以传播到多个队列。

在目标数据库,应用进程通过将 LCR 应用到共享数据库对象来使用更改。应用进程可以使 LCR 出列并直接应用它,或者应用进程可以使 LCR 出列并将其发送到应用处理程序。在 Streams 复制环境中,应用处理程序执行 LCR 的自定义处理,然后将 LCR 应用到共享数据库对象。

于 2011-04-20T12:40:20.137 回答