Datapump

Jaouad ZOUAGHI

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 ?

- Titre : Datapump

- Auteur : Jaouad ZOUAGHI

- Parution : 15 décembre 2005

- Licence : 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.

Sommaire

- 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-B. Import

- VI-C. Import de la table

- VI-C-1. Surveiller l'avancement

- VI-D. DBMS_DATAPUMP FAQ

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

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

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

- VI-D-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. Supprimer le programme

I - Qu'est-ce que le Datapump

Le datapump est l'utilitaire qui permet d'effectuer des exports 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'exports et d'imports.

II - Nouveauté du DataPump

Tout d'abord le nouveau datapump peut être appelé par deux voies 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ées 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 destination 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-ci 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 suivi 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 certains 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_DATABASEEtEXP_FULL_DATABASEIl 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 jobs 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 droits 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éé physiquement par une commande système, mais également logiquement sous Oracle.

Commande Unix de création de répertoires :

$ 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éés :

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 colonnes 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 reprises 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 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 effectuions un more sur les Dumps produits 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 certains 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 suivantes :

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 introduite 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 dernier 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 qu’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'informations sur le SCN.

V-A-8 - Export et FLASHBACK_TIME

Nous allons effectuer la même chose que dans le chapitre précédent, 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-C - 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-C-1 - 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-D - DBMS_DATAPUMP FAQ

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

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

VI-D-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é que lorsque le job a pour état RUNNING.

VI-D-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-D-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 tous les ordres 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 le 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 a l'avantage, bien que plus longue, de pouvoir partager un planificateur par plusieurs jobs.

BEGIN
DBMS_SCHEDULER.create_schedule (
schedule_name => 'test_schedule',
start_date => SYSTIMESTAMP,repeat_interval => 'freq=hourly; byminute=0',
end_date => NULL,
comments => 'Job toutes 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éfinie par le scheduler TEST_SCHEDULE et qui exécutera le programme défini dans DATAPUMP_PROGRAM.

Cela a 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-ci 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

- Tous ces programmes font partie du package DBMS_SCHEDULER.

- Il existe de nombreux bugs lors de l'initialisation des packages et de leur exécution (une 10.2 est donc vivement conseillée).

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).