[ORACLE] SQL*Plusでローカル接続しようとするとORA-12560エラーが発生 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

SQL*Plusで接続識別子またはネット・サービス名を指定せずにデータベースに接続しようとすると、デフォルトのデータベースに接続されます。


10g Windows版の場合、デフォルトのデータベースは以下の優先順位にしたがって決定されるようです。

1.環境変数LOCALに設定されているネット・サービス名

2.レジストリ\HKEY_LOCAK_MACHINE\SOFTWARE\ORACLE\KEY_{ORACLE_HOME_NAME}\LOCALに設定されているネット・サービス名

3.環境変数ORACLE_SIDに設定されているネット・サービス名

4.レジストリ\HKEY_LOCAK_MACHINE\SOFTWARE\ORACLE\KEY_{ORACLE_HOME_NAME}\ORACLE_SIDに設定されているネット・サービス名


1、2が採用された場合は、リスナー経由で接続され、サービス名が解決できない場合はエラー(ORA-12514)となります。

3、4が採用された場合は、ローカル接続(BEQ接続)で接続され、サービス名が解決できない場合は、エラー(ORA-12560)となります。

また、1、2、3、4のいずれも設定されていない場合はエラー(ORA-12560)となります。


普通にデータベースを1つだけ作成した場合、レジストリに\HKEY_LOCAK_MACHINE\SOFTWARE\ORACLE\KEY_{ORACLE_HOME_NAME}\ORACLE_SIDが作成され、その値に作成したデータベースのサービス名がセットされます。

したがって、SQL*Plusで接続識別子またはネット・サービス名を指定しなかった場合、上記の4が採用され、作成したデータベースにローカル接続されます。

大抵の環境ではこのような状態で運用されていると思いますので、SQL*Plusで接続識別子またはネット・サービス名を指定しないことが問題になることはまずないと思います。


ただし、複数のインスタンスを作成した場合は、このORACLE_SIDがどのデータベースを指しているかを意識しておかないと、エラーが発生したり、意図しないデータベースに接続されてしまう恐れがありますので注意が必要です。


と、ここまで知っておけば、SQL*Plusで接続識別子またはネット・サービス名を指定せずにデータベースに接続しようとして問題が発生したとしても解決できるはずなのですが、先日、これでも解決できないケースに遭遇しました。

あるデータベースで複数のインスタンスを作成して様々なテストを行っていると、いつの間にかローカル接続でORA-12560が発生するようになったのです。

複数のインスタンスを作成したことでローカル接続できなくなってしまったのではないかと思い、上記の3または4が採用されるよう環境変数やレジストリの設定をいろいろいじってみたり、複数作成したインスタンスを削除して1つだけにしてみたりもしたのですが、状況は全く変わりません。

最終的には全てのインスタンスを一旦削除して、再度インスタンスを作成することで正常な状態に戻ったのですが...

なんだか釈然としない現象でした。