Auswahl  

 

Oracle
DBA
12.1, 12.2
25.06.18 (MP)
25.06.18 (MP)
DBA

Body

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?

ORA-39083: Object type TABLE:"SCOTT"."EMP2" failed to create with error:
ORA-00439: feature not enabled: DEFERRED_SEGMENT_CREATION

Das kann passieren, wenn das Dumpfile aus einer Enterprise Edition stammt und leere Tabellen beinhaltet, die in eine Standard Edition Datenbank importiert werden sollen. Die verzögerte Segmenterstellung ist nur in der Enterprise Edition verfügbar (siehe April-Tipp 2010).
Das Problem fällt erst ab Version 11.2. auf, weil hier der Initialisierungsparameter DEFERRED_SEGMENT_CREATION per Default auf TRUE gesetzt ist.

  • Import mit Angabe des Parameters SQLFILE = <Pfad/Dateiname>, dann Löschen aller Vorkommen der Klausel DEFERRED SEGMENT CREATION im Metadatenfile gefolgt von der Erzeugung der Objekte über das Metadatenfile mit nachfolgendem Import der Daten. Das ist in der Regel indiskutabel, weil viel zu aufwendig.
  • Import mit Angabe des Parameters VERSION=11.1, weil in dieser Version der Default des Parameters DEFERRED_SEGMENT_CREATION noch auf FALSE gesetzt war. Geht wesentlich schneller, hat aber den Nachteil, dass man nicht genau weiss, was alles an Änderungen der neueren Versionen über Bord geht.
  • Import mit Angabe des Parameters TRANSFORM=SEGMENT_ATTRIBUTES:N. Damit werden die Default Segment-Attribute für das betroffene Schema umgesetzt. Alle zusätzlichen Angaben (u. a. Segment creation deferred) werden ignoriert. Das ist dann von Vorteil, wenn man alle Tabellen und Indizes mit den Default-Eigenschaften und im Default-Tablespace des Zielschemas erstellen will.
  • Import mit Angabe des Parameters TRANSFORM=SEGMENT_CREATION:N. Das bedeutet, dass nur die Segment_creation-Klausel beim Import weggelassen wird, alles andere bleibt erhalten. Diese Möglichkeit gibt es seit Version 11.2.0.2. Sie stellt die beste Lösung für das oben beschriebene Problem dar.

In diesem Monatstipp konzentrieren wir uns nur auf die Umsetzung der Segment-Eigenschaften und die Storage-Klausel. 
Die Einstellung erfolgt über 3 mit Doppelpunkt getrennte Parameter.

TRANSFORM=<Name der Transformation>:<Wert>:<Objekttyp>

Für <Wert> gibt man y für yes bzw. n für no ein (wobei y nicht wirklich Sinn macht)

Hier ein Ausschnitt der Kombinationsmöglichkeiten für den Namen der Transformation und den Objekttyp für die Version 11g:

  CONSTRAINT INDEX TABLE TABLESPACE
SEGMENT_ATTRIBUTES yes yes yes yes
SEGMENT_CREATION no no yes no
STORAGE yes yes yes no

 

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-Kurs vorbei.

Besuchen Sie uns doch bei einer unsere über 40 Oracle Schulungen in München - Unterhaching.