どうも、カネスズです。
先日開発にて、ダンプファイルからデータをIMPDPでインポートする作業を行ったのですが
ORA-39126などの様々なエラーが発生し、かなり悩みました。
という訳で、その時に私が行った対処法を覚書き程度に記事にしておきたいと思います。
※環境は仮想環境のLinuxでOracle Database 11です
IMPDPで発生した現象
IMPDPでダンプファイルをインポートする際に、以下のエラーが発生。
致命的なエラー
- ORA-39126:ワーカーに予期せぬ致命的なエラーが発生しました
- ORA-39097:Data Pumpジョブで予期しないエラーが見つかりました
- ORA-39065:マスター・プロセスの予期しない例外が発生しました
PL/SQLのエラー
- ORA-06502:数値または値のエラーが発生しました
- LPX-00230:NameまたはNmtokenに無効な文字が見つかりました
- ORA-06512:PL/SQLのエラー行
致命的なエラーに関して自分なりに調べてみたところ、ダンプファイルをエクスポートした
Oracleのバージョンの差異やダンプファイルの破損が原因と言う回答が多く見られました。
しかし、私の環境ではOracleのバージョンは一致しており、ダンプファイルも新しく
もらったにもかかわらず結果は変わらず……
原因・対処法
PL/SQLのエラーにある
- ORA-06502:数値または値のエラーが発生しました
- LPX-00230:NameまたはNmtokenに無効な文字が見つかりました
の2つから文字コードの設定が間違っているのかと思い、ダンプファイルと環境の
文字コードに差異があることが原因ではないかと仮定しました。
まずは仮想環境であるLinuxの文字コードを、UTF8からSJISに変更
echo $LANG で文字コードを確認
en_US.UTF-8 が表示される。
export LANG=ja_JP.SJIS を実行
ja_JP.SJIS が表示される。
※↑の処理はログオフすると元に戻ってしまうため、常にその文字コードを使いたい場合は
環境変数に「LANG=”ja_JP.SJIS”」を設定する必要がある。
(i18nファイルに設定)
→しかし!結果は変わらず…
SQLPlusの文字コードを変更
.bash_profile ファイルに export NLS_LANG=Japanese_Japan.JA16SJIS を設定
→表示されるインポート時の文字列がひどい文字化けを起こしたが、結果は変化なし…
諦めモードが漂いつつも、データベースに指定している文字コードをUTF8からSJISに
変更するため、データベースを作り直す
→エラー解消!!
→インポートは順調に進むもコンパイルエラー(ora39083)が発生。
→コンパイルエラーはIMPDPの取り込み順に依存してしまうらしく、今回の場合は対処不要
上記の対応で何とか取り込み成功しました。
同じ問題が発生している方の参考になれば幸いです。