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;