Oracle Data Pump

Dalla versione 10g di Oracle sono state introdotte le utility Data Pump expdp impdb che rimpiazzano i classici exp imp (comunque ancora supportati).
La principale differenza architetturale di Data Pump rispetto alle utility exp/imp e' che expdp/impdp vengono sempre eseguite sul DB server e non su un client. Quindi i file generati saranno sempre sul server dove e' attivo un database Oracle.

I vantaggi del data pump sono le prestazioni (eg. parallel) e la presenza di nuove funzionalita' (eg. migrazione diretta via SQL*Net, compressione nativa, remap).

Dal punto di vista sintattico non ci sono molte le novita' una volta definita una directory in cui destinare i dati... ma e' piu' facile vedere un esempio che riassume tutto il necessario per effettuare un export:

SQL> create or replace directory dumpdir as '/tmp';
SQL> grant read,write on directory dumpdir to scott;

$ expdp scott/tiger directory=dumpdir dumpfile=scott.dmp schemas=scott parallel=4

I comandi di Data Pump vengono eseguiti come JOB direttamente da Oracle. E' possibile passare in modalita' interattiva interrompendo il comando (con [Ctrl]-C) oppure controllare successivamente lo stato di un job attivo con expdp attach=jobname.

Ma se volete saperne di piu'... continuate a leggere!

exp imp

La funzionalita' di salvataggio logico e di restore sono presenti da sempre [NdA le ho utilizzate dalla versione 5 di Oracle del 1985...] in Oracle come due programmi di utilita': exp imp.

L'insieme delle funzionalita' e' molto ampio... in questa paginetta viene dato per scontato che siano tutte note al lettore: expdp/impdp verranno descritti per differenza!
Come promemoria riportiamo le principali opzioni (che si possono elencare con exp help=y):

Example: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR) or TABLES=(T1:P1,T1:P2), if T1 is partitioned table USERID must be the first parameter on the command line. Keyword Description (Default) Keyword Description (Default) -------------------------------------------------------------------------- USERID username/password FULL export entire file (N) BUFFER size of data buffer OWNER list of owner usernames FILE output files (EXPDAT.DMP) TABLES list of table names COMPRESS import into one extent (Y) RECORDLENGTH length of IO record GRANTS export grants (Y) INCTYPE incremental export type INDEXES export indexes (Y) RECORD track incr. export (Y) DIRECT direct path (N) TRIGGERS export triggers (Y) LOG log file of screen output STATISTICS analyze objects (ESTIMATE) ROWS export data rows (Y) PARFILE parameter filename CONSISTENT cross-table consistency(N) CONSTRAINTS export constraints (Y) OBJECT_CONSISTENT transaction set to read only during object export (N) FEEDBACK display progress every x rows (0) FILESIZE maximum size of each dump file FLASHBACK_SCN SCN used to set session snapshot back to FLASHBACK_TIME time used to get the SCN closest to the specified time QUERY select clause used to export a subset of a table RESUMABLE suspend when a space related error is encountered(N) RESUMABLE_NAME text string used to identify resumable statement RESUMABLE_TIMEOUT wait time for RESUMABLE TTS_FULL_CHECK perform full or partial dependency check for TTS VOLSIZE number of bytes to write to each tape volume TABLESPACES list of tablespaces to export TRANSPORT_TABLESPACE export transportable tablespace metadata (N) TEMPLATE template name which invokes iAS mode export

Le opzioni di imp sono quasi identiche... spesso utili risultano: IGNORE COMMIT FROMUSER/TOUSER DESTROY INDEXFILE
L'ultima riga riporta sempre il risultato dell'esecuzione con gli eventuali errori e/o warning.

Directory

Come gia' riportato le funzionalita' expdp ed impdp sono state implementate sul DB server e vengono svolte direttamente dall'RDBMS.
Per poter ottenere un file come risultato e' necessario effettuare un mapping tra il file system ed un oggetto directory dell'RDBMS Oracle.

I comandi expdp/impdp utilizzeranno l'oggetto directory che puo' quindi essere protetto, modificato, ... senza impatti sulle procedure di salvataggio logico.
Ecco come si crea un oggetto directory e si definiscono i necessari grant:

CREATE OR REPLACE DIRECTORY mydump AS '/u01/mydump';
GRANT READ, WRITE on DIRECTORY mydump TO scott;

Una volta creato l'oggetto directory questo viene utilizzato da expdp/impdp per accedere ai file di backup:

expdp scott/tiger directory=mydump dumpfile=scott.dmp schemas=scott

Il file exportato puo' essere successivamente importato utilizzando sempre la stessa directory:

impdp scott/tiger@db12c tables=EMP directory=my_dump dumpfile=EMP_DEPT.dmp

expdp impdp

I comandi expdp/impdp si eseguono con una sintassi simile a quella di exp/imp. LOGFILE FULL PARFILE ed HELP=Y sono sempre molto utili ed hanno esattamente lo stesso significato che con exp/imp. Se iil file di dump e' gia' presente un nuovo expdp non lo ricopre, e' quindi necessario spostarlo su un'altra posizione del file system (eg. rinominandolo) oppure utilizzare l'opzione REUSE_DUMPFILES.

Per ottenere su file le DDL per la creazione degli indici si usano opzioni diverse tra imp ed impdp. Eccole a confronto:

imp userid=system/pass file=test.dmp indexfile=idx.sql

impdp system/pass sqlfile=idx.sql dumpfile=test.dmp directory=mydump

