Depuis l’introduction de la version 10G , il est possible de réaliser des export logique de base avec l’outil expdp dont on continue de louer les performances et les possibilités.
Autant son utilisation en ligne de commande est habituelle et est issue de son prédécesseur, autant l’utilisation de l’API DBMS_DATAPUMP semble moins usuelle. Il y a cependant des cas ou elle se justifie pleinement, particulièrement dans le cadre d’une architecture RAC ou l’on veut pouvoir réaliser quotidiennement une sauvegarde logique de la base de données sans se préoccuper de savoir sur quel nœud se déroulera l’opération.
Voici comment mettre cela en pratique rapidement :
1) Il faut avoir avoir accès depuis tous les nœuds du cluster à un répertoire de sauvegarde, nommons le dans l’exemple /backup/ORCL/dpump, (plateforme unix)
2) Il faut un répertoire logique qui pointe vers ce répertoire:
Depuis une connexion SYS sur une des instances, via une connexion SQL :
SQL>CREATE DIRECTORY DPDIR AS '/backup/ORCL/dpdump' ; SQL>GRANT READ,WRITE ON DIRECTORY TO SYSTEM;
3) Créer la procédure suivante sous SQLPLUS ou tout autre outil de commande SQL en tant qu’utilisateur SYSTEM (SYSTEM est pris en tant que compte d’administration,vous pouvez bien sur choisir un autre compte avec les droits suffisants) :
CREATE OR REPLACE PROCEDURE SYSTEM.expdp_full AS /* || Procedure: SYSTEM.EXPPDP_FULL || || Creates a nightly DataPump Export of the entire database || */ JobHandle NUMBER; -- Data Pump job handle JobStamp VARCHAR2(11); -- Date time stamp BEGIN ---- -- Get the date timestamp --- select to_char(SYSDATE,'DDMMRR-HH24MI') into JobStamp from dual ; ----- -- Build a handle for the export job ----- JobHandle := DBMS_DATAPUMP.OPEN( operation => 'EXPORT' ,job_mode => 'FULL' ,job_name => 'FULL_'||JobStamp ,version => 'COMPATIBLE' ); DBMS_DATAPUMP.ADD_FILE( handle => JobHandle ,filename => 'FULL_'||JobStamp||'.dmp' ,directory => 'DPDIR' ,filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE ); DBMS_DATAPUMP.ADD_FILE( handle => JobHandle ,filename => 'FULL_'||JobStamp||'.log' ,directory => 'DPDIR' ,filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE ); ----- -- Initiate the DataPump Export job ----- DBMS_DATAPUMP.START_JOB(JobHandle); END expdp_full; /
4) Déclencher l’exécution de la procédure à l’intervalle choisi :
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'FULL_EXPDP_DB' ,job_type => 'PLSQL_BLOCK' ,job_action => 'BEGIN SYSTEM.EXPDP_FULL;END;' ,start_date => to_timestamp('11-DEC-2009 01:00:00','DD-MONTH-YYYY HH24:MI:SS') ,repeat_interval => 'FREQ=DAILY' ,enabled => TRUE ,comments => 'Performs Full Export' ); END; /
Choisissez votre date de départ et votre propre intervalle.
C’est le SCHEDULER interne d’Oracle qui s’occupe d’exécuter la procédure sur une des instances vivantes au moment de l’exécution, cela remplace bien avantageusement l’utilisation de cron (sous unix) et les opérations de maintenance en cas de perte du nœud sur lequel l’opération était prévue initialement. D’où l’utilité de faire réaliser cette opération avec l’API.
Le package DBMS_DATAPUMP permet autant de souplesse que la ligne de commande mais il faut un peu de rigueur pour la définition des nombreux paramètres. La documentation sur le sujet que vous pouvez trouver ici donne de nombreux exemples, à vous de trouver d’autres utilités et de nous les faire partager !