[Oracle] Datapump 시 table_exists_action 옵션 (truncate vs replace)

728x90

truncate vs replace

기존에 데이터가 존재하는 테이블에 대해서 오브젝트 단위의 복구 또는 데이터 이관을 위해 impdp와 함께 table_exists_action 옵션을 사용하게 되는데, truncate 옵션을 사용하게 되면 의존성 문제에 부딪히게 됩니다.

table_exists_action=truncate

* 해당 테이블을 truncate하고 import

만약 모종의 이유로

1) Unique Index나 PK로 인해 무결성 제약조건에 위배되는 데이터가 포함된 테이블을 Import 한다든가

(왜 무결성 제약조건이 있음에도 불구하고 해당 테이블이 제약조건을 어기는 데이터를 포함하고 있는지는 히스토리를 모른다면 추적이 쉽지 않겠죠. 일시적으로 제약조건을 비활성화하고 데이터를 추가했을 수도 있고, 테이블을 처음에 생성할 때는 제약조건이 없었으나 후에 추가했을 수도 있습니다)

ORA-31693: table data object … failed to load … and is being skipped due to error
ORA-00001: unique constraint … violated

2) FK가 참조하고 있는 부모 테이블을 truncate하려 하면

ORA-02266: unique/primary keys in table referenced by enabled foreign keys
ORA-00955: name is already used by an existing object

에러가 발생하면서 해당 테이블과 관련된 오브젝트들이 모두 truncate 되지 않고 스킵됩니다.

(그밖의 여러 상황들이 있을 수 있겠습니다)

스킵된 오브젝트들만 걸러내서 오브젝트별로 재생성하려 하면 복잡성이 이만저만이 아니죠.

그럴 때 에러 없이 의존성 문제를 말끔히 해결하면서 데이터를 import 하는 방법이 바로

table_exists_action=replace 옵션을 사용하는 방법입니다.

table_exists_action=replace

* 원본 테이블을 drop하고 create 후 import

import 로그를 보면 단순히 원본 테이블만을 drop하는 게 아니라,

테이블과 연관된 오브젝트들을 모두 의존성에 맞게 재생성하는 모습을 볼 수 있습니다.

의존성 문제가 깔끔하게 해결되며 데이터가 들어가기 때문에 복잡성이 훨씬 줄어들죠.

결론

기존 DB에 데이터가 존재하는 상황에서 impdp 시 의존성 문제를 해결하면서 데이터를 넣고 싶다면 replace 옵션을 고려해보시기 바랍니다.

 

 

728x90