单向streams复制,是不是要更改的栏位值要相同?

[复制链接]
查看11 | 回复9 | 2005-8-5 01:01:25 | 显示全部楼层 |阅读模式
[php]
*************************************************
----- ERROR #4
----- Local Transaction ID: 2.7.421
----- Source Database: OPDB
----Error in Message: 1
----Error Number: 1403
----Message Text: ORA-01403: no data found

--message: 1
type name: SYS.LCR$_ROW_RECORD
source database: OPDB
owner: HR
object: JOBS
is tag null: Y
command_type: UPDATE
old(1): JOB_ID
PR_REP
old(2): MAX_SALARY
30000
new(1): MAX_SALARY
45000
PL/SQL procedure successfully completed.
[/php]
打印了错误,大致发现了是什么原因引起的
我在源端:
strmadmin@OPDB> select * from hr.jobs where job_id = 'PR_REP';
JOB_ID
JOB_TITLE
MIN_SALARY MAX_SALARY
-------------------- ------------------------- ---------- ----------
PR_REP
Public Relations Represen 400030000

tative
strmadmin@OPDB> update hr.jobs set MAX_SALARY = 45000 wherejob_id = 'PR_REP';
1 row updated.
strmadmin@OPDB> commit;
目标端如下:
strmadmin@ICWEB> select * from hr.jobs where job_id = 'PR_REP';
JOB_ID
JOB_TITLE
MIN_SALARY MAX_SALARY
-------------------- ------------------------------ ---------- ----------
PR_REP
Public Relations Representativ 500020000

e
发现dml没有应用过去。看了error的信息,原来是源跟目标的MAX_SALARY值不同,我当初的理解是即使目标端的MAX_SALARY的值不等于源端的值,也会应用成45000的。可是结果不是这样,我的这个是单向复制,而且shareplex是可以复制的,即使要更新的值不同
后来我在目标端
update hr.jobs set MAX_SALARY = 45000 wherejob_id = 'PR_REP';
手工同步了下,就可以了
回复

使用道具 举报

千问 | 2005-8-5 01:01:25 | 显示全部楼层
为了防止并发,应用时的SQL是这样的:
update xxx set .. where job_id='xxx' and max_salary=old_salary;
所以你不能在目标端手工去修改数据...
回复

使用道具 举报

千问 | 2005-8-5 01:01:25 | 显示全部楼层
最初由 xzh2000 发布
[B]为了防止并发,应用时的SQL是这样的:
update xxx set .. where job_id='xxx' and max_salary=old_salary;
所以你不能在目标端手工去修改数据... [/B]

恩,所以一般目标端都是read only的
回复

使用道具 举报

千问 | 2005-8-5 01:01:25 | 显示全部楼层
最近在配置Stream,Data Guard的人好像很多耶


回复

使用道具 举报

千问 | 2005-8-5 01:01:25 | 显示全部楼层
一般单向streams要在目标端的表设置:
EXEC DBMS_APPLY_ADM.COMPARE_OLD_VALUES(object_name => 'HR.JOBS', column_list => '*', compare => false);
这样就不会比较旧值, 直接覆盖更新.
有时间整理个流的应用文档给大家参考.


回复

使用道具 举报

千问 | 2005-8-5 01:01:25 | 显示全部楼层
最初由 teddyboy 发布
[B]一般单向streams要在目标端的表设置:
EXEC DBMS_APPLY_ADM.COMPARE_OLD_VALUES(object_name => 'HR.JOBS', column_list => '*', compare => false);
这样就不会比较旧值, 直接覆盖更新.
有时间整理个流的应用文档给大家参考.

[/B]

teddyboy,好人啊
我也觉得应该会有这样的过程可以忽略旧值,可是文档还没有来的及仔细的看,呵呵
回复

使用道具 举报

千问 | 2005-8-5 01:01:25 | 显示全部楼层
最初由 orientzkd 发布
[B]
teddyboy,好人啊
我也觉得应该会有这样的过程可以忽略旧值,可是文档还没有来的及仔细的看,呵呵 [/B]

不可以忽略旧值?
目标端
strmadmin@ICWEB> select * from hr.jobs where job_id = 'PR_REP';
JOB_ID
JOB_TITLE
MIN_SALARY MAX_SALARY
-------------------- ------------------------------ ---------- ----------
PR_REP
Public Relations Representativ 600023456

e

strmadmin@ICWEB> EXEC DBMS_APPLY_ADM.COMPARE_OLD_VALUES(object_name => 'HR.JOBS', column_list => '*', compare => false);
PL/SQL procedure successfully completed.
strmadmin@ICWEB> select * from hr.jobs where job_id = 'PR_REP';
JOB_ID
JOB_TITLE
MIN_SALARY MAX_SALARY
-------------------- ------------------------------ ---------- ----------
PR_REP
Public Relations Representativ 600023456

e

strmadmin@OPDB> select * from hr.jobs where job_id = 'PR_REP';
JOB_ID
JOB_TITLE
MIN_SALARY MAX_SALARY
-------------------- ------------------------- ---------- ----------
PR_REP
Public Relations Represen 500023456

tative

strmadmin@OPDB> update hr.jobs set MIN_SALARY = 7000 where job_id = 'PR_REP';
1 row updated.
strmadmin@OPDB> commit;
Commit complete.
strmadmin@OPDB> select * from hr.jobs where job_id = 'PR_REP';
JOB_ID
JOB_TITLE
MIN_SALARY MAX_SALARY
-------------------- ------------------------- ---------- ----------
PR_REP
Public Relations Represen 700023456

tative
回复

使用道具 举报

千问 | 2005-8-5 01:01:25 | 显示全部楼层
那个过程要commit;
回复

使用道具 举报

千问 | 2005-8-5 01:01:25 | 显示全部楼层
最初由 teddyboy 发布
[B]那个过程要commit; [/B]

果然,
准备周末仔细看下文档
对了,对于dba_apply_error里的错误信息,一般是怎么处理的?手工去同步目标库么
同步完成之后,这个view里的错误信息不会消失吧
回复

使用道具 举报

千问 | 2005-8-5 01:01:25 | 显示全部楼层
最初由 orientzkd 发布
[B]
果然,
准备周末仔细看下文档
对了,对于dba_apply_error里的错误信息,一般是怎么处理的?手工去同步目标库么
同步完成之后,这个view里的错误信息不会消失吧 [/B]

一般用来定位错误,手工同步不可能。解决错误以后,dbms_apply_adm.execute_all_errors有这个过程可以执行,但是一般很少这么做,因为等你重新执行原来的事务,那新的改变就被覆盖了。一般系统稳定以后dba_apply_error错误很少。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行