您的位置:首页 > 产品设计 > UI/UE

DSG realsync BUG 之ORA-00001: unique constraint

2012-12-13 17:42 295 查看
现象模拟:

源端:

CREATE TABLE SCOTT.TEST_PK

( CATEGORY_ID VARCHAR2(40 BYTE) NOT NULL,

SEQUENCE_NUM NUMBER(38) NOT NULL,

CHILD_PRD_ID VARCHAR2(40 BYTE) NOT NULL);

CREATE INDEX SCOTT.CT_CHLDPRD_CID_IDX ON SCOTT.TEST_PK(CATEGORY_ID);

CREATE INDEX SCOTT.CT_CHLDPRD_CPI_IDX ON SCOTT.TEST_PK(CHILD_PRD_ID);

CREATE UNIQUE INDEX SCOTT.TEST_PK_P ON SCOTT.TEST_PK(CATEGORY_ID, SEQUENCE_NUM);

ALTER TABLE SCOTT.TEST_PK ADD (CONSTRAINT TEST_PK_P PRIMARY KEY (CATEGORY_ID, SEQUENCE_NUM) USING INDEX SCOTT.TEST_PK_P);

SQL> insert into TEST_PK values('1',5,'3');

1 row created.

SQL> insert into TEST_PK values('1',4,'2');

1 row created.

SQL> insert into TEST_PK values('1',3,'1');

1 row created.

SQL> commit;

Commit complete.

SQL> set lines 200

SQL> select * from TEST_PK;

CATEGORY_ID SEQUENCE_NUM CHILD_PRD_ID

---------------------------------------- ------------ ----------------------------------------

1 3 1

1 4 2

1 5 3

update

SQL> UPDATE TEST_PK SET SEQUENCE_NUM = CHILD_PRD_ID WHERE CATEGORY_ID = 1;

3 rows updated.

SQL> commit;

Commit complete.

SQL>

目标端日志:

Loader: 14.xf1 OCI Error -1 occurred at File xf1_to_oracle_upd_rid.c:1158.

ORA-00001: unique constraint (SCOTT_DSG.TEST_PK_P) violated

OCI Error -1 occurred at File xf1_to_oracle_upd_rid.c:1158.

ORA-00001: unique constraint (SCOTT_DSG.TEST_PK_P) violated

Error to execute SQL statement:

UPDATE "SCOTT_DSG"."TEST_PK" SET "SEQUENCE_NUM"=:1 WHERE ROWID=:2 RETURNING ROWID INTO :3

Error occurs at "UPDATE"

ERROR rowid: AAASABAAEAAAACsAAA (00012001.010000AC.0000)

: 00011FFA.00012001.010000AC.0000 B5(URP) --H-FL-- cc:1/3 len:6

: --H-FL-- cc:1 len:10

: 00011FFA.00012001.010000AC.0001 B5(URP) --H-FL-- cc:1/3 len:6

: --H-FL-- cc:1 len:10

: 00011FFA.00012001.010000AC.0002 B5(URP) --H-FL-- cc:1/3 len:6

: --H-FL-- cc:1 len:10

2012-12-11:05:01:21: (commit) SCN 0x0013.24330001, Time 2012-12-11 05:01:22

问题分析:

DSG在目标端加载是安装rowid一条一条记录加载,这样会出现一个问题就是组合列的主键或是唯一索引需要检查唯一性,这样有时就会违反约束

临时的解决方法:

将约束改为延迟校验,到提交是才验证唯一性,需要更改目标端的约束,比较麻烦

drop index TEST_PK_P;

ALTER TABLE SCOTT.TEST_PK ADD (CONSTRAINT TEST_PK_P PRIMARY KEY (CATEGORY_ID, SEQUENCE_NUM)(CATEGORY_ID,SEQUENCE_NUM) deferrable initially deferred ;

修改目标端的data_load.ini

全同步时,不drop index ,同步不做任何做的

[index]

# option: drop - drop index before full sync.

# unusable - set indexes unuseable before full sync.

# no - no action.

before_full_sync = no

# option: rebuild - rebuild index after full sync.

# create - no action.

# none - no action.

after_full_sync = none

重新全同步出问题的表,关于重新同步表,或是新加同步表可以参照:

/article/9899554.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: