ITPUB??ì3
ITPUB论坛 » Oracle数据库管理 » dbms_rectifier_diff解决高级复制中的数据冲突问题的研究

标题: [精华] dbms_rectifier_diff解决高级复制中的数据冲突问题的研究
离线 Arrayeygle
天下有雪


精华贴数 65
个人空间 0
技术积分 206544 (1)
社区积分 6443 (224)
注册日期 2001-10-8
论坛徽章:57
现任管理团队成员2007年度ITPUB杰出贡献ITPUB长老会成员ITPUB元老ITPUB维基人授权会员
2008北京奥运纪念徽章:射击生肖徽章2007版:鼠2008年新春纪念徽章生肖徽章2007版:猴生肖徽章2007版:龙ITPUB新首页上线纪念徽章

发表于 2005-1-19 20:47 
dbms_rectifier_diff解决高级复制中的数据冲突问题的研究

关于dbms_rectifier_diff包的基本用法参考:
http://www.eygle.com/archives/2005/01/eoadbms_rectifi.html

本文链接:
http://www.eygle.com/archives/2005/01/oeouoracleaeiao.html

实际上Oracle的dbms_rectifier_diff.DIFFERENCES过程,内部操作就是执行连个minus操作
把两边的差异记录下来,作为冲突解决的数据。

可是注意,如果在解决这个问题时你没有挂起复制,Oracle得到的数据可能是存在问题的。
而且,如果你不指定column list,那么两边的数据可能会因为某些特殊字段(如时间字段)的特殊处理而存在差异。

那么这时候手工介入不可避免。

我们首先先把两个重要参数的用法说明一下。
一个是WHERE_CLAUSE,另外一个是COLUMN_LIST。

WHERE_CLAUSE用于限定进行差异比较的范围,这可以极大的缩减结果集的数量,使用索引加快访问速度等。
比如我这里使用NUMGENDER=1,只比较性别为"女"这一部分用户数据。

COLUMN_LIST用于限定比较字段,如果你能通过某个字段,如主键等确定数据差异,那么你完全可以只比较单个字段。
而且显然可以轻易通过全索引扫描来完成比较,加快比较速度。
我这里使用NUMUSERID,用户ID来比较。
但是注意,这样的比较结果中将只包含NUMUSERID信息,当然我们可以轻易通过NUMUSERID和原表的比较补全MISSING_ROWS_TEST表的信息。
PHP code:


begin dbms_rectifier_diff
.DIFFERENCES(

SNAME1                         =>'HAWA',

ONAME1                         =>'TEST',

REFERENCE_SITE                 =>'AVATAR.COOLYOUNG.COM.CN',

SNAME2                         =>'HAWA',

ONAME2                         =>'TEST',

COMPARISON_SITE                =>'AUTHAA.COOLYOUNG.COM.CN',

WHERE_CLAUSE                   =>'NUMGENDER=1',

COLUMN_LIST                    =>'NUMUSERID',

MISSING_ROWS_SNAME             =>'HAWA',

MISSING_ROWS_ONAME1            =>'MISSING_ROWS_TEST',

MISSING_ROWS_ONAME2            =>'MISSING_LOCATION_TEST',

MISSING_ROWS_SITE              =>'AVATAR.COOLYOUNG.COM.CN',

MAX_MISSING                    =>500,

COMMIT_ROWS                    =>100

);

end;

/

这段代码供参考。

Ok,我们继续前面的讨论。
我们提到,如果存在差异,通常需要手工介入。

清楚了DIFFERENCES的原理,实际上我们完全可以手工来完成这个过程。
以下是我的手工操作步骤,目的是为了准确性及减轻数据库压力:

1.首先创建一个ID差异表

这个表不是必须的,这里是为了清晰
PHP code:


SQL
create table hawa.prof as select NUMUSERID from hawa.hw_user where 1=0;



Table created.



Elapsed00:00:00.16

.

2.根据主键找到差异记录
注意这里取决于你的数据库产生差异的原因,我的差异由于初始数据不同步,即A全包含B并且,A>B。
PHP code:


SQL
insert into hawa.prof

  2  select 
from 

  3  
(

  
4  select NUMUSERID from hawa.HW_USERPROFILE

  5  minus

  6  select NUMUSERID from hawa
.HW_USERPROFILE@authaa)

  
7  /



263 rows created.



