Oracle接続を図解する＜接続情報の書き方＞

#Oracleデータベースへの接続

Oracleデータベースに接続するためには、クライアント側で接続先の情報を正しく指定する必要があります。
よく使われる「簡易接続ネーミング・メソッド」と「ローカル・ネーミング・メソッド」の2つの接続方法と、疎通確認に使える「tnsping」について、時間がたつと毎度忘れてしまうので、メモとして残します。


## 1. 簡易接続ネーミング・メソッド(EZCONNECT)
「簡易」という通り、クライアント側では構成ファイルを作っておく必要はありません。
以下の情報がわかっていれば、コマンド1行で接続可能です。

 * ユーザ名/パスワード
 * 接続先ホスト名
 * リスナーのListenPort（デフォルト：1521）
 * サービス名(初期化パラメータ SERVICE_NAMES)

<dl>
<dt>接続の構文</dt>
<dd>CONNECT ユーザ名[/パスワード]@接続先ホスト名[:リスナーポート]/[サービス名]</dd>
<dt>接続の例</dt>
<dd>CONNECT user1/passwd@myhost:1521/orcl</dd>
</dl>

![ezconnect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/31c2aeaf-aa89-65b8-e098-9e8991550779.png)

 * 前提として sqlnet.oraファイルに下記の設定が入っている必要があります。(デフォルトで有効)

NAMES.DIRECTORY_PATH=(EZCONNECT)|
---


## 2. ローカル・ネーミング・メソッド
「1.簡易接続」よりも、さらに短いコマンドオプションで接続できる方法です。
簡易接続の時に指定したコマンドオプションのうち、接続先サーバ、リスナーポート番号についてはクライアント環境の tnsnames.ora に書かれているので、省略することができます。
以下の情報がわかっていれば接続できます。

 * ユーザ名/パスワード
 * ネットサービス名(tnsnames.oraに書かれている)

tnsnames.oraには「ネットサービス名」を先頭に持つ複数行からなる定義情報エントリーが存在し、このうち"SERVICE_NAME"に書かれているのが、宛先のデータベース・サービス名(※)となります。

 (※)サービス（データベース・サービス）：
　・クライアントがOracleインスタンス（データベース）に接続するときに指定する名前
　・Oracleサーバ側では初期化パラメータ service_names で定義されている


<dl>
<dt>tnsnames.oraファイルの配置場所</dt>
<dd>$ORACLE_HOME/network/admin ディレクトリ</dd>
<dt>接続の構文</dt>
<dd>CONNECT ユーザ名[/パスワード]@ネットサービス名</dd>
<dt>接続の例</dt>
<dd>CONNECT user1/passwd@orcl</dd>
</dl>

![LocalNaming.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/9579bc0d-d54b-9ef7-6306-bcc89f11fe97.png)


 * 前提として sqlnet.oraファイルに下記の設定が入っている必要があります。(デフォルトで有効)

NAMES.DIRECTORY_PATH=(TNSNAMES)|
---


## 疎通確認に使える「tnsping」「trcroute」コマンド

###tnsping
リスナーに正常に到達できるかどうかを確認できる ping のような接続テストコマンド。
ping ではネットワークレイヤーの疎通確認ができますが、tnspingコマンドを使えばリスナー、データベース(サービス)までの疎通確認が取れます。
もちろん、SQL*Plusから上のCONNECTコマンドでつながるのなら、それで十分事が足りますけど。

 * クライアントからサーバーに正常に接続できた場合は、Oracle Netサービスに到達するために必要な往復時間(ミリ秒単位)の概算が表示されます。
 * 接続に失敗した場合は、発生したエラーを記述するメッセージが表示されます

実行例（簡易接続の場合）：

```
C:\Users\KANA>tnsping myhost:1521/ORCL

TNS Ping Utility for 64-bit Windows: Version 19.0.0.0.0 - Production on 22-7月 -2019 13:08:04

Copyright (c) 1997, 2019, Oracle.  All rights reserved.

パラメータ・ファイルを使用しました:
C:\sw\oracle\WINDOWS.X64_193000_db_home\network\admin\sqlnet.ora

エイリアスを解決するためにEZCONNECTアダプタを使用しました。
(DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=ORCL))(ADDRESS=(PROTOCOL=tcp)(HOST=xxxx::xxxx:xxxx:xxxx:xxxxx)(PORT=1521))(ADDRESS=(PROTOCOL=tcp)(HOST=x.xx.xxx.xxx)(PORT=1521)))に接続の試行中
OK (20ミリ秒)

C:\Users\KANA>

```

実行例（ローカル・ネーミングの場合）：

ネットサービス名は「TARGET」ですので、「tnsping TARGET」と打つだけです。

```
  << tnsnames.ora の定義内容 >>
TARGET =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = myhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
```


```
C:\Users\KANA>tnsping TARGET

TNS Ping Utility for 64-bit Windows: Version 19.0.0.0.0 - Production on 22-7月 -2019 18:36:43

Copyright (c) 1997, 2019, Oracle.  All rights reserved.

パラメータ・ファイルを使用しました:
C:\sw\oracle\WINDOWS.X64_193000_db_home\network\admin\sqlnet.ora

エイリアスを解決するためにTNSNAMESアダプタを使用しました。
(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = myhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))に接続の試行中
OK (10ミリ秒)

C:\Users\KANA>


```

###trcroute

つながらなくて困っているときに使えるツールといえば、UNIX系環境であればTRCROUTEコマンドもありますね。
(今は幸い困っていないしWindows環境なので使えませんが)

Oracle Help Center:
https://docs.oracle.com/cd/E96517_01/netag/testing-connections.html#GUID-9A550EEC-5736-46B4-B10E-55849B01A4D0
> LinuxおよびUNIX環境では、管理者はTrace Routeユーティリティ(TRCROUTE)を使用して、クライアントからサーバーへのパスまたはルートを検出できます。TRCROUTEは、問題に遭遇すると、1つのエラーではなくエラー・スタックをクライアントに戻します。これらの追加エラー・メッセージによって、トラブルシューティングが簡単になります。

> TRCROUTEは、特殊な種類の接続パケットとして送信される点でTNSPINGとは異なります。接続先に向かって移動するとき、TRCROUTE接続パケットは、経由するすべてのノードのTNSアドレスを収集します。エラーが発生した場合、TRCROUTEは、エラーの発生場所を示すエラー情報を収集します。TRCROUTEは、収集した情報をクライアント画面に表示します。TRCROUTEの出力は、ファイルにリダイレクトして印刷できます。