仅当远程 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 作业完成的。
问题来的时候
- 有时无法访问来自远程数据库的 T_TAGS_REMOTE,出现 ORA 错误
- 有时 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_JOB
或 DBMS_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.
上的物化视图日志
我遇到了一个很难找到解决方案的问题。希望本社区的各位大侠解决。
我每天都通过数据库链接将 table 从一个数据库 (T_TAGS_REMOTE) 复制到另一个数据库 (T_TAGS_LOCAL) 的 table。为此,我先截断 T_TAGS_LOCAL table 然后执行插入。 以上任务是通过 Linux 作业完成的。
问题来的时候
- 有时无法访问来自远程数据库的 T_TAGS_REMOTE,出现 ORA 错误
- 有时 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_JOB
或 DBMS_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.
上的物化视图日志