Diese Frage habe ich in den letzten Jahren öfters gehört. Zumindest seitdem die DBAs Oracle Datapump verwenden anstatt des alten Export/Import Tools. Angeblich war es früher mit dem Import-Parameter-Tool „INDEXFILE“ viel einfacher. Tja, die Wahrheit ist: Mit Datapump geht es noch leichter!
Dies möchte ich anhand eines ganz normalen Datapump-Export–Files verdeutlichen. In folgendem Beispiel handelt es sich um einen einfachen Schema-Export, der wie folgt erzeugt wurde:
oracle@vmoel58:/u00/app/oracle/admin/DB112/etc/ [DB112] cat expdp_SalesApp.par SCHEMAS=sh DIRECTORY=data_pump_dir DUMPFILE=expdp_SH_2013-02-17.dmp LOGFILE=expdp_SH_2013-02-17.log PARALLEL=4 oracle@vmoel58:/u00/app/oracle/admin/DB112/etc/ [DB112] expdp parfile=expdp_SalesApp.par Export: Release 11.2.0.3.0 - Production on Sun Feb 17 16:08:27 2013 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. Username: system Password: Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01": system/******** parfile=expdp_SalesApp.par Estimate in progress using BLOCKS method... Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA Total estimation using BLOCKS method: 273.8 MB . . exported "SH"."CUSTOMERS" 9.853 MB 55500 rows ... [Aus Formatierungsgründen wurde dieser Teil herausgefiltert] . . exported "SH"."SALES":"SALES_Q4_2003" 0 KB 0 rows Master table "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded ****************************************************************************** Dump file set for SYSTEM.SYS_EXPORT_SCHEMA_01 is: /u00/app/oracle/admin/DB112/dpdump/expdp_SH_2013-02-17.dmp Job "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully completed at 16:09:00 Zuerst sollten die gesamten Daten und alle anderen Objekte, ausser die Indexes importiert werden. In diesem Fall ist der Parameter EXCLUDE der Schlüssel zum Erfolg: oracle@vmoel58:/u00/app/oracle/admin/DB112/etc/ [DB112] impdp parfile=expdp_SalesApp.par remap_schema=sh:sh_v2 exclude=INDEX Import: Release 11.2.0.3.0 - Production on Sun Feb 17 16:15:42 2013 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. Username: system Password: Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Master table "SYSTEM"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded Starting "SYSTEM"."SYS_IMPORT_SCHEMA_01": system/******** parfile=expdp_SalesApp.par remap_schema=sh:sh_v2 exclude=INDEXProcessing object type SCHEMA_EXPORT/USER Processing object type SCHEMA_EXPORT/SYSTEM_GRANT Processing object type SCHEMA_EXPORT/ROLE_GRANT Processing object type SCHEMA_EXPORT/DEFAULT_ROLE ... (Aus Formatierungs-Gründ wurde dieser Teil herausgefiltert)
In einem zweiten Schritt müssen die Indexes importiert werden. Der INCLUDE Parameter enthält den INDEX-Schlüssel, dieser umfasst die Index-Statistiken. Die Tablespace-Änderung erfolgt durch den REMAP_TABLESPACE Parameter:
oracle@vmoel58:/u00/app/oracle/admin/DB112/etc/ [DB112] impdp parfile=expdp_SalesApp.par remap_schema=sh:sh_v2 include=INDEX remap_tablespace=SH_DATA:SH_IDX Import: Release 11.2.0.3.0 - Production on Sun Feb 17 16:23:58 2013 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. Username: system Password: Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Master table "SYSTEM"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded Starting "SYSTEM"."SYS_IMPORT_SCHEMA_01": system/******** parfile=expdp_SalesApp.par remap_schema=sh:sh_v2 include=INDEX remap_tablespace=USERS:SH_IDX Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX ORA-31684: Object type INDEX:"SH_V2"."PROMO_PK" already exists ORA-31684: Object type INDEX:"SH_V2"."CUSTOMERS_PK" already exists ORA-31684: Object type INDEX:"SH_V2"."PRODUCTS_PK" already exists ORA-31684: Object type INDEX:"SH_V2"."TIMES_PK" already exists ORA-31684: Object type INDEX:"SH_V2"."CHANNELS_PK" already exists ORA-31684: Object type INDEX:"SH_V2"."COUNTRIES_PK" already exists Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS ORA-39111: Dependent object type INDEX_STATISTICS skipped, base object type INDEX:"SH_V2"."TIMES_PK" already exists ORA-39111: Dependent object type INDEX_STATISTICS skipped, base object type INDEX:"SH_V2"."PRODUCTS_PK" already exists ORA-39111: Dependent object type INDEX_STATISTICS skipped, base object type INDEX:"SH_V2"."CHANNELS_PK" already exists ORA-39111: Dependent object type INDEX_STATISTICS skipped, base object type INDEX:"SH_V2"."PROMO_PK" already exists ORA-39111: Dependent object type INDEX_STATISTICS skipped, base object type INDEX:"SH_V2"."CUSTOMERS_PK" already exists ORA-39111: Dependent object type INDEX_STATISTICS skipped, base object type INDEX:"SH_V2"."COUNTRIES_PK" already exists Processing object type SCHEMA_EXPORT/TABLE/INDEX/BITMAP_INDEX/INDEX Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/BITMAP_INDEX/INDEX_STATISTICS Processing object type SCHEMA_EXPORT/TABLE/INDEX/DOMAIN_INDEX/INDEX Job "SYSTEM"."SYS_IMPORT_SCHEMA_01" completed with 12 error(s) at 16:24:05
Die Primär Schlüssen Indexes sind durch den EXLUDE Paramater wegen dem “Constraint” nicht beeinflusst. Deswegen muss ebenso jeweils in EXCLUDE und INCLUDE der Schlüssel CONSTRAINT mitangegeben werden:
oracle@vmoel58:/u00/app/oracle/admin/DB112/etc/ [DB112] impdp parfile=expdp_SalesApp.par remap_schema=sh:sh_v2 include=INDEX,CONSTRAINT remap_tablespace=SH_DATA:SH_IDX Import: Release 11.2.0.3.0 - Production on Sun Feb 17 17:08:50 2013 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. ...
Folgendes SQL-Statement stellt die Objekttrennung dar:
SQL> SELECT segment_type,tablespace_name FROM dba_segments WHERE owner='SH_V2' AND segment_type IN ('TABLE','INDEX') GROUP BY segment_type,tablespace_name;SEGMENT_TYPE TABLESPACE_NAME ------------------ ------------------------------ TABLE SH_DATA INDEX SH_IDX
Et voila, das wars! Übrigens mit anderen Data-Pump-Parametern wie zum Beispiel TABLE_EXISTS_ACTION kann man vieles mehr erreichen. Ein Blick in der Oracle Dokumentation „Oracle Database Utilities“ lohnt sich hier sehr.
Bei Anmerkungen oder Fragen freue ich mich auf einen Kommentar.
Viel Spass mit Oracle Data Pump!
Jérôme