【Windows】【Oracle 12c】Oracle 12c DB(64bit) と Client(32bit)を同一サーバ内で同居させる方法

2020年10月9日

2020年も終わりつつある今、記事タイトルのような需要は少ないだろうと思うのですが、仕事でハマって大変な思いをしたので、ムカつきがてら記事化します。

先に結論

同じWindows Server(64bit)内に、

  • Oracle 12c DB (64bit) インストール
  • Oracle 12c Client (32bit) インストール

必要な作業は、上記2点のみです。

システム環境変数"Path"指定で、client_1¥binがdbhome_1¥bin より前になっている必要があります。上記の順でインストールすればそうなっているはずです。

赤枠のように、client_1\bin が dbhome_1\bin より「上」にあること

ネット上にある情報は…

ネット上にも少ないながら64bit DBと32bit Client同居の情報があります。ただそれらに共通しているのは

Windows環境変数ORACLE_HOMEを、ClientのORACLE_HOMEのパスに設定せよ

というものです。

しかしそれをすると、DB側がClient側パスをORACLE_HOMEだと認識します。当然そこ(client_1¥bin)には64bit DBが使用する各種ライブラリが存在しないため(同名exeやdllがあったとしても32bitのもの)、リスナーサービスが動かなくなります。DBは動いているものの、どこからもアクセスできないという状況に陥ります。

そもそもどういう状況?

今回の「Oracle 12c DB(64bit) と Client(32bit)を同居させる」必要がある状況とは、

Oracle DB(64bit) が動作している Windows Server(64bit) の上で、DBアクセスを行う自前プログラム(32bit)を動作させる必要がある場合。

です。

自前32bitプログラムはVB.NETで書かれており、DBアクセスはADODBを使用していました。32bitアプリケーションは、32bitのdllしか呼び出すことができません。Oracle DB(64bit) ではなく、Oracle Client(32bit) が提供する DBアクセス用dll を、自前32bitプログラムが自然に呼び出せるよう、Windowsを設定しておく必要があるのです。

今回のように

  • 環境変数ORACLE_HOMEを設定しない
  • 環境変数Pathで、Clientのパスを先に設定

しておけば、32bit版プログラムのDBアクセスdllがまずClient側パスを見に行くので、正しく32bit版ライブラリが動いてくれます。

逆に、自前64bitプログラムも動かす必要がある場合、この設定では正しく動きません。必ず .bat から起動するようにし、その .bat 内で

SET PATH=(dbhome_1\bin)

をすれば動いてくれます。

つまり、自前32bitプログラムも必ず.bat起動にし、SET PATH=(client_1\bin) すれば動くんですが、いおぶろぐが携わった現場では、対象サーバで動作させるのは32ビットプログラムだけだったので、それが簡単に動く設定としました。

ツッコミどころが多いことは重々承知

自前プログラムも64bitでビルドし直せばいいじゃん?

って仰るのは当然とは思いますが、世の中には長いシステムの歴史を通してプログラムのソースが紛失していたり、そもそも言語自体の開発が終わっていたり、など様々な理由で既存の自前プログラム(32bit)を使い続けねばならない現場というのが存在するのです。

せっかくの機会だから最新の言語を使って64bitでイチから作り直せばいいじゃん?

って仰るのも当然とは思いますが、ソースを紛失するような現場が、仕様書だけ大事に保管できてると思いますか? 仮に存在したとしても、作り直す工数があるかどうかは別の話ですし。

この情報が、どなたかのお役に立てば幸いです。