Pourquoi une erreur s’affiche-t-elle lorsque j'utilise l'API DMBS DATA PUMP dans mon instance de base de données Amazon RDS for Oracle ?
Un message d'erreur s'affiche lorsque j'essaie d'utiliser DBMS_DATAPUMP dans mon instance de base de données Amazon Relational Database Service (Amazon RDS) for Oracle.
Brève description
DMBS_DATAPUMP échoue pour les raisons suivantes :
- Autorisations ou rôle utilisateur manquants
- Autorisations de lecture et d'écriture manquantes dans le répertoire Oracle Data Pump
- Problèmes liés aux autorisations de fichiers
- Incompatibilité entre les versions source et cible ou incompatibilité entre les versions du fichier de fuseau horaire
- Erreur de syntaxe mineure dans le bloc PL/SQL DMBS_DATAPUMP
Les erreurs courantes que vous rencontrez lorsque vous utilisez DMBS_DATAPUMP sont les suivantes :
- ORA-39001: invalid argument value
- ORA-31626: job does not exist
- ORA-39002: invalid operation
- ORA-39070: Unable to open the log file
Résolution
Utilisez l'une des méthodes suivantes pour importer ou exporter une instance de base de données RDS pour Oracle :
- Oracle Instant Client (expdp/impdp) : Installez le client sur votre ordinateur ou sur une instance Amazon Elastic Compute Cloud (Amazon EC2). Les utilitaires impdp et expdp d’Oracle vous permettent d'utiliser l'hôte distant pour effectuer des opérations d'exportation et d'importation à partir de la ligne de commande. Pour plus d'informations, consultez la section Comment utiliser Oracle Instant Client pour exécuter une importation ou une exportation Data Pump pour mon instance de base de données Amazon RDS for Oracle ?
- API Data Pump (DBMS_DATAPUMP) : Le package DBMS_DATAPUMP fournit une API PL/SQL qui vous permet d'effectuer une exportation et une importation par programmation. Avant de lancer une tâche Data Pump, passez en revue les bonnes pratiques.
Si vous recevez une erreur d'API DBMS_DATAPUMP lorsque vous effectuez une importation ou une exportation, effectuez les étapes de dépannage suivantes.
Vérifier le contenu du fichier journal d'importation Data Pump pour détecter les erreurs
Exécutez les commandes SQL suivantes pour consulter le fichier journal d'importation et les alertes de base de données pour détecter d'éventuelles erreurs. Remplacez DATA_PUMP_DIR et <import log filename> par vos valeurs :
-- View Import logs from DATA_PUMP_DIR directory. SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('DATA_PUMP_DIR','<import log filename>'));
Vous pouvez également utiliser l'instruction SQL suivante pour accéder au journal d’alertes de base de données :
SELECT message_text FROM alertlog;
Vérifier vos autorisations utilisateur
Avant de démarrer une tâche d'exportation ou d'importation, assurez-vous que votre utilisateur de base de données dispose des autorisations suffisantes. Pour plus d'informations, consultez la section Rôles requis pour les opérations d'exportation et d'importation Oracle Data Pump sur le site Web d'Oracle.
Les exigences minimales pour exécuter une opération d'exportation ou d'importation sont les suivantes :
- CRÉER UNE SESSION
- CRÉER UNE TABLE
- Autorisations d'objets READ et WRITE sur un objet de répertoire valide
- Quota d'espace de table suffisant sur l'espace de table par défaut de l'utilisateur
- Rôle de base de données DATAPUMP_EXP_FULL_DATABASE pour exécuter une tâche d'exportation complète de la base de données Data Pump
- Rôle de base de données DATAPUMP_IMP_FULL_DATABASE pour exécuter une tâche d'importation Data Pump complète
Remarque : Ces exigences s'appliquent à l'utilisateur qui se connecte à la base de données lorsque vous exécutez une tâche d'exportation ou d'importation Data Pump. Elles ne s'appliquent pas à l'utilisateur qui est exporté ou importé.
Pour vérifier les rôles accordés et le rôle par défaut, exécutez le code SQL suivant. Remplacez <USERNAME> par le nom d'utilisateur qui se connecte à la base de données lorsque vous exécutez la tâche Data Pump :
SELECT grantee, granted_role, default_role FROM dba_role_privs WHERE grantee IN ('<USERNAME>', 'PUBLIC') ORDER BY 1,2;
Pour vérifier les autorisations système accordées, exécutez la commande suivante. Remplacez <USERNAME> par le nom d'utilisateur qui se connecte à la base de données lorsque vous exécutez la tâche Data Pump :
SELECT grantee, privilege FROM dba_sys_privs WHERE (grantee IN ('<USERNAME>', 'PUBLIC') &einbsp; OR grantee IN (SELECT granted_role FROM dba_role_privs WHERE grantee IN ('<USERNAME>', 'PUBLIC'))) order by 1;
Accorder des autorisations de lecture et d'écriture sur le répertoire
Pour confirmer que vous avez accordé des autorisations de lecture et d'écriture sur le répertoire, exécutez la commande suivante. Remplacez <USERNAME> par le nom d'utilisateur qui se connecte à la base de données lorsque vous exécutez la tâche Data Pump :
select PRIVILEGE,TYPE from DBA_TAB_PRIVS where TABLE_NAME='DATA_PUMP_DIR' and GRANTEE='<USERNAME>';
Vérifier le répertoire de base de données que vous utilisez pour stocker le fichier dump et le fichier journal
Vérifiez l'existence du répertoire de base de données que vous utilisez pour stocker le fichier dump et le fichier journal. Si vous utilisez le répertoire DATA_PUMP_DIR, exécutez une commande similaire à la suivante :
select PRIVILEGE,TYPE from DBA_TAB_PRIVS where TABLE_NAME='DATA_PUMP_DIR' and GRANTEE='<USERNAME>';
Vérifier le fichier dump Data Pump Export
Pour vérifier l'existence du fichier dump d'exportation Data Pump, exécutez une commande similaire à la suivante :
SQL> select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) where FILENAME='dumpname.dmp';
Vérifier la matrice de compatibilité
Vérifiez la compatibilité de Data Pump entre les différentes versions d'Oracle sur le site Web d'Oracle. Vous pouvez importer le fichier dump uniquement dans une base de données présentant un niveau de compatibilité égal ou supérieur. Il se peut que vous deviez importer le fichier dump dans une base de données cible de version inférieure. Dans ce cas, utilisez le paramètre VERSION de Data Pump pour faire correspondre au niveau de compatibilité de la base de données cible. Pour plus d'informations, consultez la section VERSION sur le site Web d'Oracle.
Cet exemple de commande utilise le paramètre VERSION pour faire correspondre la compatibilité de la base de données cible :
DECLARE hdnl NUMBER; BEGIN hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null,version => '19.0.0.0'); DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'test_src6.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file); DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'test_src6.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''USER1'',''USER2'')'); DBMS_DATAPUMP.START_JOB(hdnl); END; /
Si la version du fichier de fuseau horaire est plus élevée dans la source que dans la cible, les erreurs suivantes peuvent s'afficher lorsque vous effectuez une importation :
- ORA-39002: invalid operation
- Ora-3905: Oracle Data Pump does not support importing from a source database with XTSTZ version XX into a target database with TSTZ version XXX
Pour résoudre ce problème, vous devez appliquer un correctif ou mettre à jour la base de données cible avec la version du fichier de fuseau horaire source.
Pour trouver la version du fuseau horaire d'Oracle, exécutez la requête suivante :
Select name,value$ from sys.props$ where name='DST_PRIMARY_TT_VERSION';
Vérifier le fichier journal des tâches de téléchargement
Si vous utilisez l'intégration Amazon Simple Storage Service (Amazon S3) pour télécharger le fichier dump, consultez le fichier journal des tâches de téléchargement. Assurez-vous que le fichier dump a été copié sans erreur. Exécutez les commandes suivantes pour vérifier le fichier journal des tâches de téléchargement. Remplacez task-id par l'ID de tâche renvoyé par les procédures de chargement ou de téléchargement :
SQL> SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'BDUMP')) where FILENAME like 'dbtask%' order by MTIME; SQL> SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-"task-id".log'));
SQL> SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1611697375220-44.log'));
Résoudre les erreurs de syntaxe
En général, des erreurs de syntaxe mineures entraînent des échecs de l'API Data Pump. Consultez l'exemple suivant d'une erreur due à des problèmes de syntaxe dans votre base de données :
DECLARE hdnl NUMBER; BEGIN hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null); DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'TestDumpfile.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file); DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'test_logfile.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''user1'',''user2'')'); DBMS_DATAPUMP.START_JOB(hdnl); END; / Error report - ORA-39001: invalid argument value ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79 ORA-06512: at "SYS.DBMS_DATAPUMP", line 4929 ORA-06512: at "SYS.DBMS_DATAPUMP", line 6378 ORA-06512: at line 7 39001. 00000 - "invalid argument value" *Cause: The user specified API parameters were of the wrong type or value range. Subsequent messages supplied by DBMS_DATAPUMP.GET_STATUS will further describe the error.
Pour résoudre ces erreurs, effectuez l'une des actions suivantes :
- Vérifiez que l'utilisateur, les tables et les objets spécifiés dans la commande existent dans la base de données.
- Vérifiez que le nom du fichier dump existant est identique à celui que vous avez spécifié dans la commande.
- Avant d'appeler DBMS_DATAPUMP.ADD_FILE, assurez-vous que le fichier dump n'existe pas à l'emplacement cible. Si le fichier dump existe, supprimez-le. Vous pouvez également rendre le nom de fichier unique pour chaque appel.
- Assurez-vous que le nom de l'utilisateur ou du schéma est en majuscules.
- Si l'API utilise dblink dans la commande, assurez-vous que vous pouvez accéder au lien de base de données référencé. Par ailleurs, avant d'utiliser la commande dblink dans l'appel d’API DBMS_DATAPUMP, assurez-vous que vous pouvez exécuter une requête avec cette commande.
Utiliser la gestion des exceptions pour capturer le message d'erreur détaillé
Dans certains scénarios, DBMS_DATAPUMP génère une erreur générique qui fournit peu de détails. Utilisez un bloc de gestion des exceptions pour obtenir des informations supplémentaires sur l'erreur. Pour des exemples de blocs de gestion des exceptions, consultez la section Exemples d'utilisation de l'API Data Pump sur le site Web d'Oracle.
Sur la base des informations contenues dans le message d'erreur détaillé, vous pouvez ensuite résoudre le problème. Par exemple, si le nom du fichier dump existe déjà dans DATA_PUMP_DIR, le bloc d'exception génère une erreur similaire à la suivante :
« Exception in Data Pump job
ORA-39001: invalid argument value
ORA-39000: bad dump file specification
ORA-31641: unable to create lump file "/rdsdbdata/datapump/example3.dmp
ORA-27038: created file already exists
Additional information: 1 »
Si vous spécifiez le schéma sous la forme user1, le bloc d'exception génère une erreur similaire à la suivante :
« Exception in Data Pump job
ORA-39001: invalid argument value
ORA-39170: Schema expression IN ('user1') does not correspond to any schemas. »
Surveiller la progression des tâches Data Pump
La vue DBA_DATAPUMP_JOBS vous montre si les tâches d'exportation ou d'importation Data Pump sont actives ou terminées. Ceci est indiqué par un statut de réussite ou d'échec. Pour obtenir des informations détaillées sur l'importation ou l'exportation Data Pump, interrogez le dictionnaire de données V$SESSION_LONGOPS. Pour plus d'informations, consultez les sections DBA_DATAPUMP_JOBS et V$SESSION_LONGOPS sur le site Web d'Oracle.
Par exemple, vous pouvez exécuter la commande suivante pour vérifier l'état actuel d'une tâche Data Pump et le pourcentage de travail qui est terminé :
SELECT sl.sid, sl.serial#, sl.sofar, sl.totalwork, dp.owner_name, dp.state, dp.job_mode FROM v$session_longops sl, v$datapump_job dp WHERE sl.opname = dp.job_name AND sl.sofar != sl.totalwork;
Informations connexes
Importation à l'aide d'Oracle Data Pump
DBMS_DATAPUMP sur le site Web d'Oracle
Quelles sont les étapes de base de l'utilisation de l'API Data Pump ? sur le site Web d'Oracle
- Langue
- Français

Contenus pertinents
demandé il y a 3 ans
demandé il y a 2 ans
demandé il y a 2 ans
demandé il y a un an
AWS OFFICIELA mis à jour il y a 2 ans