Elapsed00:00:32.49

.

3.创建记录表
PHP code:


SQL
create table hawa.missing_rows_hw_userprofile

  2  
as

  
3  select from hawa.hw_userprofile where 1=0;



Table created.



Elapsed00:00:

SQL
create table hawa.MISSING_LOC_hw_userprofile (

  
2  present VARCHAR2(128),

  
3  absent VARCHAR2(128),

  
4  r_id ROWID);



Table created.



Elapsed00:00:00.04

.

4.根据差异信息查询到完整信息
PHP code:


SQL
insert into hawa.missing_rows_hw_userprofile    

  2  select 
from hawa.hw_userprofile where NUMUSERID in

  3  
(select from hawa.prof);



263 rows created.



Elapsed00:00:00.06

SQL
commit;



Commit complete.



Elapsed00:00:00.02

.

5.构造位置信息
注意这里的方向信息及ROWID信息。
PHP code:


SQL
insert into hawa.MISSING_LOC_hw_userprofile

  2  select 
'AVATAR.COOLYOUNG.COM.CN','AUTHAA.COOLYOUNG.COM.CN',rowid from hawa.missing_rows_hw_userprofile;



263 rows created.



Elapsed00:00:00.00

SQL
commit;



Commit complete.



Elapsed00:00:00.06



.

6.纠正数据冲突
PHP code:


SQL
BEGIN DBMS_RECTIFIER_DIFF.RECTIFY(

  
2  SNAME1                         =>'HAWA',

  
3  ONAME1                         =>'HW_USERPROFILE',

  
4  REFERENCE_SITE                 =>'AVATAR.COOLYOUNG.COM.CN',

  
5  SNAME2                         =>'HAWA',

  
6  ONAME2                         =>'HW_USERPROFILE',

  
7  COMPARISON_SITE                =>'AUTHAA.COOLYOUNG.COM.CN',

  
8  COLUMN_LIST                    =>NULL,

  
9  MISSING_ROWS_SNAME             =>'HAWA',

 
10  MISSING_ROWS_ONAME1            =>'MISSING_ROWS_HW_USERPROFILE',

 
11  MISSING_ROWS_ONAME2            =>'MISSING_LOC_HW_USERPROFILE',

 
12  MISSING_ROWS_SITE              =>'AVATAR.COOLYOUNG.COM.CN',

 
13  COMMIT_ROWS                    =>100

 14  
);

 
15  END;

 
16  /



PL/SQL procedure successfully completed.



Elapsed00:00:03.53

.

7.验证结果
PHP code:


SQL
select count(*) from hawa.HW_USERPROFILE;



  
COUNT(*)

----------

   
1746300



Elapsed
00:00:02.22

SQL
select count(*) from hawa.HW_USERPROFILE@authaa;



  
COUNT(*)

----------

   
1746300



Elapsed
00:00:00.21



SQL
select count(*) from hawa.HW_USERPROFILE;



  
COUNT(*)

----------

   
1746300



Elapsed
00:00:00.59



SQL
>select count(*) from hawa.HW_USERPROFILE@authaa;



  
COUNT(*)

----------

   
1746300



Elapsed
00:00:00.20

SQL
select NUMUSERID from hawa.HW_USERPROFILE

  2  minus

  3  select NUMUSERID from hawa
.HW_USERPROFILE@authaa   ;



no rows selected



Elapsed
00:00:23.51

SQL
>

That's all.


__________________
只看该作者    顶部
离线 grassbell
深入讨论区斑竹


精华贴数 9
个人空间 0
技术积分 11852 (99)
社区积分 365 (1643)
注册日期 2003-6-13
论坛徽章:6
管理团队成员ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念管理团队2006纪念徽章会员2006贡献徽章授权会员
      

发表于 2005-1-19 21:00 
明天来学习!


__________________
不是自己的,多研究,多做实验,把心得写出来,变成自己的

欢迎访问Alibaba DBA 团队Blog: www.alidba.net
只看该作者    顶部
离线 yangtingkun
版主


精华贴数 12
个人空间 24158
技术积分 47516 (12)
社区积分 3159 (418)
注册日期 2001-12-29
论坛徽章:109
现任管理团队成员奥运纪念徽章NBA季后赛大富翁2008北京奥运纪念徽章:自行车2008北京奥运纪念徽章:曲棍球2008北京奥运纪念徽章:跳水
2008北京奥运纪念徽章:拳击2008北京奥运纪念徽章:柔道2008北京奥运纪念徽章:皮划艇静水2008北京奥运纪念徽章:体操2008北京奥运纪念徽章:曲棍球2008北京奥运纪念徽章:篮球

