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
源端:
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
相关文章推荐
- ogg 、 Shareplex和DSG RealSync 对比
- 【简介】DSG RealSync数据库同步复制异构容灾软件
- dsg realsync 新加表同步
- 【白皮书】DSG RealSync数据库同步复制容灾_Oracle
- DSG RealSync与Falcon CDP的容灾技术对比
- DSG RealSync VS. Quest Shareplex
- DSG RealSync VS. Quest Shareplex
- DSG realsync 源端抽取lob字段报错
- DSG realsync 表空间映射
- DSG realsync 跳过xf1文件相关对象的操作
- ORA-01779: 无法修改与非键值保存表对应的列,bug
- Realtime-Modifier Bug Report | Realtime-Modifier Bug 反馈
- Aop RealProxy 千年遇BUG
- bug -- ORA-12170:TNS:连接超时
- ORA-00001: unique constraint pk_****_key violated oracle imp 语句导入数据对oracle的数据字段操作顺序
- oracle数据库主键约束删除之后依然报错ORA-00001: unique constraint(违反唯一约束)
- Bug:plsql ora-12557(协议适配器不可加载,win8.1,64)
- Aop RealProxy 千年遇BUG
- 捕获“ORA-00001: 违反唯一约束条件”异常并抛出业务相关的错误信息
- Caused by: java.sql.BatchUpdateException: ORA-00001: 违反唯一约束条件