使用ORA_ROWSCN将表从源归档到远程数据库

时间:2017-01-10 11:52:18

标签: sql oracle oracle11g

我们有一个庞大的表,可以获得大量的交易,但没有时间戳列来了解它何时更新。我们的一位DBA建议我们可以在SP内部使用ORA_ROWSCN来了解最近更新/插入的行,并通过数据库链接将它们发送到远程(存档)数据库。

select max(ora_rowscn) max_rowscn from huge_table where ora_rowscn <= timestamp_to_scn(trunc(sysdate));

然后发送行以便存档,如下所示:

select * from huge_table where ora_rowscn<=max_rowscn /* from previous query */

这样做是个好主意吗?这种情况通常如何在Oracle中处理?

3 个答案:

答案 0 :(得分:2)

我认为您不想对数据库进行任何重大更改。否则,您可以使用专门为此目的构建的Oracle机制,例如Oracle Streams

使用ORA_ROWSCN查询可以帮助您进行设置。但是你需要意识到它只能在块级别跟踪并且不精确,而只是上限。另请参阅ORA_ROWSCN Pseudocolumn

因此,您的解决方案必须能够处理将行发送到存档数据库的情况,即使它们尚未更改。不应发生另一种情况(行已更改但未发送)。

答案 1 :(得分:1)

我同意@Codo的解决方案。由于以下原因,可以使用Oracle流或Oracle数据保护产品来解决您的问题。

  1. 你有一张巨大的表,就CPU和磁盘资源而言,全表扫描将成为非常昂贵的解决方案。
  2. 由于行扫描数据维持在块级别,并且您无法知道块中的哪些记录已更新,因此该方法不是最佳方法。在这种方法中,有可能最终复制超过一半的HUGE表,这是非常耗费资源的。
  3. <强>解决方案

    • 如果您准备好在HUGE表的每次更新期间影响性能影响,我建议使用基于触发器的方法。每次更新表时,都会添加一个条目以标识行(即使是rowid,注意:行上的rowid不是最终的,并且可能由于多种原因而更改)并将它们存储在新表中。使用此表作为参考将数据移动到存档表。对更新操作的响应时间会有影响,但这仍然比您现在考虑的方法要少得多。

    • 其他选项是使用archivelogs将异步数据复制设置到您的归档数据库中。这种方法很经典,涉及对表结构或数据的更改之外的解决方案。这个链接可以帮到你。 https://docs.oracle.com/cd/B28359_01/server.111/b28313/cdc.htm

答案 2 :(得分:1)

Oracle可以选择在行级别跟踪ora_rowscn。 但不幸的是,在创建表格时必须打开此选项。

始终可以创建新表并填充它。 &#39; dbms_redefinition或插入选项&#39; create table xxx (blbl, ble, ble) rowdependencies;

但有一个问题仍然存在。您无法计算旧日期的row_scn。

select timestamp_to_scn(trunc(sysdate-100)) from dual; 查询应该提高摘要 ORA-08180: no snapshot found based on specified time

解决方案是在其他地方保存先前的rowscn