【Windows】【Oracle 12c】Oracle 12c DB(64bit) と Client(32bit)を同一サーバ内で同居させる方法
2020年も終わりつつある今、記事タイトルのような需要は少ないだろうと思うのですが、仕事でハマって大変な思いをしたので、ムカつきがてら記事化します。
先に結論
同じWindows Server(64bit)内に、
- Oracle 12c DB (64bit) インストール
- Oracle 12c Client (32bit) インストール
必要な作業は、上記2点のみです。
システム環境変数"Path"指定で、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でイチから作り直せばいいじゃん?
って仰るのも当然とは思いますが、ソースを紛失するような現場が、仕様書だけ大事に保管できてると思いますか? 仮に存在したとしても、作り直す工数があるかどうかは別の話ですし。
この情報が、どなたかのお役に立てば幸いです。
ディスカッション
コメント一覧
まだ、コメントがありません