我们有一个庞大的表,可以获得大量的交易,但没有时间戳列来了解它何时更新。我们的一位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中处理?
答案 0 :(得分:2)
我认为您不想对数据库进行任何重大更改。否则,您可以使用专门为此目的构建的Oracle机制,例如Oracle Streams
使用ORA_ROWSCN查询可以帮助您进行设置。但是你需要意识到它只能在块级别跟踪并且不精确,而只是上限。另请参阅ORA_ROWSCN Pseudocolumn。
因此,您的解决方案必须能够处理将行发送到存档数据库的情况,即使它们尚未更改。不应发生另一种情况(行已更改但未发送)。
答案 1 :(得分:1)
我同意@Codo的解决方案。由于以下原因,可以使用Oracle流或Oracle数据保护产品来解决您的问题。
<强>解决方案强>
如果您准备好在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