Developpez.com - Oracle
X

Choisissez d'abord la catégorieensuite la rubrique :


Datapump

Par Jaouad ZOUAGHI (home)
 

L'utilitaire Datapump a été introduit avec Oracle 10G : il permet d'effectuer des exports et imports en ligne de commande mais également en PL/SQL.
La version d'oracle utilisée est la 10.1.0.2


I. Qu'est ce que le Datapump
II. Nouveauté du DataPump
III. Pré-requis et recommandations
IV. Export - Import
IV-A. Export
IV-A-1. Préparation de l'export
IV-A-2. La commande d'export
IV-B. Import
IV-B-1. Préparation l'import
IV-B-2. Import
V. DATAPUMP FAQ
V-A. Export FAQ
V-A-1. Comment paralléliser l'export
V-A-2. Peut on lire le fichier DUMP généré
V-A-3. Comment exporter un schéma ?
V-A-4. Comment exporter un tablespace
V-A-5. Comment avoir plusieurs fichiers DUMP sans spécifier le répertoire
V-A-6. Comment estimer l'export
V-A-7. Export et SCN
V-A-8. Export et FLASHBACK_TIME
V-A-9. Comment n'exporter que la structure d'une table.
V-A-10. Comment n'exporter que les lignes.
V-B. Import FAQ
V-B-1. Comment paralléliser l'import
V-B-2. Comment importer un tablespace
V-B-3. Comment importer les schémas
VI. Package DBMS_DATAPUMP
VI-A. Export
VI-A-1. Export de table
VI-A-2. Surveiller l'avancement
VI-B. Import
VI-B-1. Import de la table
VI-B-2. Surveiller l'avancement
VI-C. DBMS_DATAPUMP FAQ
VI-C-1. Comment effectuer un export avec un lien de base de données
VI-C-2. Comment paralléliser ces exports/imports
VI-C-3. Comment initialiser les paramètres qui ne peuvent l'être via la procédure DBMS_DATAPUMP
VI-C-4. Comment tracer l'exécution de DATAPUMP
VII. DATAPUMP ET SCHEDULER
VII-A. Créer le programme
VII-B. Création du planificateur
VII-C. Création du Job
VII-D. Suppression
VII-D-1. Le Job
VII-D-2. Le scheduler
VII-D-3. Le programme
VII-D-4. Remarques
VII-D-5. Comment supprimer


I. Qu'est ce que le Datapump

Le datapump est l'utilitaire qui permet d'effectuer des export et des imports sous Oracle depuis la 10g. Oracle prévoit clairement de supprimer les anciens utilitaires EXP et IMP.
Ils ne doivent actuellement leur salut qu'à la nécessité d'assurer la compatibilité avec les anciennes versions d'Oracle.
Donc DATAPUMP n'est pas compatible avec les anciennes versions d'export et d'import.


II. Nouveauté du DataPump

Tout d'abord le nouveau datapump peut être appelé par deux voix différentes :
Soit par les binaires expdp et impdp que l'on trouve dans le répertoire suivant :

$  cd $ORACLE_HOME/bin    
$ ll *pdp             
-rwxr-x--x   1 oracle10   oinstall    222448 Jun 28 17:53 expdp
-rwxr-x--x   1 oracle10   oinstall    223928 Jun 28 17:53 impdp
Soit via le package SYS.DBMS_DATAPUMP.
Pour avoir un descriptif du package ( sous Sql*Plus)

SQL> desc dbms_datapump
PROCEDURE ADD_DEVICE
 Nom d'argument                  Type                    E/S par défaut ?
 ------------------------------ ----------------------- ------ --------
 HANDLE                         NUMBER                  IN
 DEVICENAME                     VARCHAR2                IN
 VOLUMESIZE                     VARCHAR2                IN     DEFAULT
PROCEDURE ADD_FILE
 Nom d'argument                  Type                    E/S par défaut ?
 ------------------------------ ----------------------- ------ --------
 HANDLE                         NUMBER                  IN
