[Oracle] 接続先を確認する方法 (Windowsの場合)

2015年9月11日

 データベースサーバーに接続してメンテナンスする場合を考える。
 正しく接続すれば目的のサーバーに接続される。しかし正しく接続されなかった場合は・・・?

 本来、ホスト名やデータベースサーバーの識別子などはユニークであるはずである。したがって、接続先を正しく記述していれば間違いなく目的のサーバーに接続できるはず。

 しかしそうでない場合がある(汗

 たとえば、hosts を使用していて hosts に登録している IP アドレスをテストのために別のサーバーのものにしていたとか。あるいは、とあるフォルダにある設定ファイルを読むはずが、Path の優先順などで別の設定ファイルを読んでしまっていたとか。
 こういう状況が発生すると、表示上は正しく接続しているように見えるのに、実際に接続しているのは別のサーバーだった・・・ということが発生する。

 正しく環境を設定していれば問題ないはずですが、本当に正しいのか?、と疑問に思う場合もあるので、そういう時どう確認したらいいのか、ちょっと考えてみました。

  1. 指定のポートに対する通信が、どこの IP アドレスと通信しているかを確認する

     指定のポートに対する通信を netstat を使って確認します。
     Oracle の場合、デフォルトではポート 1521 で通信しているので、以下のように記述します。

    C> netstat -on | find ":1521"
      TCP         10.7.28.1:1591         10.7.28.21:1521        ESTABLISHED     3264
    
  2. 通信しているプロセスを確認する。

     上記では、PID 3264 がポート 1521 の通信をしているという結果なので、そのプロセスが何であるかを確認します。
     (自分のマシンのプロセスです。接続相手のプロセスではありません)

    C> wmic process where "ProcessID=3264" get ExecutablePath, Name
    ExecutablePath                                       Name
    C:appclientPcproduct12.1.0client_1sqlplus.exe  sqlplus.exe
    
  3. sqlplus でサーバー側のホスト名/データベースサービス名(SID)が知りたい場合。

     SQLPlus を使用して、sys_context('USERENV','INSTANCE_NAME'), sys_context('USERENV','SERVER_HOST') を表示します。

    SQL> select sys_context('USERENV','INSTANCE_NAME') from dual;
    
    SYS_CONTEXT('USERENV','INSTANCE_NAME')
    --------------------------------------------------------------------
    orcl
    
    SQL> select sys_context('USERENV','SERVER_HOST') from dual;
    
    SYS_CONTEXT('USERENV','SERVER_HOST')
    --------------------------------------------------------------------
    oracleserver
    
  4. sqlplus でサーバー側の IP アドレスを知りたい場合。

     SQLPlus を使用して、UTL_INADDR.GET_HOST_NAME, UTL_INADDR.GET_HOST_ADDRESS を表示します。
     しかし、権限がないと失敗するので、権限がない場合はあきらめます(汗

    SQL> set serveroutput on
    SQL> begin
      2    dbms_output.put_line('Host: ' || UTL_INADDR.GET_HOST_NAME); 
      3    dbms_output.put_line('IP  : ' || UTL_INADDR.GET_HOST_ADDRESS);
      4  end;
      5  /
    Host: ORACLESERVER
    IP  : 192.168.0.1
    
  5. 上記で IPv6 アドレスが表示されてしまう。IPv4 アドレスで得たい。

     無理です。諦めましょう (汗

     IPv6 が表示されるのは IPv6 が IPv4 より優先されるように設定されているからです。
     優先順は以下のコマンドで確認できます。(サーバー側で実施)

    C> netsh interface ipv6 show prefixpolicies
    優先順位   ラベル  プレフィックス
    ----------  -----  --------------------------------
            50      0  ::1/128                ← IPv6 ループバック
            40      1  ::/0                   ← IPv6
            35      4  ::ffff:0:0/96          ← IPv4
            (以下略)
    

     IPv4 を最優先に設定すれば、IPv4 アドレスが表示されるようになります。
     上記の例だと、以下のコマンドを実行して、IPv4 が一番上に来るようにします。

    C> netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 51 4
    OK
    
    C> netsh interface ipv6 show prefixpolicies
    優先順位   ラベル  プレフィックス
    ----------  -----  --------------------------------
            51      4  ::ffff:0:0/96          ← IPv4 を一番上にする
            50      0  ::1/128
            40      1  ::/0
            (以下略)
    

     これを事前にサーバー側で実施していれば、IPv4 アドレスで表示されます。

     また、デフォルトに戻したい場合は、以下を実行します。(要再起動)

    C> netsh interface ipv6 reset
    





カテゴリー: Oracle, OS, Windows, データベース

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org