調べて、学ぶ

検索したり実験したことを覚えとくブログ

レガシーサーバ移行でoracleドライバと戦う

何をしたか

レガシーサーバ(win2003)環境をwin2019に移行する中で、あるアプリでoracleドライバが必要なことが判明。それもoracle10g。 今回はwindows2019サーバにoracle instant client(10.2)をインストールしたときの記録です。

環境

  • windows2003sp2(移行元)
  • windows2019(移行先)
  • 移行元にある、とあるアプリ(実行したらoracle10ドライバが見つからないというログを吐く)

ログが10gに言及しているならoracleドライバがいるのだろう。ということで、oracle instant clientをダウンロードする

やったこと

  • oracle instant client(32bit)のダウンロードサイト(※1)に行き、basicとodbcのzipをダウンロード

  • ダウンロードした2つのzipを解凍して同じフォルダに配置(いわゆるガッチャンコ)

  • 移行元のサーバからoracleドライバのフォルダ(productフォルダ内にある「network」フォルダ)をコピーし、新サーバのinstantclientフォルダ内に貼りつけ(この中にあるtnsname.oraが接続定義なのです)

  • システム環境変数「PATH」の先頭にoracle instantclientのフォルダパスを記載

  • コマンドプロンプトで上記のフォルダに移動し(※2)odbc_install.exeを実行
    →ここまでやるとodbc作成時の選択肢に「Oracle in instantclient10_2」が現れる

  • ODBCデータソースからOracle in instantclient10_2を選び(※3)、接続情報を入力する。
    →終了!

ハマり・しくじり

  • ※1 win2019は64bitですが、対象のアプリが32bitなのです。
     それに気づかず64bitのinstantclientのインストール後に「odbc(32bit)に選択肢が出てこないぞ?」となってました

  • ※2 ハマったので結論だけ書きますが、カレントディレクトリが配置フォルダになっていないと「Couldn't find Oracle Instant Client in present directory」と返されて終わります。

  • ※3 odbc画面で「Oracle in instantclient10_2」を選択して次へ行こうとすると下記のメッセージが出て終了してハマる

システム エラー コード 126:指定されたモジュールが見つかりません。
(パス\SQORAS32.DLL)のために、Oracle in instantclient10_2 ODBCドライバーの
セットアッププログラムを読み込むことができません。

ランタイムだな..とあたりをつけて探し回るといかにもそれな記事を見つけるが、必要なファイルのうちMFC71.DLLだけ見つからない。

ファイル名からvc++ランタイムなのは自明なので、vector内で「vc++」で検索するとVC++ .NET ランタイムインストーラー 1.0が見つかる。ダウンロード・解凍したフォルダから「mfc71.dll、msvcp71.dll、msvcr71.dll」をコピーしてwin2019のc:\windows\sysWOW64」に貼りつけたらやっと動いた。


かれこれサーバ移行は物理→仮想(hyper-v)→osアップグレードとやってるけど、ここまで古いOSだといろいろめんどくさい。

  • smb2.0をサポートしてないので、ファイルを直送できない
    →かといってwin2019にsmb1.0機能(たとえsmbクライアントでも)持たせるのは、前回の記事を考えるとやりたくない
  • タスクスケジューラのエクスポート形式がwin2019と合わない(移行元から接続して対応)
  • IIS(FTP)も使われていて、管理画面の違いを脳内変換しないといけない
  • たいがいのアプリは動くけど、今回みたいにDLLをsysWOW64に置かないといけない時がある(動かしてみないとわからない)

面倒ではあるけれど、20年前の環境で動かしたプログラムが今でも動くのはさすがwindows。「互換性の鬼」と言われるだけある。