(…)

  • Il existe des nouveautés en 10g uniquement supporté par DATAPUMP et non pas par l'export classique d'Oracle, je pense notamment au scheduler nouvelle version d'Oracle : DBMS_ SCHEDULER.
  • Nous pouvons envisager le parallélisme avec le DATAPUMP,
  • En outre il est également possible d'avoir plusieurs destinations pour un seul job de DATAPUMP, et de lui ajouter des répertoires de destinations alors que le DATAPUMP est en cours.
  • Il est possible d'arrêter et de reprendre un Job en cours, si par exemple vous constatez que celui consomme énormément de ressources et que vous êtes en période de charge.
  • Puisque Datapump travaille avec des répertoires et des packages, il est possible maintenant de faire des exports/Imports sans pour autant surcharger le réseau.
  • Il est possible, lorsque nous couplons DBMS_METADATA et DataPump d'exporter la structure des objets de les renommer …
    DataPump peut être suivit lorsqu'il est en cours d'exécution, permettant ainsi via la vue V$SESSION_LONGOPS,
    d'avoir une idée du travail effectué et de connaître la somme de travail restant à fournir.
  • DataPump peut également travailler avec les tables externes.
  • Il n'est plus possible de travailler en chemin Direct, de modifier le paramètre Buffer ou de programmer des points de validation ( COMMIT ) : Export-Import en mode direct .
  • On a maintenant la possibilité d'inclure ou d'exclure certaines objets grâce aux arguments INCLUDE ou EXCLUDE


  • III. Pré-requis et recommandations

    Pour se servir du datapump, assurez-vous bien que vous ayez les droits suivants : IMP_FULL_DATABASE Et EXP_FULL_DATABASE Il est important de savoir que ces privilèges donnent la possibilité de voir toutes les données de la base entière. Le fait de créer un dossier peut être une faille de sécurité en fonction des droits attribués. Il existe des vues DBA qui vous seront utiles lors d'administration et de l'exploitation de datapump.

    • DBA_DATAPUMP_JOB : montre tous les jobs actifs de DataPump ainsi que leur statut.
    • DBA_DATAPUMP_SESSIONS : nous renseigne sur les sessions d'utilisateurs attachés à un job de DataPump.
    • V$SESSION_LONGOPS nous renseigne sur l'avancement du job.
    • V$DATAPUMP_JOB : nous renseigne également, avec quelques paramétres en plus, sur les job Datapump, notamment sur les attentes (enqueue).

    IV. Export - Import


    IV-A. Export


    IV-A-1. Préparation de l'export

    Avant de pouvoir lancer l'export et l'import sous Oracle nous allons détailler la phase de préparation :
    Il s'agit d'abord de créer l'utilisateur et de lui donner les bons droits, pour notre exemple.

    
    SQL> create user dvp identified by dvp ; 
    Utilisateur créé.
    SQL> grant connect,resource to dvp; 
    Autorisation de privilèges (GRANT) acceptée.
    SQL> grant exp_full_database to dvp ; 
    Autorisation de privilèges (GRANT) acceptée.
    Ici nous avons créé un utilisateur DVP avec les doits nécessaires pour l'export.
    Création de la table à exporter :

    SQL> create table dvp ( a number ) ; 
    Table créée.
    SQL> insert into dvp values (1) ; 
    1 ligne créée.
    SQL> insert into dvp values (2) ; 
    1 ligne créée.
    SQL>  insert into dvp values (3);
    1 ligne créée.
    SQL>  insert into dvp values (4) ;
    1 ligne créée.
    SQL>  insert into dvp values (5) ;
    1 ligne créée.
    SQL> commit ;
    Validation effectuée.
    Il faut également créer un répertoire dans lequel Oracle va stocker non seulement le fichier DMP mais également les différents fichiers ( notamment le LOG ).
    Ce répertoire doit non seulement être crée physiquement par une commande système mais également logiquement sous Oracle :
    Commande Unix de création de répertoire :

    $ mkdir datapump
    Ensuite créer le répertoire pour Oracle :

    SQL> create directory datapump as '/ora/admin/dba/datapump' ;
    Directory created.
    Donner les droits à l'utilisateur afin que celui puisse lire et écrire sur le répertoire.

    SQL> grant read, write on directory datapump to DVP ; 
    Grant succeeded.
    Comment voir les répertoires déjà crées :

    SQL> set linesize 250
    SQL> col directory_path format a20
    SQL> r
      1* select * from dba_directories
    OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH
    ------------------------------ ------------------------------ --------------------
    SYS                            DATAPUMP                  /ora/admin/dba/datapump
    Avoir l'aide en ligne de datapump :
    Cela repose sur le même principe que l'export :

    $ expdp help=y
    Export: Release 10.1.0.2.0 - 64bit Production on Tuesday, 27 September, 2005 17:14
    Copyright (c) 2003, Oracle.  All rights reserved.
    The Data Pump export utility provides a mechanism for transferring data objects
    between Oracle databases. The utility is invoked with the following command:
       Example: expdp scott/tiger DIRECTORY=dmpdir DUMPFILE=scott.dmp
    You can control how Export runs by entering the 'expdp' command followed
    by various parameters. To specify parameters, you use keywords:
       Format:  expdp KEYWORD=value or KEYWORD=(value1,value2,...,valueN)
       Example: expdp scott/tiger DUMPFILE=scott.dmp DIRECTORY=dmpdir SCHEMAS=scott
                   or TABLES=(T1:P1,T1:P2), if T1 is partitioned table
    USERID must be the first parameter on the command line.
    Keyword               Description (Default)
    ------------------------------------------------------------------------------
    ATTACH                Attach to existing job, e.g. ATTACH [=job name].
    CONTENT               Specifies data to unload where the valid keywords are:
                          (ALL), DATA_ONLY, and METADATA_ONLY.
    DIRECTORY             Directory object to be used for dumpfiles and logfiles.
    DUMPFILE              List of destination dump files (expdat.dmp),
                          e.g. DUMPFILE=scott1.dmp, scott2.dmp, dmpdir:scott3.dmp.
    ESTIMATE              Calculate job estimates where the valid keywords are:
                          (BLOCKS) and STATISTICS.
    ESTIMATE_ONLY         Calculate job estimates without performing the export.
    EXCLUDE               Exclude specific object types, e.g. EXCLUDE=TABLE:EMP.
    FILESIZE              Specify the size of each dumpfile in units of bytes.
    FLASHBACK_SCN         SCN used to set session snapshot back to.
    FLASHBACK_TIME        Time used to get the SCN closest to the specified time.
    FULL                  Export entire database (N).
    HELP                  Display Help messages (N).
    INCLUDE               Include specific object types, e.g. INCLUDE=TABLE_DATA.
    JOB_NAME              Name of export job to create.
    LOGFILE               Log file name (export.log).
    NETWORK_LINK          Name of remote database link to the source system.
    NOLOGFILE             Do not write logfile (N).
    PARALLEL              Change the number of active workers for current job.
    PARFILE               Specify parameter file.
    QUERY                 Predicate clause used to export a subset of a table.
    SCHEMAS               List of schemas to export (login schema).
    STATUS                Frequency (secs) job status is to be monitored where
                          the default (0) will show new status when available.
    TABLES                Identifies a list of tables to export - one schema only.
    TABLESPACES           Identifies a list of tablespaces to export.
    TRANSPORT_FULL_CHECK  Verify storage segments of all tables (N).
    TRANSPORT_TABLESPACES List of tablespaces from which metadata will be unloaded.
    COMPRESSION Réduction de la taille du contenu du fichier de vidage, les mots-clés valides étant : (METADATA_ONLY) et NONE. 
    ENCRYPTION_PASSWORD Clé de mot de passe pour la création de données de colonne cryptées.
    VERSION               Version of objects to export where valid keywords are:
                          (COMPATIBLE), LATEST, or any valid database version.
    The following commands are valid while in interactive mode.
    Note: abbreviations are allowed
    Command               Description
    ------------------------------------------------------------------------------
    ADD_FILE              Add dumpfile to dumpfile set.
                          ADD_FILE=<dirobj:>dumpfile-name
    CONTINUE_CLIENT       Return to logging mode. Job will be re-started if idle.
    EXIT_CLIENT           Quit client session and leave job running.
    HELP                  Summarize interactive commands.
    KILL_JOB              Detach and delete job.
    PARALLEL              Change the number of active workers for current job.
                          PARALLEL=<number of workers>.
    START_JOB             Start/resume current job.
    STATUS                Frequency (secs) job status is to be monitored where
                          the default (0) will show new status when available.
                          STATUS=[interval]
    STOP_JOB              Orderly shutdown of job execution and exits the client.
                          STOP_JOB=IMMEDIATE performs an immediate shutdown of the
                          Data Pump job.

    IV-A-2. La commande d'export

    Ici nous allons exporter une petite table dans le but d'avoir une illustration de nos propos.

    $ expdp dvp/dvp tables=dvp.dvp DIRECTORY=datapump DUMPFILE=dvp.dump LOGFILE=dvp.log
    Export: Release 10.1.0.2.0 - 64bit Production on Tuesday, 27 September, 2005 17:36
    Copyright (c) 2003, Oracle.  All rights reserved.
    Connected to: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - 64bit Production
    With the Partitioning, OLAP and Data Mining options
    Starting "DVP"."SYS_EXPORT_TABLE_01":  dvp/******** tables=dvp.dvp DIRECTORY=datapump DUMPFILE=dvp.dump LOGFILE=dvp.log 
    Estimate in progress using BLOCKS method...
    Processing object type TABLE_EXPORT/TABLE/TBL_TABLE_DATA/TABLE/TABLE_DATA
    Total estimation using BLOCKS method: 64 KB
    Processing object type TABLE_EXPORT/TABLE/TABLE
    . . exported "DVP"."DVP"                                 4.937 KB       5 rows
    Master table "DVP"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
    ******************************************************************************
    Dump file set for DVP.SYS_EXPORT_TABLE_01 is:
      /ora/data/SAGE/admin/datapump/dvp.dump
    Job "DVP"."SYS_EXPORT_TABLE_01" successfully completed at 17:36
    il est possible de spécifier le répertoire et le fichier dans le DUMPFILE ainsi :
    Dumpfile=directory :file_name
    Ce qui donne :

    dumpfile=datapump:dvp.dump
    Nous avons ici la taille exportée en nombre de lignes mais également en KB. Ces informations sont repris dans le fichier Log si ce dernier est paramétré.
    Pendant que le datapump tourne, on peut le surveiller via la vue DBA_DATAPUMP_JOBS :

      1* SELECT * FROM DBA_DATAPUMP_JOBS
    OWNER_NAME                     JOB_NAME                  OPERATION  JOB_MODE      STATE    DEGREE ATTACHED_S
    ------------------------------ ------------------------------ ------------------------------ -------
    DVP                            SYS_EXPORT_TABLE_01       EXPORT     TABLE      DEFINING    
    Voir les travaux exécutés ou en cours d'exécution :

      1* SELECT sid, serial# , sofar , totalwork , start_time , ELAPSED_SECONDS   FROM  v$session_longops ; 
           SID    SERIAL#      SOFAR  TOTALWORK START_TIME          ELAPSED_SECONDS
    ---------- ---------- ---------- ---------- ------------------- ---------------
           162          3         28         28 27/09/2005 10:12:18               3
    La vue Database_export_objects, ainsi que les vues annexes ( schéma et Tables ) permettent de voir quels sont les objets que l'on peut exporter.


    IV-B. Import


    IV-B-1. Préparation l'import

    Ici cela consiste tout simplement à dropper la table pour pouvoir la recréer mais également à donner les droits nécessaires.
    Sous le user DVP :

    SQL> show user
    USER est "DVP"
    SQL> select * from dvp ; 
             A
    ----------
             1
             2
             3
             4
             5
    SQL> drop table dvp ; 
    Table supprimée.
    SQL> select * from dvp ; 
    select * from dvp
                  *
    ERREUR à la ligne 1 :
    ORA-00942: table or view does not exist
    Sous le user system :

    SQL> show user ;
    USER est "SYSTEM"
    SQL> grant imp_full_database to dvp ; 
    Autorisation de privilèges (GRANT) acceptée.

    IV-B-2. Import

    Pour obtenir les différents paramètres de l'outil il suffit simplement de taper :

    $ impdp help=y
    Import: Release 10.1.0.2.0 - Production on Tue Sep 27 18:26:43 2005
    Copyright (c) 1982, 2004, Oracle.  All rights reserved.
    
    The Data Pump Import utility provides a mechanism for transferring data objects
    between Oracle databases. The utility is invoked with the following command:
    
         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.
    
    Keyword               Description (Default)
    ------------------------------------------------------------------------------
    ATTACH                Attach to existing job, e.g. ATTACH [=job name].
    CONTENT               Specifies data to load where the valid keywords are:
                          (ALL), DATA_ONLY, and METADATA_ONLY.
    DIRECTORY             Directory object to be used for dump, log, and sql files.
    DUMPFILE              List of dumpfiles to import from (expdat.dmp),
                          e.g. DUMPFILE=scott1.dmp, scott2.dmp, dmpdir:scott3.dmp.
    ESTIMATE              Calculate job estimates where the valid keywords are:
                          (BLOCKS) and STATISTICS.
    EXCLUDE               Exclude specific object types, e.g. EXCLUDE=TABLE:EMP.
    FLASHBACK_SCN         SCN used to set session snapshot back to.
    FLASHBACK_TIME        Time used to get the SCN closest to the specified time.
    FULL                  Import everything from source (Y).
    HELP                  Display help messages (N).
    INCLUDE               Include specific object types, e.g. INCLUDE=TABLE_DATA.
    JOB_NAME              Name of import job to create.
    LOGFILE               Log file name (import.log).
    NETWORK_LINK          Name of remote database link to the source system.
    NOLOGFILE             Do not write logfile.
    PARALLEL              Change the number of active workers for current job.
    PARFILE               Specify parameter file.
    QUERY                 Predicate clause used to import a subset of a table.
    REMAP_DATAFILE        Redefine datafile references in all DDL statements.
    REMAP_SCHEMA          Objects from one schema are loaded into another schema.
    REMAP_TABLESPACE      Tablespace object are remapped to another tablespace.
    REUSE_DATAFILES       Tablespace will be initialized if it already exists (N).
    SCHEMAS               List of schemas to import.
    SKIP_UNUSABLE_INDEXES Skip indexes that were set to the Index Unusable state.
    SQLFILE               Write all the SQL DDL to a specified file.
    STATUS                Frequency (secs) job status is to be monitored where
                          the default (0) will show new status when available.
    STREAMS_CONFIGURATION Enable the loading of Streams metadata
    TABLE_EXISTS_ACTION   Action to take if imported object already exists.
                          Valid keywords: (SKIP), APPEND, REPLACE and TRUNCATE.
    TABLES                Identifies a list of tables to import.
    TABLESPACES           Identifies a list of tablespaces to import.
    TRANSFORM             Metadata transform to apply (Y/N) to specific objects.
                          Valid transform keywords: SEGMENT_ATTRIBUTES and STORAGE.
                          ex. TRANSFORM=SEGMENT_ATTRIBUTES:N:TABLE.
    TRANSPORT_DATAFILES   List of datafiles to be imported by transportable mode.
    TRANSPORT_FULL_CHECK  Verify storage segments of all tables (N).
    TRANSPORT_TABLESPACES List of tablespaces from which metadata will be loaded.
                          Only valid in NETWORK_LINK mode import operations.
    VERSION               Version of objects to export where valid keywords are:
                          (COMPATIBLE), LATEST, or any valid database version.
                          Only valid for NETWORK_LINK and SQLFILE.
    
    The following commands are valid while in interactive mode.
    Note: abbreviations are allowed
    
    Command               Description (Default)
    ------------------------------------------------------------------------------
    CONTINUE_CLIENT       Return to logging mode. Job will be re-started if idle.
    EXIT_CLIENT           Quit client session and leave job running.
    HELP                  Summarize interactive commands.
    KILL_JOB              Detach and delete job.
    PARALLEL              Change the number of active workers for current job.
                          PARALLEL=.
    START_JOB             Start/resume current job.
                          START_JOB=SKIP_CURRENT will start the job after skipping
                          any action which was in progress when job was stopped. 
    STATUS                Frequency (secs) job status is to be monitored where
                          the default (0) will show new status when available.
                          STATUS=[interval]
    STOP_JOB              Orderly shutdown of job execution and exits the client.
                          STOP_JOB=IMMEDIATE performs an immediate shutdown of the
                          Data Pump job.
                          
    
    Nous lançons la commande:

    $ impdp  dvp/dvp tables=dvp.dvp DIRECTORY=datapump DUMPFILE=dvp.dump LOGFILE=dvp.log 
    Import: Release 10.1.0.2.0 - 64bit Production on Tuesday, 27 September, 2005 18:31
    Copyright (c) 2003, Oracle.  All rights reserved.
    Connected to: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - 64bit Production
    With the Partitioning, OLAP and Data Mining options
    Master table "DVP"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded
    Starting "DVP"."SYS_IMPORT_TABLE_01":  dvp/******** tables=dvp.dvp DIRECTORY=datapump DUMPFILE=dvp.dump LOGFILE=dvp.log 
    Processing object type TABLE_EXPORT/TABLE/TABLE
    Processing object type TABLE_EXPORT/TABLE/TBL_TABLE_DATA/TABLE/TABLE_DATA
    . . imported "DVP"."DVP"                                 4.937 KB       5 rows
    Job "DVP"."SYS_IMPORT_TABLE_01" successfully completed at 18:32
    Nous vérifions que l'import a bien eu lieu :

    SQL> r
      1* select * from dvp
             A
    ----------
             1
             2
             3
             4
             5
    SQL>
    Et tout comme l'export nous pouvons vérifier le job durant son exécution.

    SQL> SELECT * FROM DBA_DATAPUMP_JOBS ;
    OWNER_NAME                JOB_NAME                  OPERATION         JOB_MODE      STATE     DEGREE ATTACHED_S
    ------------------------------ ------------------------------ ------------------------------ -------
    DVP                       SYS_IMPORT_TABLE_01       IMPORT            TABLE      DEFINING     1

    V. DATAPUMP FAQ


    V-A. Export FAQ


    V-A-1. Comment paralléliser l'export

    expdp dvp/dvp tables=dvp.dvp DIRECTORY=datapump DUMPFILE=dvp.dump LOGFILE=dvp.log parallel=2
    Nous pouvons voir le degré de parallélisme en nous appuyant sur la table DBA_DATAPUMP_JOBS.

      1* SELECT * FROM DBA_DATAPUMP_JOBS
    OWNER_NAME                JOB_NAME              OPERATION JOB_MODE       STATE    DEGREE ATTACHED_S
    ------------------------------ ------------------------------ ------------------------------ -------
    DVP                       SYS_EXPORT_TABLE_01   EXPORT   TABLE       EXECUTING  2             
    SQL>

    V-A-2. Peut on lire le fichier DUMP généré

    Lorsque nous effectuons un more sur les Dumps produit par les anciennes versions d'export nous parvenions à lire les ordres de DDL.
    Dans les nouvelles versions ce qui est nouveau est tout d'abord le recours de plus en plus au XML :

    <?xml version="1.0"?>
    Cependant, et certain vont le regretter, il n'est plus possible de « décoder » le fichier DUMP.


    V-A-3. Comment exporter un schéma ?

    Cela se fait grâce à l'argument : SCHEMAS

    $ expdp dvp/dvp SCHEMAS=SCOTT  DIRECTORY=datapump DUMPFILE=user.dmp LOGFILE=user.log

    V-A-4. Comment exporter un tablespace

    $ expdp dvp/dvp TABLESPACES=tablespace_name  DIRECTORY=datapump DUMPFILE=tbs.dmp LOGFILE=Tbs.log

    V-A-5. Comment avoir plusieurs fichiers DUMP sans spécifier le répertoire

    $ expdp dvp/dvp tables=dvp.dvp DIRECTORY=datapump  DUMPFILE=dvp.dump,dv2.com LOGFILE=dvp.log
    Export: Release 10.1.0.2.0 - 64bit Production on Wednesday, 28 September, 2005 18:47
    Copyright (c) 2003, Oracle.  All rights reserved.
    Connected to: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - 64bit Production
    With the Partitioning, OLAP and Data Mining options
    Starting "DVP"."SYS_EXPORT_TABLE_01":  dvp/******** tables=dvp.dvp DIRECTORY=datapump DUMPFILE=dvp.dump,dv2.com LOGFILE=dvp.log 
    Estimate in progress using BLOCKS method...
    Processing object type TABLE_EXPORT/TABLE/TBL_TABLE_DATA/TABLE/TABLE_DATA
    Total estimation using BLOCKS method: 64 KB
    Processing object type TABLE_EXPORT/TABLE/TABLE
    . . exported "DVP"."DVP"                                 4,945 KB       5 rows
    Master table "DVP"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
    ******************************************************************************
    Dump file set for DVP.SYS_EXPORT_TABLE_01 is:
      /ora/data/SAGE/admin/datapump/dvp.dump
      /ora/data/SAGE/admin/datapump/dv2.com
    Job "DVP"."SYS_EXPORT_TABLE_01" successfully completed at 18:47
    On peut vérifier cela dans le répertoire DATAPUMP :

    $ ls -ltr
    total 156
    -rw-rw----   1 oracle10   oinstall      4096 Sep 28 18:47 dv2.com
    -rw-rw-rw-   1 oracle10   oinstall      1047 Sep 28 18:47 dvp.log
    -rw-rw----   1 oracle10   oinstall     73728 Sep 28 18:47 dvp.dump

    V-A-6. Comment estimer l'export


    Grâce à Datapump, nous pouvons avant de lancer réellement l'export estimer cette opération.
    Pour ce faire nous allons utiliser le paramètre ESTIMATE_ONLY qui par défaut est à FALSE.
    Commande:
    $ expdp dvp/dvp tables=dvp.dvp DIRECTORY=datapump LOGFILE=dvp.log estimate_only=true

    Nous remarquerons ici qu'il ne faut pas renseigner le paramètre DUMPFILE, car cette opération ne produit qu'un fichier LOG et n'exécute pas réellement l'opération, au risque d'avoir les erreurs suivants :
    ORA-39002: invalid operation 
    ORA-39114: Dump files are not supported for ESTIMATE_ONLY jobs
    Fichier Logs
    Export: Release 10.1.0.2.0 - 64bit Production on Wednesday, 12 October, 2005 10:47 
    Copyright (c) 2003, Oracle. All rights reserved.;;;
    Connected to: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - 64bit Production
    With the Partitioning, OLAP and Data Mining options
    Starting "DVP"."SYS_EXPORT_TABLE_01": dvp/******** tables=dvp.dvp
    DIRECTORY=datapump LOGFILE=dvp.log estimate_only=true Estimate in progress using BLOCKS method...
    Processing object type TABLE_EXPORT/TABLE/TBL_TABLE_DATA/TABLE/TABLE_DATA.
    estimated "DVP"."DVP 64 KB
    Total estimation using BLOCKS method: 64 KB
    Job "DVP"."SYS_EXPORT_TABLE_01" successfully completed at 10:47

    V-A-7. Export et SCN


    Nous allons essayer d'effectuer un export en utilisant la fonction flashback_scn de l'export.
    C'est une amélioration du LOGMINER introduit avec la 9i,Pour en savoir plus sur le LOGMINER
    Nous allons dans un premier temps mettre en place l'environnement de travail :
    SQL> create table dvp ( a number ) ; 
    Table créée.
    SQL> insert into dvp values (1) ; 
    1 ligne créée.
    SQL> insert into dvp values (2) ; 
    1 ligne créée.
    SQL>  insert into dvp values (3);
    1 ligne créée.
    SQL>  insert into dvp values (4) ;
    1 ligne créée.
    SQL>  insert into dvp values (5) ;
    1 ligne créée.
    SQL>  select a , ora_rowscn  from dvp ; 
    A ORA_ROWSCN
    ---------- ----------
    1
    2
    3
    4
    5
    SQL> select dbms_flashback.get_system_change_number() from dual;
    DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()
    -----------------------------------------
    734443
    SQL> commit ; Validation effectuée. SQL> select a , ora_rowscn from dvp ;
    A ORA_ROWSCN
    ---------- ----------
    1 734444
    2 734444
    3 734444
    4 734444
    5 734444
    SQL> select dbms_flashback.get_system_change_number() from dual;
    DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()
    -----------------------------------------
    734445
    SQL> delete from dvp where a!=1 ;
    4 ligne(s) supprimée(s).
    SQL> commit ;
    Validation effectuée.
    SQL> select dbms_flashback.get_system_change_number() from dual;
    DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()
    -----------------------------------------
    734473
    SQL> select a , ora_rowscn from dvp ;
    A ORA_ROWSCN
    ---------- ----------
    1 734472
    Notons que jusqu'au premier commit ,les lignes ne disposent pas de ROW SCN.
    Si j'effectue un export avec le denier SCN de la table, dans ce cas je n'exporterai qu'une seule ligne :
    $ expdp dvp/dvp tables=dvp.dvp DIRECTORY=datapump LOGFILE=dvp.log dumpfile=dvp.dump flashback_scn= 734472 
    (…)
    . . exported "DVP"."DVP" 4.914 KB 1 rows
    Si par contre j'effectue l'export avec le SCN avant la suppression des quatre lignes voilà ce que on peut constater :
    $ expdp dvp/dvp tables=dvp.dvp DIRECTORY=datapump LOGFILE=dvp.log dumpfile=dvp.dump flashback_scn= 734444 
    (…)
    . . exported "DVP"."DVP" 4.914 KB 5 rows
    D'ailleurs nous pouvons le vérifier ainsi : Suppression de la table :
    SQL> show user
    USER est "DVP"
    SQL> drop table dvp ; 
    Table supprimée.
    SQL> select * from dvp ; 
    select * from dvp
                  *
    ERREUR à la ligne 1 :
    ORA-00942: table or 
    view does not exist
    
    
    Nous effectuons l'import des données :
    $ impdp  dvp/dvp tables=dvp.dvp DIRECTORY=datapump DUMPFILE=dvp.dump LOGFILE=dvp.log 
    Import: Release 10.1.0.2.0 - 64bit Production on Tuesday, 27 September, 2005 18:31
    Copyright (c) 2003, Oracle.  All rights reserved.
    Connected to: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - 64bit Production
    With the Partitioning, OLAP and Data Mining options
    Master table "DVP"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded
    Starting "DVP"."SYS_IMPORT_TABLE_01":  dvp/******** tables=dvp.dvp DIRECTORY=datapump DUMPFILE=dvp.dump LOGFILE=dvp.log 
    Processing object type TABLE_EXPORT/TABLE/TABLE
    Processing object type TABLE_EXPORT/TABLE/TBL_TABLE_DATA/TABLE/TABLE_DATA
    . . imported "DVP"."DVP"                                 4.937 KB       5 rows
    Job "DVP"."SYS_IMPORT_TABLE_01" successfully completed at 18:32
    Vérification de l'import :
    
    SQL> show user
    USER est "DVP"
    SQL> select * from dvp ; 
             A
    ----------
             1
             2
             3
             4
             5      
    
    Plus d'information sur le SCN

    V-A-8. Export et FLASHBACK_TIME

    Nous allons effectuer le même chose que dans le chapitre précédant mais cette fois ci avec l'option FLASHBACK_TIME : nous n'effectuerons pas un export avec le SCN mais avec en fonction de l'heure.
    Comment déterminer l'heure :
    
    SQL> set linesize 250
    SQL> r
    1* select a ,scn_to_timestamp (ora_rowscn) from dvp
    A SCN_TO_TIMESTAMP(ORA_ROWSCN)
    ---------- ---------------------------------------------------------------------------
    1 12/10/05 11:32:57,000000000
    2 12/10/05 11:32:57,000000000
    3 12/10/05 11:32:57,000000000
    4 12/10/05 11:32:57,000000000
    5 12/10/05 11:32:57,000000000
    La commande :
    
    $ expdp dvp/dvp tables=dvp.dvp DIRECTORY=datapump LOGFILE=dvp.log
    dumpfile=dvp.dump  flashback_time = '14:36:46'


    V-A-9. Comment n'exporter que la structure d'une table.


    
    $ expdp dvp/dvp tables=dvp.dvp DIRECTORY=datapump LOGFILE=dvp.log
    dumpfile=dvp.dump  content=METADATA_ONLY


    V-A-10. Comment n'exporter que les lignes.


    
    $ expdp dvp/dvp tables=dvp.dvp DIRECTORY=datapump LOGFILE=dvp.log
    dumpfile=dvp.dump  content=DATA_ONLY


    V-B. Import FAQ


    V-B-1. Comment paralléliser l'import

    Même procédure que pour l'export :

    impdp  dvp/dvp tables=dvp.dvp DIRECTORY=datapump DUMPFILE=dvp.dump LOGFILE=dvp.log parallel=2
    La vérification :

    SQL> r
      1* SELECT * FROM DBA_DATAPUMP_JOBS
    OWNER_NAME                     JOB_NAME                       OPERATION        JOB_MODE           STATE                DEGREE ATTACHED_S
    ------------------------------ ------------------------------ ------------------------------ -------
    DVP                            SYS_IMPORT_TABLE_01            IMPORT          TABLE              DEFINING                 2

    V-B-2. Comment importer un tablespace

    Ne pas oublier de créer le tablespace ...

    $ impdp  dvp/dvp tablespaces=tablespace_name  DIRECTORY=datapump DUMPFILE=dvp.dump LOGFILE=dvp.log

    V-B-3. Comment importer les schémas

    $ impdp  dvp/dvp SCHEMAS=SCOTT  DIRECTORY=datapump DUMPFILE=user.dmp LOGFILE=user.log

    VI. Package DBMS_DATAPUMP

    Dorénavant il est possible de programmer des exports imports via une API Oracle : Le package dbms_datapump. L'avantage non négligeable de cette option est de pouvoir programmer des exports full via DBMS_SCHEDULER


    VI-A. Export


    VI-A-1. Export de table

    Durant le travail et tout comme l'utilitaire EXPDP il est possible de voir le déroulement du travail en requêtant sur les vues : DBA_DATAPUMP_JOBS et V$SESSION_LONGOPS.
    Voici un exemple :
    Lister les fichiers dans le répertoire DATAPUMP :

    $ ll
    total 0
    $
    Lancer l'export avec le package datapump :

    SET SERVEROUTPUT ON SIZE 1000000
    DECLARE
     p_dph NUMBER;
     BEGIN 
     p_dph := DBMS_DATAPUMP.open(operation=>'EXPORT',job_mode=>'TABLE',job_name=>'DVP_EXPORT');
     DBMS_DATAPUMP.add_file(handle=>p_dph,filename=>'dvp.dmp',directory=> 'DATAPUMP',filetype=>1);
     DBMS_DATAPUMP.add_file(handle=>p_dph,filename=>'tab_dvp.log',directory=> 'DATAPUMP',filetype=>3);
     DBMS_DATAPUMP.metadata_filter(handle => p_dph,name=>'SCHEMA_EXPR',value =>'IN (''DVP'')'); 
      DBMS_DATAPUMP.start_job(p_dph);
     DBMS_DATAPUMP.detach(p_dph);
     dbms_output.put_line('Export terminé ');
    EXCEPTION 
      WHEN OTHERS THEN
       dbms_output.put_line('erreur:'||sqlerrm||'  Job-ID:'||p_dph);
     END;
    /
    Export terminé
    Procédure PL/SQL terminée avec succès.
    SQL>

    VI-A-2. Surveiller l'avancement

    Surveiller son état d'avancement :

    SQL> r
      1* select * FROM DBA_DATAPUMP_JOBS
    OWNER_NAME                     JOB_NAME                  OPERATION         JOB_MODE        STATE               DEGREE ATTACHED_S
    ------------------------------ ------------------------------ ------------------------------ -------
    DVP                            DVP_EXPORT                EXPORT            TABLE           NOT RUNNING              0             
    SQL> r
      1* select * FROM DBA_DATAPUMP_JOBS
    OWNER_NAME                     JOB_NAME                  OPERATION         JOB_MODE       STATE               DEGREE ATTACHED_S
    ------------------------------ ------------------------------ ------------------------------ -------
    DVP                            DVP_EXPORT                EXPORT            TABLE          UNDEFINED                0             
    SQL> r
      1* select * FROM DBA_DATAPUMP_JOBS
    OWNER_NAME                     JOB_NAME                  OPERATION         JOB_MODE       STATE               DEGREE ATTACHED_S
    ------------------------------ ------------------------------ ------------------------------ -------
    DVP                            DVP_EXPORT                EXPORT            TABLE          DEFINING                 1             
    SQL> r
      1* select * FROM DBA_DATAPUMP_JOBS
    OWNER_NAME                     JOB_NAME                  OPERATION         JOB_MODE       STATE               DEGREE ATTACHED_S
    ------------------------------ ------------------------------ ------------------------------ -------
    DVP                            DVP_EXPORT                EXPORT            TABLE          EXECUTING                1
    Vérifier le répertoire datapump :

    $ ls -ltr
    total 186
    -rw-rw----   1 oracle10   oinstall     94208 Sep 28 18:10 dvp.dmp
    -rw-rw-rw-   1 oracle10   oinstall       836 Sep 28 18:10 tab_dvp.log
    Lire le contenu du fichier LOG :

    $ more  tab_dvp.log
    Starting "DVP"."DVP_EXPORT":  
    Estimate in progress using BLOCKS method...
    Processing object type TABLE_EXPORT/TABLE/TBL_TABLE_DATA/TABLE/TABLE_DATA
    Total estimation using BLOCKS method: 64 KB
    Processing object type TABLE_EXPORT/TABLE/TABLE
    Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
    Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
    Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
    Processing object type TABLE_EXPORT/TABLE/COMMENT
    . . exported "DVP"."DVP"                                 4,945 KB       5 rows
    Master table "DVP"."DVP_EXPORT" successfully loaded/unloaded
    ******************************************************************************
    Dump file set for DVP.DVP_EXPORT is:
      /ora/data/SAGE/admin/datapump/dvp.dmp
    Job "DVP"."DVP_EXPORT" successfully completed at 18:10

    VI-B. Import

    C'est la même procédure que pour l'export


    VI-B-1. Import de la table

    Nous allons tout simplement supprimer la table puis essayer de la recréer, ce qui nous fournira une méthode simple pour la vérification.
    Répertoire Datapump :

    $ ls -ltr
    total 186
    -rw-rw----   1 oracle10   oinstall     94208 Sep 28 18:10 dvp.dmp
    -rw-rw-rw-   1 oracle10   oinstall       836 Sep 28 18:10 tab_dvp.log
    $
    Supprimer la table :

    SQL> show user
    USER est "DVP"
    SQL> drop table dvp ; 
    Table supprimée.
    SQL>
    Script d'import :

    SQL> SET SERVEROUTPUT ON SIZE 1000000
    SQL> DECLARE
      2   p_dph NUMBER;
      3  BEGIN 
      4   p_dph := DBMS_DATAPUMP.open(operation=>'IMPORT',job_mode=>'TABLE',job_name=>'EMP_IMPORT2');
      5   DBMS_DATAPUMP.add_file(handle=>p_dph,filename=>'dvp.dmp',directory                => 'DATAPUMP
    ',filetype=>1);
      6   DBMS_DATAPUMP.add_file(handle=>p_dph,filename=>'dvp_imp.log',directory                => 'DATA
    PUMP',filetype=>3);
      7   DBMS_DATAPUMP.set_parameter(handle=> p_dph,name=>'TABLE_EXISTS_ACTION',value=>'REPLACE');     
      8   DBMS_DATAPUMP.start_job(p_dph);
      9   DBMS_DATAPUMP.detach(p_dph);
     10   dbms_output.put_line('import terminé ');
     11  EXCEPTION 
     12    WHEN OTHERS THEN
     13     dbms_output.put_line('erreur:'||sqlerrm||'  Job-ID:'||p_dph);
     14  END;
     15  /
    import terminé
    Procédure PL/SQL terminée avec succès.
    SQL>

    VI-B-2. Surveiller l'avancement

    Via la vue DBA_DATAPUMP_JOBS :

    SQL> R
      1* select * FROM DBA_DATAPUMP_JOBS
    OWNER_NAME                     JOB_NAME                  OPERATION          JOB_MODE             STATE               DEGREE ATTACHED_S
    ------------------------------ ------------------------------ ------------------------------ -------
    DVP                            EMP_IMPORT2               IMPORT             TABLE                DEFINING                 1             
    SQL> R
      1* select * FROM DBA_DATAPUMP_JOBS
    OWNER_NAME                     JOB_NAME                  OPERATION          JOB_MODE             STATE               DEGREE ATTACHED_S
    ------------------------------ ------------------------------ ------------------------------ -------
    DVP                            EMP_IMPORT2               IMPORT             TABLE                EXECUTING                1             
    SQL> R
      1* select * FROM DBA_DATAPUMP_JOBS
    aucune ligne sélectionnée
    Le répertoire datapump :

    $ ls -ltr
    total 188
    -rw-rw----   1 oracle10   oinstall     94208 Sep 28 18:10 dvp.dmp
    -rw-rw-rw-   1 oracle10   oinstall       836 Sep 28 18:10 tab_dvp.log
    -rw-rw-rw-   1 oracle10   oinstall       351 Sep 28 18:24 dvp_imp.log
    $
    Lecture du fichier Log :

    $ more dvp_imp.log
    Master table "DVP"."EMP_IMPORT2" successfully loaded/unloaded
    Starting "DVP"."EMP_IMPORT2":  
    Processing object type TABLE_EXPORT/TABLE/TABLE
    Processing object type TABLE_EXPORT/TABLE/TBL_TABLE_DATA/TABLE/TABLE_DATA
    . . imported "DVP"."DVP"                                 4,945 KB       5 rows
    Job "DVP"."EMP_IMPORT2" successfully completed at 18:24
    Table DVP :

    SQL> select * from dvp ; 
             A
    ----------
             1
             2
             3
             4
             5
    SQL>
    Remarque : Comme vous avez pu le constater nous avons ajouté quelques lignes afin de récupérer le numéro d'erreur Oracle en cas d'échec du traitement !
    Cela afin de donner la possibilité de lancer le traitement via un fichier et de l'appeler avec la commande START.


    VI-C. DBMS_DATAPUMP FAQ


    VI-C-1. Comment effectuer un export avec un lien de base de données

    Après avoir crée le database link il suffit de spécifier le nom dans la fonction Dbms_datapump.open (REMOTE_LINK =>'nom du database Link' )


    VI-C-2. Comment paralléliser ces exports/imports

    Scripts :

    SQL> SET SERVEROUTPUT ON SIZE 1000000
    SQL> DECLARE
      2   p_dph NUMBER;
      3   BEGIN 
      4   p_dph := DBMS_DATAPUMP.open(operation=>'EXPORT',job_mode=>'TABLE',job_name=>'DVP_EXPORT');
      5   DBMS_DATAPUMP.add_file(handle=>p_dph,filename=>'dvp.dmp',directory=> 'DATAPUMP',filetype=>1);
      6   DBMS_DATAPUMP.add_file(handle=>p_dph,filename=>'tab_dvp.log',directory=> 'DATAPUMP',filetype=>
    3);
      7    DBMS_DATAPUMP.SET_PARALLEL (handle=>p_dph,DEGREE=>2);
      8   DBMS_DATAPUMP.metadata_filter(handle => p_dph,name=>'SCHEMA_EXPR',value =>'IN (''DVP'')'); 
      9    DBMS_DATAPUMP.start_job(p_dph);
     10   DBMS_DATAPUMP.detach(p_dph);
     11   dbms_output.put_line('Export terminé ');
     12  EXCEPTION 
     13    WHEN OTHERS THEN
     14     dbms_output.put_line('erreur:'||sqlerrm||'  Job-ID:'||p_dph);
     15   END;
     16  /
    Export terminé
    Procédure PL/SQL terminée avec succès.
    SQL>
    Vérifier le travail :

    SQL> r
      1* select * from dba_datapump_jobs
    OWNER_NAME                JOB_NAME                  OPERATION                      JOB_MODE             STATE               DEGREE 
    ------------------------------ ------------------------------ ------------------------------ -------
    DVP                       DVP_EXPORT                EXPORT                         TABLE                EXECUTING               2   
    SQL>
    Notons que le degré n'est donnée que lorsque le job a pour état RUNNING.


    VI-C-3. Comment initialiser les paramètres qui ne peuvent l'être via la procédure DBMS_DATAPUMP

    Il est possible de positionner d'autres paramètres grâce à la procédure SET_PARAMETER du package :
    Définition de la procédure :

    PROCEDURE SET_PARAMETER
     Nom d'argument                  Type                    E/S par défaut ?
     ------------------------------ ----------------------- ------ --------
     HANDLE                         NUMBER                  IN
     NAME                           VARCHAR2                IN
     VALUE                          NUMBER                  IN

    VI-C-4. Comment tracer l'exécution de DATAPUMP

    Il existe différentes méthodes pour tracer un Import ou un Export de données.
    Les méthodes classiques :

    • SYS.DBMS_SYSTEM.SET_EV
    • Oradebug avec Sql*plus
    Ou alors via directement les utilitaires
    L'export :

    $ expdp dvp/dvp tables=dvp.dvp DIRECTORY=datapump DUMPFILE=dvp.dump LOGFILE=dvp.log trace=480300
    L'import :
    Le paramètre permet de stocker touts les ordre DDL lors de l'import. Reprenons l'exemple de notre table DVP :

    $ impdp  dvp/dvp tables=dvp.dvp DIRECTORY=datapump DUMPFILE=dvp.dump LOGFILE=dvp.log sqlfile=sql_ddl.sql
    Un extrait :

    $ more sql_ddl.sql
    -- CONNECT DVP
    -- new object type path is: TABLE_EXPORT/TABLE/TABLE
    CREATE TABLE "DVP"."DVP" 
       (    "A" NUMBER, 
            "B" NUMBER
       ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
      TABLESPACE "SYSTEM" ;
    -- new object type path is: TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
     BEGIN
       DBMS_STATS.SET_TABLE_STATS('"DVP"', '"DVP"', NULL, NULL, NULL, 5, 1, 6, 0, NULL, FALSE, NULL, NULL );
      END;
    /
     DECLARE
       SREC DBMS_STATS.STATREC;
      BEGIN
       SREC.MINVAL := 'C102';
       SREC.MAXVAL := 'C106';
       SREC.EAVS := 0;
       SREC.CHVALS := DBMS_STATS.CHARARRAY();
       SREC.NOVALS := DBMS_STATS.NUMARRAY(1, 5);
       SREC.BKVALS := DBMS_STATS.NUMARRAY(0, 1);
       SREC.EPC := 2;
       DBMS_STATS.SET_COLUMN_STATS('"DVP"', '"DVP"', '"A"', NULL, NULL, NULL, 4, .25, 0, srec, 2, 0);
      END;
    /
    Comme on peut le remarquer cela exporte même les statistiques.
    Attention dans ce cas là cela n'importe pas la table.
    Pour toute l'instance :
    Pour un init.ora :

    event="39089 trace name context forever,level 0x300"
    Puis arrêt redémarrage.
    Pour un Spfile :

    SQL> connect / as sysdba
              SQL> alter system set event=
                      '39089 trace name context forever, level 0x300' 
                      scope=spfile;
              SQL> shutdown immediate
              SQL> startup
    Et pour l'arrêter

      SQL> connect / as sysdba
              SQL> alter system reset event scope=spfile sid='*';
              SQL> shutdown immediate
              SQL> startup
    Via SYS.dbms_system.set_ev :
    Export/Import sous Windows :

    select sid,serial#,username,program,
       'execute sys.dbms_system.set_ev('||sid||','||serial#||',10046,4,'''');'
       "SQL_TRACE" from v$session 
       where upper(program) like '%EXPDP%'
    -- where upper(program) like '%IMPDP%'
    Export/Import sous Unix :

    select sid,serial#,username,program,
       'execute sys.dbms_system.set_ev('||sid||','||serial#||',10046,4,'''');'
       "SQL_TRACE" from v$session 
       where upper(program) like 'UDE%'
    -- where upper(program) like 'UDI%'
    Ce qui donne :

    SQL> r
      1  select sid,serial#,username,program,
      2     'execute sys.dbms_system.set_ev('||sid||','||serial#||',10046,4,'''');'
      3     "SQL_TRACE" from v$session
      4     where upper(program) like 'UDE%'
      5*
           SID    SERIAL# USERNAME
    ---------- ---------- ------------------------------
    PROGRAM
    ------------------------------------------------
    SQL_TRACE
    --------------------------------------------------------------------------------
           148         29 DVP
    ude@HOST (TNS V1-V3)
    execute sys.dbms_system.set_ev(148,29,10046,4,'');
    SQL>

    VII. DATAPUMP ET SCHEDULER

    Ici il s'agit d'utiliser une des nouveautés de la 10G, qui va nous permettre de planifier un programme ou exécutable via la package système DBMS_SCHEDULER .


    VII-A. Créer le programme

    Nous allons commencer par enregistrer le programme afin par la suite de pouvoir le planifier.
    Création du programme :
    Test.sh :

    $ more test.sh 
     /ora/ora101/bin/sqlplus dvp/dvp@sage <
    Test.sql

    $ more test.sql
    SET SERVEROUTPUT ON SIZE 1000000
    DECLARE
     p_dph NUMBER;
     BEGIN 
     p_dph := DBMS_DATAPUMP.open(operation=>'EXPORT',job_mode=>'TABLE',job_name=>'DVP_EXPORT');
     DBMS_DATAPUMP.add_file(handle=>p_dph,filename=>'dvp.dmp',directory=> 'DATAPUMP',filetype=>1);
     DBMS_DATAPUMP.add_file(handle=>p_dph,filename=>'tab_dvp.log',directory=> 'DATAPUMP',filetype=>3);
     DBMS_DATAPUMP.metadata_filter(handle => p_dph,name=>'SCHEMA_EXPR',value =>'IN (''DVP'')'); 
      DBMS_DATAPUMP.start_job(p_dph);
     DBMS_DATAPUMP.detach(p_dph);
     dbms_output.put_line('Export terminM-i ');
    EXCEPTION 
      WHEN OTHERS THEN
       dbms_output.put_line('erreur:'||sqlerrm||'  Job-ID:'||p_dph);
     END;
    /
    exit
    Création de l'exécutable sous Oracle :

    --- Program Création 
    SQL> BEGIN
    2 DBMS_SCHEDULER.create_program (
    3 program_name => 'datapump_program',
    4 program_type => 'EXECUTABLE',
    5 program_action => '/ora/data/SAGE/admin/datapump/test.sh',
    6 enabled => TRUE,
    7 comments => 'Scheduler des exports sous Oracle');
    8 DBMS_SCHEDULER.enable (name => 'datapump_program');
    9 end ;
    10 /
    Procédure PL/SQL terminée avec succès.
    Vérification de la création via la vue DBA_SCHEDULER_PROGRAMS :

    SQL> SELECT program_name,program_type,enabled FROM dba_scheduler_programs
    2 WHERE owner ='DVP' ;
    PROGRAM_NAME PROGRAM_TYPE ENABL
    ------------------------------ ---------------- -----
    DATAPUMP_PROGRAM EXECUTABLE TRUE
    SQL>
    Voici une des nouvelles fonctionnalités du planificateur : Pouvoir planifier des scripts, exécutables ...


    VII-B. Création du planificateur

    Cette solution à l'avantage, bien que plus longue, de pouvoir partager un planificateur par plusieurs JOB.

    BEGIN
    DBMS_SCHEDULER.create_schedule (
    schedule_name => 'test_schedule',
    start_date => SYSTIMESTAMP,repeat_interval => 'freq=hourly; byminute=0',
    end_date => NULL,
    comments => 'Job toute les heures ');
    END;
    /
    Procédure PL/SQL terminée avec succès.
    Le planificateur TEST_SCEDULE effectuera une ou plusieurs tâches toutes les heures. Vérification :

    SQL> SELECT schedule_name,start_date FROM user_scheduler_schedules ;
    SCHEDULE_NAME START_DATE
    ------------------------------ 
    ---------------------------------------------------------------------
    TEST_SCHEDULE 29/09/05 17:14:45,986449 +02:00

    VII-C. Création du Job

    -- job Création 
    SQL> BEGIN
    2 DBMS_SCHEDULER.create_job (
    3 job_name => 'datapump_job',
    4 program_name => 'datapump_program',
    5 schedule_name => 'test_schedule',
    6 enabled => TRUE,
    7 comments => 'Creer un job datapump.dvp');
    8 End;
    9 /
    Procédure PL/SQL terminée avec succès.
    Vérification :

    SQL> SELECT job_name, enabled FROM user_scheduler_jobs;
    JOB_NAME ENABL
    ------------------------------ -----
    DATAPUMP_JOB TRUE
    Nous avons donc un Job : DATAPUMP JOB qui sera exécuté à une fréquence définit par le scheduler TEST_SCHEDULE et qui exécutera le programme définit dans DATAPUMP_PROGRAM.
    Cela à pour avantage de privilégier la modularité.


    VII-D. Suppression

    L'ordre de suppression est le suivant : JOB , Planificateur et enfin programme.


    VII-D-1. Le Job

    L'arrêter si celui est en cours puis le supprimer.

    PROCEDURE STOP_JOB
     Nom d'argument                  Type                    E/S par défaut ?
     ------------------------------ ----------------------- ------ --------
     JOB_NAME                       VARCHAR2                IN    
     FORCE                          BOOLEAN                 IN     DEFAULT
    Suppression :

    PROCEDURE DROP_JOB
     Nom d'argument                  Type                    E/S par défaut ?
     ------------------------------ ----------------------- ------ --------
     JOB_NAME                       VARCHAR2                IN    
     FORCE                          BOOLEAN                 IN     DEFAULT

    VII-D-2. Le scheduler

    PROCEDURE DROP_SCHEDULE
     Nom d'argument                  Type                    E/S par défaut ?
     ------------------------------ ----------------------- ------ --------
     SCHEDULE_NAME                  VARCHAR2                IN    
     FORCE                          BOOLEAN                 IN     DEFAULT

    VII-D-3. Le programme

    PROCEDURE DROP_PROGRAM
     Nom d'argument                  Type                    E/S par défaut ?
     ------------------------------ ----------------------- ------ --------
     PROGRAM_NAME                   VARCHAR2                IN    
     FORCE                          BOOLEAN                 IN     DEFAULT

    VII-D-4. Remarques

    • Toutes ces programmes font parties du package DBMS_SCHEDULER .
    • Il existe de nombreux Bug lors de l'initialisation des packages et de leur exécution ( une 10.2 est donc vivement conseillé ) .

    VII-D-5. Supprimer le programme :


    Supprimer le programme :
    -- Il faut supprimer le JOb avant le programme -- arrêter  le job  
    -- arrêter  le job  
    BEGIN
    DBMS_SCHEDULER.drop_job (job_name => 'DATAPUMP_JOB',FORCE=> true) ;
    end ;
    / -- Supprimer le programme BEGIN
    DBMS_SCHEDULER.drop_program (program_name => 'datapump_program',FORCE => true) ;
    end ;

    / -- Supprimer le scheduler BEGIN
    DBMS_SCHEDULER.drop_scheduler (scheduler_name => 'datapump_program',FORCE => true) ;
    end ;
    /
    Il existe une limitation de l'outil en 10.1 , en effet il est difficile d'arrêter un job de type : EXECUTABLE en cours.

    Pour ce faire une méthode de contournement :

  • Alter system set job_queue_processes=0 ;
  • kill du process ora_cjq0_SID ( Parfois un redémarrage de la base est nécessaire )




  • Valid XHTML 1.1!Valid CSS!

    Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2005 Jaouad ZOUAGHI. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

    Contacter le responsable de la rubrique Oracle