データベースサーバーに接続してメンテナンスする場合を考える。
正しく接続すれば目的のサーバーに接続される。しかし正しく接続されなかった場合は・・・?
本来、ホスト名やデータベースサーバーの識別子などはユニークであるはずである。したがって、接続先を正しく記述していれば間違いなく目的のサーバーに接続できるはず。
しかしそうでない場合がある(汗
たとえば、hosts を使用していて hosts に登録している IP アドレスをテストのために別のサーバーのものにしていたとか。あるいは、とあるフォルダにある設定ファイルを読むはずが、Path の優先順などで別の設定ファイルを読んでしまっていたとか。
こういう状況が発生すると、表示上は正しく接続しているように見えるのに、実際に接続しているのは別のサーバーだった・・・ということが発生する。
正しく環境を設定していれば問題ないはずですが、本当に正しいのか?、と疑問に思う場合もあるので、そういう時どう確認したらいいのか、ちょっと考えてみました。
- 指定のポートに対する通信が、どこの IP アドレスと通信しているかを確認する
指定のポートに対する通信を netstat を使って確認します。
Oracle の場合、デフォルトではポート 1521 で通信しているので、以下のように記述します。C> netstat -on | find ":1521" TCP 10.7.28.1:1591 10.7.28.21:1521 ESTABLISHED 3264
- 通信しているプロセスを確認する。
上記では、PID 3264 がポート 1521 の通信をしているという結果なので、そのプロセスが何であるかを確認します。
(自分のマシンのプロセスです。接続相手のプロセスではありません)C> wmic process where "ProcessID=3264" get ExecutablePath, Name ExecutablePath Name C:appclientPcproduct12.1.0client_1sqlplus.exe sqlplus.exe
- 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
- 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
- 上記で 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