Amazon RDS for Oracle DB インスタンスで DMBS DATA PUMP API を使用するとエラーが発生する理由を知りたいです。
Oracle DB インスタンスの Amazon Relational Database Service (Amazon RDS) で DBMS_DATAPUMP を使用しようとすると、エラーが発生します。
簡単な説明
**DMBS_DATAPUMP ** が失敗する理由を次に示します。
- ユーザーのアクセス許可またはロールが欠落している
- Oracle Data Pump ディレクトリの読み取りと書き込みのアクセス許可がない
- ファイルのアクセス許可に問題がある
- ソースとターゲットでバージョンに互換性がない、またはタイムゾーンファイルのバージョンが一致していない
- DMBS_DATAPUMP PL/SQL ブロックに軽度の構文エラーがある
DMBS_DATAPUMP の使用時に発生する一般的なエラーを次に示します。
- ORA-39001: 引数の値が無効です
- ORA-31626: ジョブが存在しません
- ORA-39002: 操作が無効です
- ORA-39070: ログファイルを開くことができません
解決策
RDS for Oracle DB インスタンスのインポートまたはエクスポートを実行するには、次のいずれかの方法をとります。
- Oracle Instant Client (expdp/impdp): クライアントをコンピュータまたは Amazon Elastic Compute Cloud (Amazon EC2) インスタンスにインストールします。Oracle impdp および expdp ユーティリティを使用すると、リモートホストを使用してコマンドラインからエクスポートおよびインポート操作を実行できます。詳細については、「Oracle Instant Client を使用して Amazon RDS for Oracle DB インスタンスの Data Pump のインポートまたはエクスポートを実行する方法を教えてください」を参照してください。
- Data Pump API (DBMS_DATAPUMP) DBMS_DATAPUMP パッケージには、エクスポートとインポートをプログラムで実行できる PL/SQL API が用意されています。Data Pump ジョブを開始する前に、ベストプラクティスを確認してください。
インポートまたはエクスポートの実行時に DBMS_DATAPUMP API エラーが発生した場合は、次のトラブルシューティング手順を実行してください。
Data Pump のインポートログファイルの内容でエラーを確認する
次の SQL コマンドを実行して、インポートログファイルと DB アラートにエラーがないか確認します。DATA_PUMP_DIR と <import log filename> は、実際の値で置き換えてください。
-- 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>'));
次の SQL ステートメントを使用して BD アラートログにアクセスすることもできます。
SELECT message_text FROM alertlog;
ユーザーのアクセス許可を確認する
エクスポートまたはインポートジョブを開始する前に、DB ユーザーに十分なアクセス許可があることを確認してください。詳細については、Oracle のウェブサイトで「Oracle Data Pump のエクスポートおよびインポート操作に必要なロール」を参照してください。
エクスポートまたはインポート操作を実行するための最小要件を次に示します。
- CREATE SESSION
- CREATE TABLE
- 有効なディレクトリオブジェクトに対する READ および WRITE オブジェクトアクセス許可
- ユーザーのデフォルトテーブルスペースにおける十分なテーブルスペースクォータ
- データベース全体の Data Pump エクスポートジョブを実行するための DATAPUMP_EXP_FULL_DATABASE データベースロール
- データベース全体の Data Pump インポートジョブを実行するための DATAPUMP_IMP_FULL_DATABASE データベースロール
注: これらの要件は、Data Pump のエクスポートジョブまたはインポートジョブを実行する際にデータベースに接続するユーザーに適用されます。エクスポートまたはインポート対象のユーザーには適用されません。
付与されたロールとデフォルトロールを確認するには、次の SQL を実行します。<USERNAME> は、Data Pump ジョブを実行する際にデータベースに接続するユーザー名に置き換えます。
SELECT grantee, granted_role, default_role FROM dba_role_privs WHERE grantee IN ('<USERNAME>', 'PUBLIC') ORDER BY 1,2;
付与されたシステムアクセス許可を確認するには、次のコマンドを実行します。<USERNAME> は、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;
ディレクトリへの読み取りと書き込みのアクセス許可を付与する
ディレクトリへの読み取りと書き込みのアクセス許可を付与したことを確認するには、次のコマンドを実行します。<USERNAME> は、Data Pump ジョブを実行する際にデータベースに接続するユーザー名に置き換えます。
select PRIVILEGE,TYPE from DBA_TAB_PRIVS where TABLE_NAME='DATA_PUMP_DIR' and GRANTEE='<USERNAME>';
ダンプとログファイルの保存に使用するデータベースディレクトリを確認する
ダンプファイルとログファイルの保存に使用するデータベースディレクトリがあることを確認します。DATA_PUMP_DIR ディレクトリを使用する場合は、次のようなコマンドを実行します。
select PRIVILEGE,TYPE from DBA_TAB_PRIVS where TABLE_NAME='DATA_PUMP_DIR' and GRANTEE='<USERNAME>';
Data Pump エクスポートのダンプファイルを確認する
Data Pump エクスポートのダンプファイルがあることを確認するには、次のようなコマンドを実行します。
SQL> select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) where FILENAME='dumpname.dmp';
互換性マトリックスを確認する
Oracle のウェブサイトで、異なる Oracle バージョン間の Data Pump の互換性を確認してください。ダンプファイルは、互換性レベルが同じかそれ以上のデータベースにのみインポートできます。ダンプファイルを下位バージョンのターゲットデータベースにインポートする必要がある場合があります。この場合は、Data Pump の VERSION パラメータをエクスポートし、ターゲットデータベースの互換性レベルと一致させます。詳細については、Oracle のウェブサイトで VERSION を参照してください。
以下のコマンド例では、VERSION パラメータを使用してターゲットデータベースの互換性を確認します。
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; /
タイムゾーンファイルについて、ソースのバージョンがターゲットのバージョンよりも高い場合、インポートを実行すると次のエラーが発生することがあります。
- ORA-39002: 操作が無効です
- Ora-3905 : Oracle Data Pump は、XTSTZ バージョン XX のソースデータベースから、TSTZ バージョン XXX のターゲットデータベースへのインポートをサポートしていません。
この問題を解決するには、ターゲットデータベースにパッチを適用するか、ソースのタイムゾーンファイルのバージョンに更新する必要があります。
Oracle のタイムゾーンのバージョンを確認するには、次のクエリを実行します。
Select name,value$ from sys.props$ where name='DST_PRIMARY_TT_VERSION';
ダウンロードタスクのログファイルを確認する
Amazon Simple Storage Service (Amazon S3) 統合を使用してダンプファイルをダウンロードした場合は、ダウンロードタスクのログファイルを確認します。ダンプファイルがエラーなしでコピーされたことを確認します。次のコマンドを実行して、ダウンロードタスクのログファイルを確認します。task-id は、アップロードまたはダウンロードプロシージャが返したタスク ID に置き換えてください。
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'));
構文エラーを解決する
Data Pump API が失敗する一般的な要因は、軽微な構文エラーです。データベース内の構文の問題が原因で発生したエラーの例を次に示します。
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.
これらのエラーを解決するには、次の操作を行います。
- コマンドで指定されたユーザー、テーブル、オブジェクトがデータベース内にあることを確認します。
- 既存のダンプファイルの名前が、コマンドで指定した名前と同じであることを確認します。
- DBMS_DATAPUMP.ADD_FILE を呼び出す前に、ダンプファイルがターゲットの場所に存在しないことを確認してください。ダンプファイルがある場合は、そのファイルを削除します。または、呼び出しごとにファイル名を一意のものにします。
- ユーザー名またはスキーマ名が大文字であることを確認してください。
- API がコマンドで dblink を使用している場合は、参照されているデータベースリンクにアクセスできることを確認してください。また、DBMS_DATAPUMP API 呼び出しで dblink コマンドを使用する前に、コマンドからクエリを実行できることを確認してください。
例外処理を使用して詳細なエラーメッセージをキャプチャする
シナリオによっては、DBMS_DATAPUMP で一般的なエラーを確認できても、詳細情報が得られない場合があります。例外処理ブロックを使用して、エラーに関する追加情報を取得します。例外処理ブロックの例については、Oracle のウェブサイトで「Data Pump API の使用例」を参照してください。
詳細なエラーメッセージの情報に基づいて、問題を解決できます。たとえば、ダンプファイル名が DATA_PUMP_DIR に既にある場合、例外ブロックは次のようなエラーを出します。
「Data Pump ジョブで例外発生
ORA-39001: 引数の値が無効です
ORA-39000: ダンプファイルの指定が正しくありません
ORA-31641: ダンプファイル /rdsdbdata/datapump/example3.dmp を作成できません
ORA-27038: 作成されたファイルは既に存在します
追加情報 1"
スキーマを user1 と指定すると、例外ブロックは次のようなエラーを出します。
「Data Pump ジョブで例外発生
ORA-39001: 引数の値が無効です
ORA-39170: スキーマ式 IN ('user1') はどのスキーマにも対応していません。」
Data Pump ジョブの進行状況を監視する
DBA_DATAPUMP_JOBS ビューは、Data Pump のエクスポートジョブまたはインポートジョブがアクティブか終了したかを示します。これは、成功または失敗のいずれかのステータスで示されます。Data Pump のインポートまたはエクスポートに関する詳細情報を取得するには、V$SESSION_LONGOPS データディクショナリにクエリを実行します。詳細については、Oracle のウェブサイトで DBA_DATAPUMP_JOBS および V$SESSION_LONGOPS を参照してください。
たとえば、次のコマンドを実行すると、Data Pump ジョブの現在のステータスと、完了した作業のパーセンテージを確認できます。
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;
関連情報
Oracle Data Pump を使用してインポートを実行する
DBMS_DATAPUMP (Oracle のウェブサイト)
Data Pump API を使用する際の基本的な手順を教えてください (Oracle のウェブサイト)