Oracle Base DBのサービス名を取得する

このシリーズの他の記事は、[オラクル・クラウドの個人ブログ一覧 ](https://qiita.com/letian/items/10152a4fec813c1b7d98)からご覧いただけます。

# 初めに
OCI上のOracle Base DB（旧称：DBCS）に接続する際にサービス名の入力を求められる場合があります。サービス名を取得する方法はいくつかありますので、簡単にご紹介いたします。

**検証済環境**
- DB バージョン：Oracle DB 19c Standard Edition (シングル・ノード、PDB 1個)
- DB タイプ：VM

**目次**
- [1. OCIコンソールから取得する](#1-ociコンソールから取得する)
  - [1-1. CDBの接続文字列](#1-1-cdbの接続文字列)
  - [1-2. PDBの接続文字列](#1-2-pdbの接続文字列)
- [2. OCI-CLIで取得する](#2-oci-cliで取得する)
  - [2-1. CDBの接続文字列](#2-1-cdbの接続文字列)
  - [2-2. PDBの接続文字列](#2-2-pdbの接続文字列)
- [3. Base DBインスタンスにログインしてから取得する](#3-base-dbインスタンスにログインしてから取得する)
  - [3-1 ファイル"tnsnames.ora"](#3-1-ファイルtnsnamesora)
  - [3-2 コマンド"lsnrctl status"](#3-2-コマンドlsnrctl-status)
  - [3-3 SQLコマンド"show parameter"](#3-3-sqlコマンドshow-parameter)
- [4. 各方法の比較](#4-各方法の比較) 

# 1. OCIコンソールから取得する
## 1-1. CDBの接続文字列
DB Systemsの詳細画面から、DB名をクリックし、DBの詳細画面に入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/34bf3830-c61c-bdb4-ee6b-8cb9287039b8.png)

<strong>"DB Connection"(DB接続)</strong>をクリックします。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/561e4242-a5df-38be-a4fa-ead70a7f8526.png)

下記の画面には、<font color="blue">"Easy Connect"(簡易接続)</font>と<font color="blue">"Long"(長)</font>の2つの接続文字列が表示されます。どちらの方法でもサービス名を取得することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/d6ed2ef4-ec0f-c8c5-e5d4-3cba923b520f.png)

"SHOW"(表示)をクリックすると、サービス名が表示されます。
"簡易接続"の場合、<font color="blue">ポート番号1521の後ろ</font>の部分がサービス名になります。
"長"の場合、<font color="blue">"SERVICE_NAME"</font>で明確に示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/85798fb9-18e4-86aa-5071-318b16be28f1.png)

<strong>サービス名の構成：</strong> (Service name)
<font color="blue">\<一意のデータベース名>.\<ホスト・ドメイン名></font>

- <strong>ホスト・ドメイン名：</strong> (Host domain name)
\<Subnet_DNS_label>.\<VCN_DNS_label>.oraclevcn.com 

- <strong>一意のデータベース名：</strong> (Database unique name)
\<DB名>_\<リージョン識別子>\<自動に生成された文字(3桁)>
DB名：DBシステムを作成する際に指定した名前です。
リージョン識別子：OCIリージョンを一意に識別する文字列です。東京リージョンの場合は、"<strong>nrt</strong>"となります（一覧表については、[こちら](https://docs.oracle.com/ja-jp/iaas/Content/General/Concepts/regions.htm)をご参照ください）。

:::note
追記：2024
新バージョンのBase DBの一意のデータベース名、次の構成に変更された。
\<DB名>_<<strong>自動に生成された文字(3桁)</strong>>_<リージョン識別子>
:::

## 1-2. PDBの接続文字列
上記のサービス名は、<font color="blue">CDB</font>接続用です。PDBに接続したい場合、以下の２つ方法でPDBのサービス名が取得できます。
1. \<一意のデータベース名>の文字列にDB名を<font color="blue">PDB名</font>に置き換えれば、PDBのサービス名が取得できます。
2. <font color="blue">PDB接続画面</font>に入り、"Easy Connect"(簡易接続)と"Long"(長)の文字列を確認してください。
Database Details -> Pluggable Database Details -> PDB Connection
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/29c4c6a3-d23f-84d6-b4b0-3e4146721971.png)

※、一意のデータベース名とホスト・ドメイン名は、それぞれ"DB Systems"の詳細画面にも表示されていますが、一括でDB接続文字列を表示する画面から取得する方が迅速です。

# 2. OCI-CLIで取得する
上記のOCIコンソールから取得できる接続文字列は、OCI-CLIでも取得できます。次は、Cloud Shellからの実施例です（Cloud Shellの概要について、[こちら](https://qiita.com/liu-wei/items/d11aea8865accddbfd90)をご参照ください）。

## 2-1. CDBの接続文字列
※、事前にデータベースのOCIDを用意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/65d0900b-08d7-0150-f10c-de5275661527.png)

__接続文字列（簡易接続）を取得する__
コマンド例：`oci db database get --database-id <Database_OCID> --query 'data."connection-strings"."all-connection-strings".cdbDefault'`
```
<username>@cloudshell:~ (ap-tokyo-1)$ oci db database get --database-id ocid1.database.oc1.ap-tokyo-1.<中略> --query 'data."connection-strings"."all-connection-strings".cdbDefault'
"db19c.publicsubnet1.vcn1.oraclevcn.com:1521/db19c_nrt1rq.publicsubnet1.vcn1.oraclevcn.com"
```
※、ポート番号1521の後ろの部分がサービス名になります。

__接続文字列（長）を取得する__
コマンド例：`oci db database get --database-id <Database_OCID> --query 'data."connection-strings"."all-connection-strings".cdbIpDefault'`

```
<username>@cloudshell:~ (ap-tokyo-1)$ oci db database get --database-id ocid1.database.oc1.ap-tokyo-1.<中略> --query 'data."connection-strings"."all-connection-strings".cdbIpDefault'
"(DESCRIPTION=(CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)(ADDRESS_LIST=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.0.38)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=db19c_nrt1rq.publicsubnet1.vcn1.oraclevcn.com)))"
```

※、"SERVICE_NAME"で明確に示されています。

## 2-2. PDBの接続文字列
※、事前に<strong>PDBのOCID</strong>を用意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/736174d7-4c99-6af2-ea48-d5aca53d5833.png)

__接続文字列（簡易接続）を取得する__
コマンド例：`oci db pluggable-database get --pluggable-database-id <Pluggable_Database_OCID> --query 'data."connection-strings"."pdb-default"'`

```
<username>@cloudshell:~ (ap-tokyo-1)$ oci db pluggable-database get --pluggable-database-id ocid1.pluggabledatabase.oc1.ap-tokyo-1.<中略> --query 'data."connection-strings"."pdb-default"'
"db19c.publicsubnet1.vcn1.oraclevcn.com:1521/db19c_pdb1.publicsubnet1.vcn1.oraclevcn.com"
```

__接続文字列（長）を取得する__
コマンド例：`oci db pluggable-database get --pluggable-database-id <Pluggable_Database_OCID> --query 'data."connection-strings"."pdb-ip-default"'`

```
<username>@cloudshell:~ (ap-tokyo-1)$ oci db pluggable-database get --pluggable-database-id ocid1.pluggabledatabase.oc1.ap-tokyo-1.<中略> --query 'data."connection-strings"."pdb-ip-default"'
"(DESCRIPTION=(CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)(ADDRESS_LIST=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.0.38)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=db19c_pdb1.publicsubnet1.vcn1.oraclevcn.com)))"
```

※、OCI-CLIのインストール方法と他のコマンド例については、次の記事をご参照ください。
[便利なOCI CLIコマンド例](https://qiita.com/letian/items/ed30da7a4d37a56ba8bc)

# 3. Base DBインスタンスにログインしてから取得する
DBインスタンスの<strong>OS</strong>にログインすれば簡単にDBサービス名を取得できます。これから、各種取得方法を紹介します。


## 3-1 ファイル"tnsnames.ora"
デフォルトのopcユーザーから<strong>oracle</strong>ユーザーに切り替え、以下のコマンドを実行します。
コマンド例： cat <font color="blue">$ORACLE_HOME/network/admin/tnsnames.ora</font>

ファイルの中身は以下のようです。"SERVICE_NAME"の行を確認してください。

```sql
DB19C_NRT1RQ =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db19c)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db19c_nrt1rq.publicsubnet1.vcn1.oraclevcn.com)
    )
  )
```

## 3-2 コマンド"lsnrctl status"
デフォルトのopcユーザーから<strong>oracle</strong>ユーザーに切り替え、リスナーが起動中の状態で、コマンド "<font color="blue">lsnrctl status</font>" を実行します。


次は出力結果の一部です。
```sql
Service "db19c_nrt1rq.publicsubnet1.vcn1.oraclevcn.com" has 1 instance(s).
  Instance "db19c", status READY, has 2 handler(s) for this service...
Service "db19c_pdb1.publicsubnet1.vcn1.oraclevcn.com" has 1 instance(s).
  Instance "db19c", status READY, has 2 handler(s) for this service...
The command completed successfully
```

※、この方法の利点は、CDBとPDBの両方のサービス名を一括に取得できることです。個人的におすすめします。

## 3-3 SQLコマンド"show parameter"
DB管理者ユーザでSQL PLUSにログインし、以下のコマンドを実施してください。
コマンド例：<font color="blue">show parameter service</font>

```sql
SQL> show parameter service;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      db19c_nrt1rq.publicsubnet1.vcn
                                                 1.oraclevcn.com
SQL>
```

# 4. 各方法の比較
| 方法 | 簡易接続を取得 |長を取得|DBインスタンスの起動要否|
|:-|:-|:-|:-|
|OCIコンソール| ✅  | ✅  |不要|
|OCI-CLI   | ✅  | ✅  |不要|
|tnsnames.ora| ✅  | ✅  |必要|
|lsnrctl status|✅ |   |必要|
|show parameter|✅ |   |必要|

好きな方法を選んでください。

以上です。

----
<strong>関連記事</strong>
[SQL Developerで様々なDBに接続する方法](https://qiita.com/liu-wei/items/08f2e2f6d90c08549cbf)