发表于 2005-1-19 23:07 


eygle对冲突解决方案也有研究?


__________________
学习ORACLE最大的障碍是什么——浮躁

http://yangtingkun.itpub.net

个人BLOG文章索引:http://www.itpub.net/showthread.php?s=&threadid=699527

11g的一点研究:http://www.itpub.net/852861.html
只看该作者    顶部
离线 Kamus
版主


精华贴数 51
个人空间 400
技术积分 46463 (13)
社区积分 3555 (373)
注册日期 2002-5-26
论坛徽章:29
现任管理团队成员2007年度ITPUB最佳技术原创精华ITPUB元老Heart of PUBITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章
参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章会员2007贡献徽章会员2006贡献徽章授权会员

发表于 2005-1-20 00:41 
呵呵,eygle开始进入复制的领域了
congratulations!


__________________
有事情请发Gmail邮箱,站内IM可能不能及时回复。    

***Chanel [K]***

从明天起, 做一个幸福的人  
喂马, 劈柴, 周游世界  
从明天起, 关心粮食和蔬菜  
我有一所房子 面朝大海, 春暖花开
只看该作者    顶部
离线 eygle
天下有雪


精华贴数 65
个人空间 0
技术积分 206544 (1)
社区积分 6443 (224)
注册日期 2001-10-8
论坛徽章:57
现任管理团队成员2007年度ITPUB杰出贡献ITPUB长老会成员ITPUB元老ITPUB维基人授权会员
2008北京奥运纪念徽章:射击生肖徽章2007版:鼠2008年新春纪念徽章生肖徽章2007版:猴生肖徽章2007版:龙ITPUB新首页上线纪念徽章

发表于 2005-1-20 08:53 


QUOTE:
最初由 yangtingkun 发布


eygle对冲突解决方案也有研究?


作了个基于WAN的同步复制。
很多问题要开始面对了



__________________
只看该作者    顶部
离线 lihaifan168
**驿马家族**



精华贴数 0
个人空间 0
技术积分 26 (44679)
社区积分 0 (857732)
注册日期 2006-4-13
论坛徽章:0
      
      

发表于 2006-6-20 12:02 
复制。。。。。


__________________
我戍守边塞 曾吹一根羌管 唤你柳枝一般依依的名字 曾持一杆铁戟勾画你桃花一般灼灼的容貌 曾拔一张硬弓形 弹出你的步态如自在的春水 催魂的号角冻哑的时候 胡骑退了 猎猎向南飘散的 是我慧星的长发竟想拂去你的眉际间冷调子的愁绪我的双手再不能前移一步血性的大潮跌落身躯迅速地风化着断矛和箭羽在我的伤口上繁衍成一片胡杨林为了呼应你频频呵出的几乎无法感受到的春天
只看该作者    顶部
离线 notfox
中级会员



精华贴数 0
个人空间 0
技术积分 472 (4042)
社区积分 95 (3466)
注册日期 2001-10-16
论坛徽章:1
授权会员     
      

发表于 2006-6-20 16:53 
感觉复制跟应用的逻辑关系太密切了,冲突解决方案也解决不了很多问题


只看该作者    顶部
离线 hanjs
高级会员


精华贴数 1
个人空间 0
技术积分 9710 (122)
社区积分 51 (4752)
注册日期 2006-7-30
论坛徽章:15
会员2007贡献徽章蓝色妖姬嫦娥授权会员数据库板块每日发贴之星数据库板块每日发贴之星
2008年新春纪念徽章生肖徽章2007版:鼠生肖徽章2007版:鸡ITPUB新首页上线纪念徽章生肖徽章:蛇生肖徽章:兔

发表于 2007-3-17 21:29 
学习了!


__________________
Database Concepts
Database Performance Tuning Guide and Reference
只看该作者    顶部
离线 ardede
初级会员



精华贴数 0
个人空间 0
技术积分 12 (79305)
社区积分 0 (1574554)
注册日期 2007-9-30
论坛徽章:0
      
      

发表于 2007-10-8 10:03 
学习中~~


只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问