OracleからPostgreSQLへ移行しようとora2pgを動かすと、最初の1コマンドで止まることがあります。install_driver(Oracle) failed、ORA-12154、ディクショナリ参照の権限エラーと、返ってくるメッセージの層がばらばらで、どこを直せばよいのか判断しづらい。Perlモジュールを入れ直したりora2pg.confを書き換えたりを順不同で試すと、どの変更で状況が変わったのか分からなくなります。確認する順序を先に決めておけば、原因を接続層、ライブラリ層、設定層のどれかに数分で絞り込めます。
この記事は「ora2pg エラーの原因切り分けと対処手順」の一部を、話題を絞って書き直したものです。エラーメッセージ別の対処や、変換結果の文字化け・型マッピング・PL/SQLの見直しは、ブログの完全版にまとめています: ora2pg エラーの原因切り分けと対処手順
確認は3層に分けて上から進める
最初に実行するのはSHOW_VERSIONです。Oracleへ接続してv$version相当の情報を取得するだけの処理なので、バージョン文字列が返れば、Perlモジュール、クライアントライブラリ、ネットワーク、認証のすべてを通過できたと判断できます。逆にここで失敗したときは、メッセージを次のように分類します。
-
install_driver(Oracle) failedはPerlとクライアントライブラリの構成問題 -
ORA-12154(接続識別子を解決できない)、ORA-12541(リスナーなし)、ORA-12514(サービス名を知らない)はDSN、tnsnames、リスナー側 -
ORA-01017(ユーザー名/パスワード不正)、ORA-28000(アカウントロック)は認証 - 接続は成功するが権限エラーになる場合はデータディクショナリへの参照権限
ora2pgが発行しているSQLやディレクティブの解釈結果を見たいときは、-dを付けてデバッグ出力を増やします。
sqlplusと比較してora2pg側の問題か判定する
ora2pgの設定を疑う前に、同じホスト、同じOSユーザーからsqlplusで接続できるかを確認してください。sqlplusでは接続できるのにora2pgで失敗するなら、ora2pg.confのDSN書式が原因です。sqlplusでも接続できないなら、ネットワーク、リスナー、認証のどれかに問題があります。この一手で調査範囲が半分になります。
DBD::Oracleと共有ライブラリの解決を見る
install_driver(Oracle) failed系は、ほぼこの層で決まります。DBI->available_driversの一覧にOracleが出てこない、またはDBD::Oracleのバージョン表示でエラーになるなら、DBD::Oracle自体が未導入か、共有ライブラリの解決に失敗しています。後者かどうかはOracle.soにlddをかけて判断でき、libclntsh.so.19.1 => not foundのように出た場合はInstant Clientのパスが実行時に解決されていません。
見落としやすいのが実行コンテキストによる環境変数の差です。対話シェルでは.bash_profileのLD_LIBRARY_PATHが有効でも、cronやsystemdのサービス、CIのジョブには渡りません。手で実行すると動くのに自動実行で失敗する場合は、まずORACLE_HOMEとLD_LIBRARY_PATH、TNS_ADMIN、NLS_LANGが渡っているかを確認します。
ora2pg.confで確認する3点
接続層を通過したら設定ファイルを点検します。DSNはdbi:Oracle:ORCLのようなTNSエイリアス形式だとtnsnames.oraとTNS_ADMINに依存するため、ORA-12154が出るときはホスト指定形式に切り替えると依存を切り離せます。マルチテナント環境ではPDBへ接続するのでservice_name=を使ってください。次にSCHEMAの大文字小文字です。Oracleはクォートなしで作成したオブジェクト名を大文字でディクショナリに保持するため、SCHEMA appdataと小文字で書くと一致せず結果が空になります。3点目はパスワードの扱いで、ORACLE_PWDの値に#が含まれるとコメントとして解釈される可能性があります。記号を含むパスワードは変更するか、ORA2PG_PASSWD環境変数で渡す方法を公式ドキュメントで確認してください。
最初に投げる2つのコマンド
ora2pg -c /etc/ora2pg/ora2pg.conf -t SHOW_VERSION
sqlplus 'MIGUSER/password@//10.0.0.10:1521/ORCLPDB1'
元記事で扱っている内容
-
install_driver(Oracle) failedやORA-12154などのエラーメッセージ別の対処方法 - ora2pgのトラブルを「接続」「文字コード」「変換差異」の3分類で整理する考え方
- 変換結果が合わないときの文字化け、型マッピング、PL/SQLの見直し手順
-
USER_GRANTSやNLS_LANGを含むora2pg.confの最小構成例 - 移行検証を何度でも繰り返せる状態にしておくための再発防止策