Dalla versione 10g di Oracle sono state introdotte le utility
Data Pump expdp impdb
che rimpiazzano i classici exp imp (comunque ancora supportati).
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).
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.
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!
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):
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.
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
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):
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; /
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')
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:
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
rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=600
Maggiori dettagli, eccezioni ed eventuali bug sono riportati sul
Livello: Avanzato
Data:
14 Febbraio 2008
Versione: 1.0.3 - 14 Febbraio 2014
Autore: mail [AT] meo.bogliolo.name