(4) エラー対応
(4-1) エラー1:ORA-39002,ORA-39070,ORA-39087
(4-1-1) 発生状況・エラーメッセージ
(4-1-2) 原因
(4-1-3) 対処
(4-2) エラー2:ORA-39083,ORA-01658
(4-2-1) 発生状況・エラーメッセージ
(4-2-2) 原因
(4-2-3) 対処
(4) エラー対応
(4-1) エラー1:ORA-39002,ORA-39070,ORA-39087
(4-1-1) 発生状況・エラーメッセージ
expdpでデータベースのバックアップを取得しようとした際にエラーとなりました。
ORA-39002: invalid operation ORA-39070: Unable to open the log file. ORA-39087: directory name DATA_DUMP_DIR is invalid
(図411)
(4-1-2) 原因
“directory”のオプションにてエラーになっていますが、Data Pumpによるエクスポートでは、ディレクトリオブジェクトによるdmpやlogの出力先の指定が必須となっており、ここの設定がうまく出来ていない時などにこのエラーが出ます。
(4-1-3) 対処
今回のケースでは「DATA_PUMP_DIR」のRead/Write権限がexportを実行するユーザーに対して付与する必要があります。
<権限付与コマンド>
GRANT READ ON DIRECTORY DATA_PUMP_DIR TO SCOTT; GRANT WRITE ON DIRECTORY DATA_PUMP_DIR TO SCOTT;
(図413)
(4-2) エラー2:ORA-39083,ORA-01658
(4-2-1) 発生状況・エラーメッセージ
impdpでデータベースのダンプを他DBにインポートしようとした際にエラーとなりました。
ORA-39083: Object type TABLE:"[Table Name]"."[Column Name]" failed to create with error: ORA-01658: unable to create INITIAL extent for segment in tablespace [Table Space Name]
(図421)
(4-2-2) 原因
データファイルの容量が足りずに、INITIALエクステント領域を確保できなかったために当該エラーが発生しています。
Oracleではセグメントを作成した際に最初に確保される領域をINITIALセグメント(連続したデータブロック)と呼んでいます。そしてINITIALセグメントが満杯になるとOracleは自動で新しいエクステントをセグメントに割当てますが、これをNEXTエクステント(増分エクステント)と呼びます。
今回のケースではテーブルの作成時に初期のデータファイルの容量を小さく指定し過ぎてしまった事が根本原因でした(エクスポート側とインポート側でサイズを揃えたつもりが、そうなっていなかった)
その結論に至るまでの調査で利用したSQLを二つ備忘で記載します。
■原因調査SQL①
まずは表領域の状態をチェックしました。
select * from dba_tablespaces;
エクステントに関連する数値に着目していましたが、結果としてエクスポート元もエクスポート先も同じ設定になっていました。
(図422)②dba_tablespaces(エクスポート側)
↑
差異なし
↓
(図422)③dba_tablespaces(インポート側)
■原因調査SQL②
表領域の設定は同じだったので、次はデータファイルのサイズを比較するためにdba_data_filesテーブルでデータファイルの容量をチェックしました。
select * from dba_data_files;
こちらに関しては差異がありました。エクスポート側が100MBに対して、インポート側は2MBしか確保されていませんでした。
(図422)④dba_data_files(エクスポート側)
104,857,600/1024/1024 = 100MB
↑
差異あり
↓
(図422)⑤dba_data_files(インポート側)
2,097,152/1024/1024 = 2MB
(4-2-3) 対処
上記の差分をなくすため、インポート側のデータファイルをエクスポート側に揃える形で100MBに拡張したら、インポートが正常に動作しました。
(図413)