Salut,
J'avais travaillé sur le package PL/SQL DATAPUMP il y a quelques années et voici ce que j'avais fait pour exporter/importer une base de données. En espérant que cela puisse t'aider.
Export-Import d'une base de données entière vers une autre base
-----------------------------------------------------------------
Les bases de test
Les objets suivants sont dans la base maitre et appartiennent au schéma user01, ils sont absents de la base cible avant l'export/import :
• trois tables : DEPT, EMP, EVT.
Dans la base cible doivent être définis :
• l'objet directory utilisé pour l'export DIRPUMP sur '/u01/app/oracle/oradata/DIRPUMP'
• un user avec les droits
- de connexion
- Read/Write sur le directory
- IMP_FULL_DATABASE pour faire l'import
Script d'export d'une base entière
A la différence du script d'export d'un schéma, il faut utiliser le mot clé "FULL" dans la procédure OPEN et ne pas utiliser la procédure DBMS_DATAPUMP.METADATA_FILTER.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| /* Programme PLSQL utilisant DBMS_DATAPUMP pour exporter une base entiere vers une autre. */
set serveroutput on
DECLARE
v_n_h1 NUMBER; -- Data Pump job handle
v_v_status VARCHAR2(20);
BEGIN
-- Creation d'un job Datapump pour exporter une base. Le handle (nombre) renvoye par la fonction OPEN est stocke dans une variable.
v_n_h1 := DBMS_DATAPUMP.OPEN('EXPORT','FULL');
-- Creation d'un fichier dump file, utilisant le handle cree precedemment ainsi que le directory cree sous SQL*Plus.
DBMS_DATAPUMP.ADD_FILE(v_n_h1,'deptpump_base.dmp','DIRPUMP');
-- Lancement du job. Une exception sera generee en cas d'erreur.
DBMS_DATAPUMP.START_JOB(v_n_h1);
DBMS_DATAPUMP.WAIT_FOR_JOB (v_n_h1, v_v_status);
-- Indicate that the job finished and detach from it.
DBMS_OUTPUT.PUT_LINE('Job has completed with status : ' || v_v_status);
DBMS_DATAPUMP.DETACH(v_n_h1);
END;
/ |
Lancement du script.
1 2
| SQL> @SQL_PUMP_EXP_DATABASE
Job has completed with status : COMPLETED |
Export : vérification que le fichier a été généré
1 2
| bash-3.2$ ls -l DIRPUMP/
-rw-r----- 1 oracle oinstall 87801856 Jan 20 20:21 deptpump_base.dmp |
Script d'import.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| /* Script d'import d'une base de donnees dans une base cible. */
set serveroutput on;
DECLARE
v_n_h1 NUMBER; -- Data Pump job handle
v_v_status VARCHAR2(20);
BEGIN
-- Creation du job d'import.
v_n_h1 := DBMS_DATAPUMP.OPEN('IMPORT','FULL');
-- Parametres disant quel est le fichier d'import a utiliser et ou il se trouve sur le serveur Unix : r?utilisation des parametres du script d'export.
DBMS_DATAPUMP.ADD_FILE(v_n_h1,'deptpump_base.dmp','DIRPUMP');
-- Lancement du job.
DBMS_DATAPUMP.START_JOB(v_n_h1);
DBMS_DATAPUMP.WAIT_FOR_JOB (v_n_h1, v_v_status);
-- On indique que le job est termine et quel est son etat. On detache le handle du job.
dbms_output.put_line('Job has completed');
dbms_output.put_line('Final job state = ' || v_v_status);
dbms_datapump.detach(v_n_h1);
END;
/ |
Import du fichier d'export dans la nouvelle base de données
Se connecter comme user01 dans la base cible pour lancer le script d'import.
Dans le cas où l'import sous user01 serait trop long mais qu'aucun message d'erreur ne s'affiche, faire "Ctrl C" et relancer l'import mais, cette fois, en tant que SYS pour valider le script d'import.
Il se peut qu'un import d'une base de données ne puisse pas se lancer à partir d'un user différent de SYS : le script semble boucler, sans rendre la main, même après 15 minutes.
Vérifier que le user a bien le privilege IMP_FULL_DATABASE, sinon le lui donner via le user SYS.
1 2 3 4 5 6 7
| SQL> show user;
USER is "USER01"
SQL> select * from role_sys_privs;
ROLE PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
IMP_FULL_DATABASE BECOME USER NO
... |
Lancement du script.
1 2 3 4
| SQL> @SQL_PUMP_IMP_DATABASE
Job has completed
Final job state = COMPLETED
PL/SQL procedure successfully completed. |
Vérification que les objets de la base maitre ont été créées dans la base cible sous le schéma user01.
Se connecter comme user01.
Import des tables.
SQL> select table_name, owner, status from all_tables where table_name = 'EMP' or table_name = 'DEPT' or table_name = 'EVT'
Partager