E' stata introdotta l'opzione SCHEMAS che consente di indicare l'elenco degli schema su cui operare.
Risultano molto comode le opzioni INCLUDE ed EXCLUDE (eg. EXCLUDE=SCHEMA:"='SCOTT'")

Ma le novita' principali sono PARALLEL e COMPRESSION. Cosa fanno e' ovvio... un po' meno ovvi sono i risvolti di licensing della compressione.
Operando in parallelo vengono prodotti piu' file. Per distinguerli si utilizza il progressivo %U.

Ora per PAR CONDICIO riportiamo i parametri di impdp (che si possono elencare con impdp help=y):

Example: impdp scott/tiger DIRECTORY=dmpdir DUMPFILE=scott.dmp You can control how Import runs by entering the 'impdp' command followed by various parameters. To specify parameters, you use keywords: Format: impdp KEYWORD=value or KEYWORD=(value1,value2,...,valueN) Example: impdp scott/tiger DIRECTORY=dmpdir DUMPFILE=scott.dmp USERID must be the first parameter on the command line. ------------------------------------------------------------------------------ ATTACH REMAP_DATAFILE CLUSTER REMAP_SCHEMA CONTENT REMAP_TABLE DATA_OPTIONS REMAP_TABLESPACE DIRECTORY REUSE_DATAFILES DUMPFILE SCHEMAS ENCRYPTION_PASSWORD SERVICE_NAME ESTIMATE SKIP_UNUSABLE_INDEXES EXCLUDE SOURCE_EDITION FLASHBACK_SCN SQLFILE FLASHBACK_TIME STATUS FULL STREAMS_CONFIGURATION HELP TABLE_EXISTS_ACTION INCLUDE TABLES JOB_NAME TABLESPACES LOGFILE TARGET_EDITION NETWORK_LINK TRANSFORM NOLOGFILE TRANSPORTABLE PARALLEL TRANSPORT_DATAFILES PARFILE TRANSPORT_FULL_CHECK PARTITION_OPTIONS TRANSPORT_TABLESPACES QUERY VERSION REMAP_DATA ------------------------------------------------------------------------------ The following commands are valid while in interactive mode. CONTINUE_CLIENT PARALLEL EXIT_CLIENT START_JOB HELP STATUS KILL_JOB STOP_JOB

PL/SQL

E' disponibile anche un'interfaccia di gestione in PL/SQL: DBMS_DATAPUMP.

declare
    handle  number;
begin
    handle := dbms_datapump.open('EXPORT','SCHEMA');
    dbms_datapump.add_file(handle,'scott.dmp','DUMPDIR');
    dbms_datapump.metadata_filter(handle,'SCHEMA_EXPR','= ''SCOTT''');
    dbms_datapump.set_parallel(handle,4);
    dbms_datapump.start_job(handle);
    dbms_datapump.detach(handle);
end;
/

Esempi

Ecco qualche utile esempio:

# Determinare le tipologie di oggetti da includere/escludere
select OBJECT_PATH, COMMENTS from SCHEMA_EXPORT_OBJECTS where OBJECT_PATH NOT LIKE '%/%';

# Eseguire un expdp di un DB esterno
CREATE DATABASE LINK RAC1 CONNECT TO SYSTEM IDENTIFIED BY XXX USING 'BigRAC1';
expdp system/YYY FULL=y DIRECTORY=mydump NETWORK_LINK=RAC1 DUMPFILE=myDB.dmp LOGFILE=myDB.log

# Bloccare un job attivo
select * from dba_datapump_jobs;
SET serveroutput on
DECLARE
   i NUMBER;
BEGIN
   i := DBMS_DATAPUMP.ATTACH('JOB_NAME','OWNER_NAME');
   DBMS_DATAPUMP.STOP_JOB (i,1,0);
END;
/

# Per rendere piu' veloce un import di grandi dimensioni e' possibile creare gli indici in un
  secondo passo. Si utilizza una tabella di appoggio e si creano dinamicamente. Ecco come:
create table upg_user as
   select username 
   from  dba_users
   where created >= to_date('06-09-10','dd-mm-yy') 
     and username not in ('SYSMAN');
create table idx_upgrade as
  select owner,table_name,index_name,index_type
  from  dba_indexes i
  where exists (select 1 from upg_user u where  u.username=i.owner)
    and owner not in ('SQLTXPLAIN');

userid=system/manager1
DIRECTORY=dumpdir
NETWORK_LINK=UPGRADE
LOGFILE=test_idx.log
INCLUDE=INDEX:"IN (SELECT index_name FROM idx_upgrade where owner='SCOTT')"
PARALLEL=32
SCHEMAS=('SCOTT')

etc

Spesso si utilizza l'NFS per montare i FS su cui sono ospitati i backup. Per effettuare il mount e' necessario utilizzare le opzioni corrette, che variano a seconda della versione di sistema operativo... ad esempio su un Linux recente:
  rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=600
Maggiori dettagli, eccezioni ed eventuali bug sono riportati sul sito di supporto Oracle.

Il Data Pump e' stato introdotto nella versione 10gR1. Diverse funzionalita' sono state introdotte nel tempo: COMPRESSION (10gR2), PARTITION_OPTIONS (11gR1), CLUSTER(11gR2), VIEWS_AS_TABLES (12c), ...


Titolo: Oracle Data Pump
Livello: Avanzato (3/5)
Data: 14 Febbraio 2008
Versione: 1.0.3 - 14 Febbraio 2014
Autore: mail [AT] meo.bogliolo.name