2010年9月23日木曜日

Oracleの環境変数設定でハマッた件

中途半端な知識がもとで、えらい遠回りをしてしまったので、備忘として書いておきます。
初歩的なことだと思うので「そんな恥をさらさなくても」って気もしますが、エラーメッセージやエラー番号でググってもなかなかピンポイントな解決方法が見つけられなかったので。

Oracleでいわゆる所有者ユーザのOS認証でORACLEのDBにローカル接続する為に最低限必要な環境変数の設定は以下の通り。

  • ORACLE_SID
  • ORACLE_HOME

実際には LD_LIBRARY_PATH とか PATH に $ORACLE_HOME/bin を含めるとか必要と言われるものはもう少しあるんだけど、まあ接続できるまでの最低限というところで。

で、ORACLE_HOME を忘れることはまずないと思うが、この ORACLE_SID を忘れていたために色々と遠回りしてしまいました、という話です。

まず ORACLE_HOME だけ設定して、ORACLE_SID が設定されていないとこんな感じ。
$ sqlplus / as sysdba
ERROR:
ORA-12162: TNS:net service name is incorrectly specified

ここで「@SID」を指定してみたり、どういうわけか TWO_TASK の環境変数を思い出してそれを設定してしまいました。
そうするとこうなった。
$ sqlplus / as sysdba
ERROR:
ORA-12541: TNS:no listener

Listenerが起動していないから?Listenerなんて必要ないはずなんだけど、と不思議に思いながらもListnerを起動してみる。

$ sqlplus / as sysdba
ERROR:
ORA-01031: insufficient privileges

そうすると権限がない、とか言われる。oracle所有の"dba"ユーザなんだけどなぁ...と混乱。
よくよく調べれば、Listener経由のOS認証の為には、また別の設定をしなければいけないので、その為に出ていたエラー内容だったと理解できるわけですが、調べているとこの辺に絡んだバグで対処方法の一環で「コンパイルし直せ」みたいな記事もあったりして、その対処方法を試しても何も変わらずで、悶々とした時間が過ぎ去る。

最終的にどうやって気づいたかはもう忘れましたが、結局地道にインストールマニュアルとかを読み直していたんだと思います。

ちなみに ORACLE_SID 環境変数を設定しても、TWO_TASK が設定されたままだと相変わらずListener経由接続が優先されて、"insufficient privileges"とか"no listener"とか言われます。

よくよく考えたら、"$ . dbenv" 使って環境変数設定すればいいって話ではありました。

ちなみに直接関係ないですが、"oracle"ユーザーとか"dba"グループとかって、Oracleのインストール関連のマニュアルに書いてあるけど、ほんとにそのままの名前で環境構築されたりしているときがあって、実際の名前はなんだっていいっていうのをわかっててやっているんだろうか?と疑問に思うことも多々ある。

0 コメント: