2015年12月10日木曜日

Oracle 複数インスタンス環境でのsqlplus | ライタス株式会社

ひさびさにOracleに関する記事です。

オラクルマスターの方にとってみれば、「あたりまえじゃん」と言われてしまいそうな内容ですが、以外とはまっている方もいるかも知れませんので、記載してみたいと思います。

事の発端は、開発用サーバー(W2k3 R2 + Oracle10g2R)で、セッション数が足りないから増やしてくれと頼まれたことでした。
spfileを書き換えようと、pfileの書き出し->編集->spfile書き戻し->shutdown immediateをやったら、なぜかサーバーにsqlplusで接続できなくなりました。
たぶん、spfileを作るときにキー文句を間違えたか何かしたんだろうと思い、再出力するためにサーバーにsqlplusで接続しようとしたとき、ORA-12514が発生しました。

えーっと・・・もしかして本格的に壊した?(滝汗
なんと言っても、アイドルインスタンスに接続できないのが、やばい。

といったところで、開発サーバーなのでバックアップもとっていない(!)とのこと。どうやって復旧させたものやら・・・と思案していたら、とりあえず変更前のinit.oraから起こすことを思いつきました。
やり方は簡単。 %ORACLE_HOME%\database\SPFILE[oracle_sid].ORAファイルを削除するだけ。
Windowsサービスから強制的に再起動してやることで復旧できました。(あとで、spfileも復元)
こんな単純なことで・・・orz  まだまだ修行が足りませんね・・・

とりあえず復旧したのはいいのですが、ORA-12514が発生した理由が解せません。
翌日、仮想にOracleを立てて作業をトレースしてみたら、再現しました。
なんでだと、いろいろ調べていたら、sqlplusの使い方に問題があったようです。

そもそも、Oracleデータベースに触る方法として提供されているsqlplusは、TCP/IPプロトコル、IPCプロトコルなどの接続形態があるようで、接続方法は、tnsname.oraで決めることができます。
TCP/IP経由でアクセスする場合は、アイドルインスタンスに接続することができない制約があります。(当然といえば当然)
このとき発生するエラーがORA-12514ということになります。

もし、同一サーバー内に複数のインスタンスのデータベースが存在する場合は、
set ORACLE_SID=[oracle_sid]
と事前に環境変数にセットしてからsqlplusで接続するか、tnsname.oraにIPC経由の項目を登録すると回避できます。

くだらない事とは言え、久々に触るといろんな罠があるので、書き留めなければと思った次第。


本記事は、弊社代表のブログ記事なんでもIT屋の宿命からの転載です。

0 件のコメント:

コメントを投稿