EXPDP/IMPDP CONSTRAINTS W trybie DATA_ONLY

Witam drogich zainteresowanych,

ostatnio natknałem się na dość oczywisty, choć dopiero po przemyśleniu , przypadek.

Zgodnie z procedurą dodawania węzła do Multi-Master Replication w pierwszym kroku miałem za zadanie odtworzyć strukturę obiektów które będą replikowane. Do tego celu , pomyślałem , że najłatwiej użyć DataPump expdp w trybie exportu METADANYCH.

Stąd na maszynie źródłowej:

expdp system/oracle DIRECTORY=DATA_PUMP_DIR DUMPFILE=junit_t1.dmp CONTENT=METADATA_ONLY SCHEMAS=JUNI INCLUDE=TABLE,INDEX 

A na maszynie docelowej :

impdp userid=system/oracle directory=DATA_PUMP_DIR dumpfile=junit_t1.dmp FULL=Y

Po wykonaniu kolejnych kroków przyszedł czas na wyrównanie danych przed włączeniem replikacji na nowym Master Site (zgodnie z oficjalną procedurą podczas dodawania tabeli replikowanej zawierającej klucz główny) :

Również do tego idealnie nadaje się narzędzie expdp w trybie DATA_ONLY , umożliwiając podanie SCN do którego chcemy uzyskać spójność danych (wymagane przy procedurze dodawania węzła bez wyciszania grupy replikacyjnej)

expdp system/oracle DIRECTORY=DATA_PUMP_DIR SCHEMAS=JUNI DUMPFILE=junit_scn.dmp CONTENT=data_only FLASHBACK_SCN=513950

Na maszynie docelowej:

impdp userid=system/oracle directory=DATA_PUMP_DIR dumpfile=junit_t1.dmp FULL=Y

I tu niespodzianka:

Starting “SYSTEM”.”SYS_IMPORT_FULL_01″:  userid=system/******** directory=DATA_PUMP_DIR dumpfile=junit_t1s2
.dmp FULL=Y
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
ORA-31693: Table data object “JUNIT”.”BONUS” failed to load/unload and is being skipped due to error:
ORA-02291: integrity constraint (JUNIT.BONUS_SAL2_FK) violated – parent key not found

Przyzwyczajony, że podczas normalnych operacji exportu/importu używając narzędzi DataPump nie martwię się o CONSTRAINTY , byłem dość mocno zdziwiony …

Jednak, po głębszym przemyśleniu, skoro najpierw tworzę struktury do których ładuję, nastepnie dane w trybie DATA_ONLY, CONSTRAINTY są nieruszane, nie następuje ich automatyczne wyłączanie i włączanie po zakończonym imporcie …

Ma to nawet sens 🙂 Choć nie powiem, że Oracle niemógłby dodać takiej funkcjonalności … aż się wręcz prosi …

Mała wrzutka, dla ułatwienia odtworzenia Test-Case gdyby ktoś miał ochotę:

Create user JUNIT identified by jt default tablespace USERS quota unlimited on USERS;
GRANT create session, resource to JUNIT;

create table
JUNIT.departments (DEPT_ID NUMBER NOT NULL, DEPT_NAME VARCHAR2(100) NOT NULL,
CONSTRAINT DEP_PK PRIMARY KEY (DEPT_ID));

create table JUNIT.employees (EMP_ID NUMBER NOT NULL, EMP_FNAME VARCHAR2(100),
EMP_LNAME VARCHAR2(100) NOT NULL, REMARKS VARCHAR2(300) ,
CONSTRAINT EMP_PK PRIMARY KEY (EMP_ID));

create table JUNIT.EMPDETAILS (EMP_ID NUMBER NOT NULL, DEPT_ID NUMBER NOT NULL, FLOR_NUM NUMBER NOT NULL,
CONSTRAINT EMPDET_EMP_FK FOREIGN KEY(EMP_ID) REFERENCES JUNIT.EMPLOYEES(EMP_ID),
CONSTRAINT EMPDET_DEP_FK FOREIGN KEY(DEPT_ID) REFERENCES JUNIT.DEPARTMENTS(DEPT_ID),
CONSTRAINT EMPDET_PK PRIMARY KEY(EMP_ID,DEPT_ID));

CREATE TABLE “JUNIT”.”SALARY”
(
“SAL_ID”  NUMBER NOT NULL ENABLE,
“EMP_ID”  NUMBER NOT NULL ENABLE,
“SALARY”  NUMBER NOT NULL ENABLE,
“COMMENT” VARCHAR2(50 BYTE),
CONSTRAINT “SAL_PK” PRIMARY KEY (“SAL_ID”) ENABLE,
CONSTRAINT “SAL_EMP_FK” FOREIGN KEY (“EMP_ID”) REFERENCES “JUNIT”.”EMPLOYEES” (“EMP_ID”) ENABLE
) TABLESPACE “USERS” ;

CREATE TABLE “JUNIT”.”BONUS”
(
“BONUS_ID” NUMBER NOT NULL ENABLE,
“SAL_ID”   NUMBER NOT NULL ENABLE,
“EMP_ID”   NUMBER NOT NULL ENABLE,
“BONUS”    NUMBER NOT NULL ENABLE,
CONSTRAINT “BONUS_PK” PRIMARY KEY (“BONUS_ID”),
CONSTRAINT “BONUS_SAL_FK” FOREIGN KEY (“SAL_ID”) REFERENCES “JUNIT”.”SALARY” (“SAL_ID”) ENABLE,
CONSTRAINT “BONUS_SAL2_FK” FOREIGN KEY (“EMP_ID”) REFERENCES “JUNIT”.”EMPLOYEES” (“EMP_ID”) ENABLE
) TABLESPACE “USERS” ;

insert into DEPARTMENTS values(1,’IT’);
insert into DEPARTMENTS values(2,’MARKETING’);

insert into EMPLOYEES values(1,’Rados�~Baw’,’Cisz’,null);
insert into EMPLOYEES values(2,’Jan’,’Kowalski’,null);

insert into EMPDETAILS values(1,1,1);
insert into EMPDETAILS values(2,2,3);

insert into SALARY values(1,1,11500,’plus bonuses’);
insert into SALARY values(2,2,4500,’plus bonuses’);

insert into BONUS values(1,1,1,2300);
insert into BONUS values(2,2,2,500);

commit;

This entry was posted in Oracle DBA Advanced. Bookmark the permalink.

Leave a Reply