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;