Segmenteinstellungen beim Datapump Import

03.
Juni
2015
Veröffentlicht von: Elke Fritsch

Eigentlich erwartet man beim Import eines Dumpfiles einer Oracle Datenbank der Version 11.2.0.4  in eine andere mit der gleichen Version, den gleichen Schemata und den gleichen Tablespaces keine Probleme. Aber was machen Sie, wenn Sie folgende Fehlermeldung erhalten?

Wenn man keinen Wert für Objekttyp angibt, wird die Transformation auf alle möglichen Typen angewandt.

Beispiele

Um die Auswirkungen der verschiedenen TRANSFORM-Einstellungen zu zeigen, legen wir die Tabelle emp2  im Schema Scott leer neu an und verändern ein paar ihrer Eigenschaften.
(Wenn man die Tabelle vor dem Export nur leert, wird sie mit SEGMENT CREATION IMMEDIATE exportiert).

CREATE TABLE emp2
PCTFREE 0 STORAGE(BUFFER_POOL KEEP)
TABLESPACE example NOLOGGING
AS SELECT * FROM emp WHERE 1=2;

Die Tabelle bekommt einen Primärschlüssel, der auf einem anders benannten Index basiert. Auch hier gibt es ein paar Nicht-Default-Eigenschaften.

ALTER TABLE scott.emp2 ADD CONSTRAINT emp2_pk PRIMARY KEY(empno)
USING INDEX (
CREATE INDEX emp2_empno_idx ON emp2(empno) TABLESPACE indizes
 NOLOGGING STORAGE(INITIAL 100K));

Und jetzt der Export (dafür braucht Scott Lese- und Schreibrechte auf dem Verzeichnis data_pump_dir)

conn / as sysdba
SELECT directory_path FROM dba_directories WHERE directory_name = 'DATA_PUMP_DIR';
-- C:\oracle/admin/o11g/dpdump/
GRANT READ, WRITE ON DIRECTORY data_pump_dir TO scott;

expdp scott/tiger TABLES = emp2 DUMPFILE = data_pump_dir:scott.dmp EXCLUDE = statistics REUSE_DUMPFILES = yes NOLOGFILE = yes

Beim Import lassen wir nur das Metadatenfile erzeugen. Das reicht, um die Unterschiede sichtbar zu machen.

Zum Vergleich der Import ohne Änderungen

Inhalt des Parameterfiles (im Ordner C:\Oracle\admin\o11g\dpdump)

USERID = scott
TABLES = emp2
DUMPFILE = data_pump_dir:scott.dmp
SQLFILE = data_pump_dir:scott_imp_normal.txt
NOLOGFILE = yes

Der Import mit impdp parfile = imp_scott.txt erzeugt das Metadatenfile scott_imp_normal.txt. Hier ein Ausschnitt daraus. Die NON-Default-Eigenschaften und die Segment Creation-Klausel sind fett gedruckt.

