作为我正在讨论的标题,跟踪oracle数据变化的最佳方法是什么?我只是想知道哪一行正在更新/删除/插入?
起初我考虑了触发器,但是我需要在每个表上写下更多的触发器然后记录下影响到我的更改表的rowid,这不好,然后我在Google中搜索,学习关于物化视图的新概念记录并更改数据捕获,
物化视图日志对我来说很好,我可以将它与原始表进行比较然后我可以得到不同的记录,甚至不同的字段,我认为方式是相同的我从原始创建/复制新表(但我不知道有什么不同?);更改数据捕获组件对我来说很复杂:),所以我不想浪费时间去研究它。
任何人都有经验是跟踪oracle数据变化的最佳方式吗?
答案 0 :(得分:5)
答案 1 :(得分:2)
你可能想看看金门。这使得捕获更改变得轻而易举,而且价格合理,但具有良好的性能和快速设置。
如果性能没有问题,触发器和审核可能是一个有效的解决方案。 如果性能问题并且Golden Gate被认为太昂贵,您还可以使用Logminer或Change Data Capture。鉴于这种选择,我倾向于CDC。 如您所见,有很多选项,接近实时和离线。
手工编写解决方案也有价格,金门值得调查。
答案 2 :(得分:2)
Oracle通过重做日志为您完成此操作,这取决于您尝试对此信息执行的操作。我假设您需要复制(跟踪源实例上的更改并传播到一个或多个目标实例)。
如果是这种情况,您可以考虑Oracle流(其他选项,如高级复制,但您需要考虑您的需求):
来自Oracle:
使用Streams时,复制一个 DML或DDL更改通常包括 三个步骤:
捕获过程或应用程序 创建一个或多个逻辑更改 记录(LCR)并将它们排入队列 一个队列。 LCR是带有的消息 描述a的特定格式 数据库变更。捕获过程 重新格式化从中捕获的更改 重做登录LCR和应用程序 可以构建LCR。如果改变了 数据操作语言(DML) 操作,然后每个LCR封装 由DML导致的行更改 操作到共享表 源数据库。如果变化是 数据定义语言(DDL) 操作,然后LCR封装 DDL的变化是对 源上的共享数据库对象 数据库中。
传播传播分段 LCR到另一个队列,通常 驻留在独立的数据库中 来自LCR所在的数据库 抓获。 LCR可以传播到 它到来之前有很多队列 在目的地数据库。
在目标数据库中,申请 过程消耗变化 将LCR应用于共享 数据库对象。申请流程可以 将LCR出列并直接应用, 或申请程序可以使该项目出列 LCR并将其发送给应用处理程序。 在Streams复制环境中, 应用处理程序执行自定义 处理LCR然后适用 LCR到共享数据库对象。