Des options pour impdp

En travaillant sur la migration de données d’un datacenter vers un autre, j’ai eu l’opportunité d’utiliser le duo expdp/impdp en plus de rman pour reconstruire les nouveaux environnement. Comme, bien entendu, ça ne se passait pas toujours bien, j’ai eu l’opportunité de découvrir des options intéressantes de impdp, surtout pour générer la structure de la base, qui s’appliquera particulièrement lorsque impdp échoue dans sa tâche principale car il tente d’effectuer des opérations sur un schéma pas encore créé.
impdp n’est pas que là pour importer des données, il peut générer des scripts sql avec l’option sqlfile à partir du dump issu de expdp pour, par exemple, créer les tablespaces, ou les schémas et leurs objets.

Tablespaces

Ici nous ajoutons l’option include=tablespace à la commande impdp pour générer un script capable de créer les tablespaces nécessaire à une base de tests DEV1TST:

impdp "/ as sysdba" directory=DATA_PUMP_DIR dumpfile=easy.dmp
sqlfile=easy_create_tbs.sql include=tablespace logfile=easy_create_tbs.log

L’exécution génère le script easy_create_tbs.sql dans le dossier aliasé par DATA_PUMP_DIR
Remarque: Cette option ne fonctionne qu’avec un export full=y, car seul un export complet contient les définitions des tablespaces, si votre export (expdp) contient juste certains schémas choisis, il faudra repasser sur la base source et refaire un

expdp "/ as sysdba" full=y directory=DATA_PUMP_DIR dumpfile=easy_tbsexp.dmp
include=tablespace logfile=easy_tbsexp.log

Pour extraire la structure des tablespaces, refaire la commande impdp ci-dessus mais en modifiant le paramètre dumpfile pour correspondre à celui que vous venez de générer.
Editez le fichier easy_create_tbs.sql pour, par exemple:

  • enlever les ordres de création des tablespace UNDO, TEMP, etc.
  • rationaliser les tailles des fichiers
  • modifier les chemins de stockage et/ou les noms de tablespaces

avant de l’exécuter:

sqlplus / as sysdba @easy_create_tbs.sql

Objets

Génération du fichier metadata pour la création des schémas

Encore une fois, utilisons impdp avec la fonctionnalité sqlfile pour générer un script SQL pour créer les schémas et leurs objets que nous pourrons examiner avant son exécution:

impdp "/ as sysdba" directory=DATA_PUMP_DIR dumpfile=easy.dmp
 sqlfile=/home/oracle/easy_metadata_full.sql schemas=SUNOPSIS,TIVOLI,TOTO

Edition fichier easy_metadata_full.sql:

  • Nom de la base
:%s/PRODDB/DEV1TST/g
  • ajout d’un spool en début et fin du script SQL, notez la commande d’insertion multi-ligne de sed du fichier en cours :
sed -i "1i
spool /home/oracle/easy_metadata_full.log" /home/oracle/easy_metadata_full.sql
echo "spool off" >> /home/oracle/easy_metadata_full.sql

Exécution du metadata sql

sqlplus / as sysdba @/home/oracle/easy_metadata_full.sql

On peut alors aller consulter le fichier easy_metadata_full.log pour vérifier que tous les objets ont été créés sans encombre

Données

Chargement

Maintenant que nous avons les tablespaces et les schémas en entier nous allons pouvoir y injecter les données, mais nous devrons forcer l’ajout de données dans des tables vides, car par défaut, impdp saute une table qui existe sans y ajouter la moindre ligne, donc nous utiliserons les options table_exists_action=append et puisque nous sommes en Enterprise Edition, nous paralléliserons pour accélérer les choses avec parallel=12 pour importer nos trois schémas, ici SUNOPSIS, TIVOLI et TOTO

impdp "/ as sysdba" directory=DATA_PUMP_DIR dumpfile=easy.dmp
 logfile=easy_import.log schemas=SUNOPSIS,TIVOLI,TOTO
 table_exists_action=append parallel=12

Surveiller l’import

Comme pour une sauvegarde ou une restauration RMAN, la vue v$session_longops va nous être utile pour surveiller l’avancement des travaux:

alter session set nls_date_format='dd/mm/yy hh24:mi:ss';
set lines 140
col done for 99.99
col message for a60
select SID, message,START_TIME,TOTALWORK, sofar,(sofar/totalwork) * 100 done,
sysdate + TIME_REMAINING/3600/24 end_at
from v$session_longops
where totalwork > sofar;

Pendant la partie « Processing » il n’y aura pas d’estimation de la date de fin de l’opération:

       SID MESSAGE                                            START_TIME         TOTALWORK      SOFAR   DONE END_AT
---------- -------------------------------------------------- ----------------- ---------- ---------- ------ -----------------
       270 SYS_EXPORT_FULL_01: EXPORT : 0 out of 2048 MB done 23/05/13 14:38:59       2048          0    .00

Par contre une fois l’export ou l’import des données démarré:

       SID MESSAGE                                                      START_TIME         TOTALWORK      SOFAR   DONE END_AT
---------- ------------------------------------------------------------ ----------------- ---------- ---------- ------ -----------------
       270 SYS_EXPORT_FULL_01: EXPORT : 1588 out of 2048 MB done        23/05/13 14:38:59       2048       1588  77.54 23/05/13 15:02:03

Résultat

Là où un import normal avec impdp avait échoué en raison d’un problème de bon ordre de création, nous avons pu, grâce à impdp, générer d’abord un script de création des tablespaces, puis un autre pour la création des objets vides et pour finir importer les données métier dans des objets existants.
Après tout cela, pensez bien sûr à :

  • vérifier et re-compiler les objets invalides
set lines 150
set pages 80
col OWNER for a20
col OBJECT_NAME for a50
select OWNER,OBJECT_NAME,OBJECT_TYPE,STATUS from dba_objects
 where status !='VALID' order by 1,2;
@?/rdbms/admin/utlrp
  • recalculer les statistiques
  • vérifier les dba_directories
set lines 150
set pages 60
col DIRECTORY_PATH for a65
col DIRECTORY_NAME for a22
col owner for a10
select * from dba_directories;
  • vérifier les dba_db_links
set lines 150
set pages 60
col owner for a10
col db_link for a15
col username for a15
col "TNS name" for a40
col DIRECTORY_PATH for a50
col DIRECTORY_NAME for a22
set trim on
set feed off
select OWNER,DB_LINK,USERNAME,HOST as "TNS name" from dba_db_links;