CREATE TABLE "SCOTT"."EMP2"
   (    "EMPNO" NUMBER(4,0),
    "ENAME" VARCHAR2(10 BYTE),
    "JOB" VARCHAR2(9 BYTE),
    "MGR" NUMBER(4,0),
    "HIREDATE" DATE,
    "SAL" NUMBER(7,2),
    "COMM" NUMBER(7,2),
    "DEPTNO" NUMBER(2,0)
   ) SEGMENT CREATION DEFERRED
  PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS NOLOGGING
  STORAGE(
  BUFFER_POOL KEEP FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "EXAMPLE" ;

CREATE INDEX "SCOTT"."EMP2_EMPNO_IDX" ON "SCOTT"."EMP2" ("EMPNO")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
  STORAGE( INITIAL 106496)
  TABLESPACE "INDIZES" PARALLEL 1 ;
  ALTER INDEX "SCOTT"."EMP2_EMPNO_IDX" NOPARALLEL;

ALTER TABLE "SCOTT"."EMP2" ADD CONSTRAINT "EMP2_PK" PRIMARY KEY ("EMPNO")
  USING INDEX "SCOTT"."EMP2_EMPNO_IDX"  ENABLE;

Import ohne CREATE SEGMENT-Klausel

In diesem Fall ist SEGMENT_CREATION:N gleichbedeutend mit SEGMENT_CREATION:N:TABLE, weil es die Deferred Segment Creation nur für Tabellen gibt.
Inhalt des Parfiles:

USERID = scott
TABLES = emp2
DUMPFILE = data_pump_dir:scott.dmp
SQLFILE = data_pump_dir:scott_imp_normal.txt
NOLOGFILE = yes
TRANSFORM = SEGMENT_CREATION:N

Inhalt des SQLFiles: Hier fehlt nur SEGMENT CREATION DEFERRED. Alle anderen Einstellungen bleiben erhalten

CREATE TABLE "SCOTT"."EMP2"
   (    "EMPNO" NUMBER(4,0),
    "ENAME" VARCHAR2(10 BYTE),
    "JOB" VARCHAR2(9 BYTE),
    "MGR" NUMBER(4,0),
    "HIREDATE" DATE,
    "SAL" NUMBER(7,2),
    "COMM" NUMBER(7,2),
    "DEPTNO" NUMBER(2,0)
   ) PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS NOLOGGING
  STORAGE(
  BUFFER_POOL KEEP FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "EXAMPLE" ;

CREATE INDEX "SCOTT"."EMP2_EMPNO_IDX" ON "SCOTT"."EMP2" ("EMPNO")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
  STORAGE( INITIAL 106496)
  TABLESPACE "INDIZES" PARALLEL 1 ;
  ALTER INDEX "SCOTT"."EMP2_EMPNO_IDX" NOPARALLEL;

ALTER TABLE "SCOTT"."EMP2" ADD CONSTRAINT "EMP2_PK" PRIMARY KEY ("EMPNO")
  USING INDEX "SCOTT"."EMP2_EMPNO_IDX"  ENABLE;

Import ohne jegliche Segment-Attribute

Die Tabellen werden im Default-Tablespace von Scott erstellt, bekommen die Default-Storage-Werte und sonstige Default-Einstellungen wie LOGGING und NOCOMPRESS.
Inhalt des Parameterfiles:

USERID = scott
TABLES = emp2
DUMPFILe = data_pump_dir:scott.dmp
SQLFILE = data_pump_dir:scott_imp_normal.txt
NOLOGFILE = yes
TRANSFORM = SEGMENT_ATTRIBUTES:N

Ausschnitt aus dem SQLFile:

CREATE TABLE "SCOTT"."EMP2"
   (    "EMPNO" NUMBER(4,0),
    "ENAME" VARCHAR2(10 BYTE),
    "JOB" VARCHAR2(9 BYTE),
    "MGR" NUMBER(4,0),
    "HIREDATE" DATE,
    "SAL" NUMBER(7,2),
    "COMM" NUMBER(7,2),
    "DEPTNO" NUMBER(2,0)
   ) ;
CREATE INDEX "SCOTT"."EMP2_EMPNO_IDX" ON "SCOTT"."EMP2" ("EMPNO") ;
  ALTER INDEX "SCOTT"."EMP2_EMPNO_IDX" NOPARALLEL;
ALTER TABLE "SCOTT"."EMP2" ADD CONSTRAINT "EMP2_PK" PRIMARY KEY ("EMPNO")
  USING INDEX "SCOTT"."EMP2_EMPNO_IDX"  ENABLE;

Erwartungsgemäß werden bei den Einstellungen TRANSFORM=SEGMENT_ATTRIBUTES:N:TABLE und TRANSFORM=SEGMENT_ATTRIBUTES:N:INDEX jeweils die Segment-Eigenschaften der Tabelle bzw. des Indexes selektiv ausgeblendet.
Beim Import mit TRANSFORM=SEGMENT_ATTRIBUTES:N:CONSTRAINT werden alle Segment-Eigenschaften angegeben, das kann man sich also eher sparen.

Import ohne Storage-Klausel

Das ist keine Lösung für das Problem der Deferred Segment Creation beim Import in die Standard Edition, sondern zeigt nur eine weitere Möglichkeit des TRANSFORM-Parameters.

Inhalt des Parameterfiles:

USERID = scott
TABLES = emp2
DUMPFILe = data_pump_dir:scott.dmp
SQLFILE = data_pump_dir:scott_imp_normal.txt
NOLOGFILE = yes
TRANSFORM = STORAGE:N

Ausschnitt aus dem SQLFile:

CREATE TABLE "SCOTT"."EMP2"
   (    "EMPNO" NUMBER(4,0),
    "ENAME" VARCHAR2(10 BYTE),
    "JOB" VARCHAR2(9 BYTE),
    "MGR" NUMBER(4,0),
    "HIREDATE" DATE,
    "SAL" NUMBER(7,2),
    "COMM" NUMBER(7,2),
    "DEPTNO" NUMBER(2,0)
   ) SEGMENT CREATION DEFERRED
  PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS NOLOGGING
  TABLESPACE "EXAMPLE" ;
CREATE INDEX "SCOTT"."EMP2_EMPNO_IDX" ON "SCOTT"."EMP2" ("EMPNO")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
  TABLESPACE "INDIZES" PARALLEL 1 ;
  ALTER INDEX "SCOTT"."EMP2_EMPNO_IDX" NOPARALLEL;
ALTER TABLE "SCOTT"."EMP2" ADD CONSTRAINT "EMP2_PK" PRIMARY KEY ("EMPNO")
  USING INDEX "SCOTT"."EMP2_EMPNO_IDX" ENABLE;

Auch hier kann man wahlweise die Storage-Klausel der Tabelle oder des Indexes verschwinden lassen. Die Angabe TRANSFORM=STORAGE:N:CONSTRAINT hat wiederum keine Auswirkung

Ab Version 12.1 kann man mit dem Transform-Parameter auch gezielt die COMPRESSION-Klausel loswerden.

Diese Möglichkeit löst ein weiteres potentielles Problem beim Import von der Enterprise in die Standard Edition (oder eine EE ohne Compression Option), wenn in der Ausgangsdatenbank Tabellen komprimiert gespeichert wurden.
Der entsprechende Parameter heißt dann:

TRANSFORM=TABLE_COMPRESSION_CLAUSE:NONE

Wenn Sie mehr über Datapump und seine Optionen wissen wollen, schauen Sie doch mal im DBA-Opens internal link in current windowKurs vorbei und falls Sie weitere Unterstützung beim Export / Import benötigen, Opens window for sending emailhelfen wir Ihnen gerne weiter.

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.