仅当远程 table 可访问或在 oracle 中具有完整数据时才截断本地 table

Truncate local table only when Remote table is accessible or have complete data in oracle

我遇到了一个很难找到解决方案的问题。希望本社区的各位大侠解决。

我每天都通过数据库链接将 table 从一个数据库 (T_TAGS_REMOTE) 复制到另一个数据库 (T_TAGS_LOCAL) 的 table。为此,我先截断 T_TAGS_LOCAL table 然后执行插入。 以上任务是通过 Linux 作业完成的。

问题来的时候

  1. 有时无法访问来自远程数据库的 T_TAGS_REMOTE,出现 ORA 错误
  2. 有时 T_TAGS_REMOTE 没有完整的数据行(即 SYSDATE COUNT < SYSDATE-1 COUNT)

要求: STOP truncating STOP inserting 当遇到上述问题(1)或(2)中的任何一个时

我的代码:

BEGIN
SELECT COUNT(1) AS OLD_RECORDS_COUNT FROM T_TAGS_LOCAL;
EXECUTE IMMEDIATE 'TRUNCATE TABLE T_TAGS_LOCAL';
INSERT /*+ APPEND */ INTO T_TAGS_LOCAL SELECT * FROM AK.T_TAGS_REMOTE@NETCOOL;

END;
/

请建议 table 副本或代码的更好选项来处理此问题。

更好的选择可能是使用 实体化视图。按照您现在的方式,您可以使用通过 DBMS_JOBDBMS_SCHEDULER.

安排的数据库作业 按需 刷新它

我不会使用您正在使用的技术,它总是会产生问题。相反,我认为您的用例适合使用物化视图进行复制。源中的实体化视图日志,以及目标中使用 dblink 的实体化视图

你只需要决定刷新方法,这可以是快速提交,因为我猜你的 table 不是很大,因为你每天都在复制整个 table .

示例

来源

SQL> create table t ( c1 number primary key, c2 number ) ;

Table created.

SQL>  declare
 begin
 for i in 1 .. 100000
 loop
 insert into t values ( i , dbms_random.value ) ;
 end loop;
 commit ;
 end;
 /  2    3    4    5    6    7    8    9

PL/SQL procedure successfully completed.

SQL> create materialized view log on t with primary key ;

Materialized view log created.

SQL> select count(*) from t ;

  COUNT(*)
----------
    100000

在目标中

SQL> create materialized view my_copy_of_t build immediate refresh fast on demand as 
     select * from your_source@your_db_link

-- To refresh in target

SQL> select count(*) from my_copy_of_t ;

  COUNT(*)
----------
    100000

现在,我们换源

SQL> insert into t values ( 100001 , dbms_random.value );

1 row inserted

SQL> commit ;

Commit completed.

在目标中,用于刷新

SQL> exec dbms_mview.refresh('MY_COPY_OF_T');

FAST REFRESH ON DEMAND 的唯一要求是您必须为属于实体化视图的每个 table 提供一个实体化视图日志。在您的情况下,当您复制 table 时,您只需要源 table.

上的物化视图日志