Oracle Cloud(OCI)のDBaaSを初めて使う人がハマる(かもしれない)ポイント

2019/2/11 新規作成
2019/2/28 更新（$ORACLE_HOME/binへのpathが最初から通るようになってた点を追記）
2019/6/11 更新（DB systemの情報確認方法の追加、接続できない問題の解決パターンを追加）
***

# はじめに
cloudの登場で気軽にoracle dbを触れるようになりましたが、いきなりハマってしまう人を見かけます。これはもったいないので、oracle cloud(oci)のDbaaSを使う際の、ハマりポイントを簡単にまとめてみました。

## 想定読者
・oracle cloud infrastructure(oci) dbaasを初めて触る人/お試しで触ってみて困ってる人
・oracle dbを少しだけ触ったことある人
・oracle db SEユーザー
 ※oci-classicのdbcsは対象外

## マニュアル
・[Connecting to a DB System](https://docs.cloud.oracle.com/iaas/Content/Database/Tasks/connectingDB.htm?Highlight=ORACLE_SID)

# 0.接続情報が見つからない
DBaaSをポンと作成して、さぁ接続しよう、と思ったものの、IPアドレスはどこ？となるパターン。ちょっと画面がわかりにくいので、意外と多いです。

DBaaSの詳細画面へ行くと、左に「リソース」メニューが並んでいます。最初に開くと「データベース」になっていて、データベースに関する情報が見られますが（DBユニーク名や接続文字列など）、**IPアドレスなどサーバーが持つ情報は「ノード」タブから確認できます**。
![Qiita20190611.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109270/5cdd11e3-c6c3-488d-b4de-13532aea7a88.png)


ちなみに**DBaaS(DB system)を停止する場合もこの画面から行います**。「データベース」のページからは「終了」（＝削除）か、バックアップ/リストアの操作しか出来ませんので注意してください。また、ノードが停止（黄色アイコン）していても、「データベース」ページから見ると「データベース」は「Available」（緑色アイコン）になっています（課金はちゃんと止まっています）。
なお、コンソールから「停止」した場合は、DBやOSの停止コマンドは発行されないので(2019/6現在)、**先にDBやOSを停止してからノードの「停止」を行うようにしてください**。


# 1.接続できない!!
接続情報はわかった、今度こそ接続！しようとするとエラーが返ってくる、、という悲しいやつ。
こういうところでハマるのは0にしたい。

## DB System（node）に接続できないパターン

### 事象
- pingが通らない
- ホストが見つかりませんと言われる
- 接続が拒否される

### 考えられる原因
- ① DBインスタンスをprivate subnetに配置している
- ② gatewayを設置していない
- ③ セキュリティリストで通信が許可されていない
- ④ SSHキーが違う
- ⑤ root領域があふれてる
- ⑥ その他

### 対処

#### ① public subnetで作り直しましょう

DBaaSを作成する際に、配置先のsubnetを指定する必要があります。こちらは事前に作成しておくものですが、["private subnet"と呼ばれるpublic ipを持たないsubnet](https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/overview.htm#Public)にDBaaSインスタンスを作成すると、インターネット経由で直接アクセスすることは出来ません。

もちろん踏み台サーバー経由やVPN等を利用してプライベート接続を行えばprivate subnet内のDBインスタンスへ接続できますので、意図してprivate subnetに配置している場合は、それらの方法を試みてください。そうではなく、とにかく試しに作って触ってみたい、という場合は、public subnetで再作成しましょう。
データを引き継ぎたい場合は、バックアップから新規インスタンスの作成ができます。
参考）[To launch a new DB system from a backup](https://docs.cloud.oracle.com/iaas/Content/Database/Tasks/launchingDB.htm)

#### ② Gatewayを作りましょう

publicサブネットに作成していても、Internet Gatewayが無いと通信できません（プライベート接続の場合はDRG）。Internet Gatewayを対象VCNに作成し、ルーティングの設定を行いましょう。
参考）[To create an internet gateway](https://docs.cloud.oracle.com/iaas/Content/Network/Tasks/managingIGs.htm)

#### ③ セキュリティリストで必要な通信を許可しましょう

VCNのsubnet内の各インスタンスはセキュリティリスト機能でパケットフィルタリングが行われています。Linuxの場合デフォルトでは、22番の通信とICMP(type 3 code 4)は許可されていますが、それ以外の通信（例えば1521）は自分で設定する必要があります。
セキュリティ上デフォルトのセキュリティリストは使わないことも多いと思います。その場合、「22番が通らない」「pingが通らない」ということも良くあるので、通信できない場合はセキュリティリストを一度見直してみるといいと思います。
参考）[To view a cloud network's default security list](https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/securitylists.htm)

※なお、Computeインスタンスの場合、OSレベルのパケットフィルタ(iptablesなど)もデフォルトでは、22番以外の接続を拒否するように設定されているので、同じ問題でハマっている場合はこちらも確認してください。

#### ④ SSHキーを再登録しましょう
SSHで接続している場合、対応する鍵を見つけてください。見つけられない場合は、DB systemsの詳細ページから「Add SSH Kyes」で鍵を再登録しましょう。（古い鍵は使えなくなりますが、.bkpという形で.ssh配下にバックアップされています。不要であれば削除しましょう）

#### ⑤ 領域を追加しましょう
root領域がいっぱいだと、SSHアクセスが拒否されます。DB systemsの詳細ページから「Scale Storage up」をクリックし、領域を増やしましょう。

#### ⑥ その他
##### 少し待ちましょう
他にもいろいろと原因は考えられますが、よくあるのがコンソール画面上「Available」になってすぐアクセスして、「接続できない」というケース。DB systemのNodeの「Available」はVMとして準備ができた段階なので、OSセットアップ等が完了するのにやや時間差があります。少し待つと接続できることがあるので、直後に接続できない場合は少し時間をおいてから試してみてください。

##### プロキシサーバーの設定をしましょう
社内のネットワークを利用していて、プロキシサーバー経由でインターネット接続を行う場合、接続に利用するアプリケーションにプロキシサーバーの情報を設定する必要があります。プロキシサーバーの情報は、社内のネットワーク管理者の方に問い合わせてください。

##### 利用するネットワークを変えてみましょう
社内のネットワークを利用している場合、セキュリティ上HTTPやHTTPSでしかインターネットへ接続できないようになっている場合があります。ルール上問題なければ、自由に使えるネットワークを利用してアクセスしてみてください。

##### 障害が発生していないか確認しましょう
利用しているサービスに影響のある障害が発生した場合は、テナンシー管理者（契約時に指定してメールアドレス）へ連絡がいきます。管理コンソール画面右上のベルマークからもアナウンスを確認することができます。

また、以下のページからも障害情報を確認できます。ネットワークやDBaaSに関する障害が発生していないか確認してください。
https://ocistatus.oraclecloud.com/


## Databaseに接続できないパターン
※DbaaSインスタンスにてローカル接続することを想定

### 事象
- sqlplusが動かない
    - `-bash: sqlplus: command not found`
- sqlplus使用時にエラーが出る
    - `SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory`
- 接続時にエラーが出る
    - `tns:could not resolve the connect identifier specified`
    - `ORA-12541: TNS:no listener`　など


### 考えられる原因
- ① sqlplusのpathが通っていない
- ② 環境変数が未設定
- ③ 接続情報を間違えている

### 対処
#### ① pathを通しましょう
DBaaSインスタンス作成直後はOracle Homeのbinへのpathが通っていません。`/u01/app/oracle/product/<ver>/dbhome_1/bin`から直接打つか、pathを通せばsqlplusを利用できるようになります。
※2019/2/28 追記：新規インスタンス作成時点でpathが通るようになってました!

`$ export PATH=$PATH:/u01/app/oracle/product/<ver>/dbhome_1/bin`
必要に応じて.bash_profileや.bashrc等で記載しましょう。

#### ② 環境変数を設定しましょう
sqlplusでDBへ接続するためにはいくつか必要な環境変数があります（OS認証する場合/しない場合などでやや異なりますが、細かいことは省略）。
とりあえず、以下3つを設定します。

- ORACLE_UNQNAME
- ORACLE_SID
- ORACLE_HOME

`/u01/app/oracle/product/<ver>/dbhome_1/bin`配下に「oraenv」というファイルがあり、ORACLE_SIDを指定すれば自動で環境変数を設定しくれます。ORACLE_SIDにはDB名を指定すればOKです。

```shell
[oracle@dbaas bin]$ . oraenv
ORACLE_SID = [oracle] ? orcl
The Oracle base has been changed from /home/oracle to /u01/app/oracle
[oracle@dbaas bin]$ env | grep ORA
ORACLE_SID=orcl
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/18.0.0.0/dbhome_1
```

※補足。「[データファイルがない](#データファイルがない)」で記載した通り、oci dbaasはoracle clusterwareを使っています。ORACLE_UNQNAME（というかwalletの場所）はクラスタウェアが管理しているので、直接sqlplusをたたく場合は自分で明示的に設定してあげる必要があります。

#### ③ 接続情報を確認しましょう
DBへ接続方法はいくつかありますが、リモート接続する場合は共通で必要な情報がいくつかあります。これらの情報は基本的にコンソール画面から確認可能なので、誤りがないか確認してください。

- ホスト名（DB systemのhost名+domain名）
- リスナーのリッスンしているポート（デフォルトは1521）
- DBのサービス名（PDB：\<pdb名>.domain名、CDB：\<DB_unique_name>.domain名）

CDBへの接続についてはコンソールのDatabaseの詳細画面から（nodeではなく）、「DB Connection」のボタンをクリックすると、コピー可能な形で表示されるので、活用してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109270/74d0e85f-0332-a94f-7fb7-1b9fd6cd076d.png)

※エラーごとの被疑箇所等はここでは省略します。

pdb名については、2019年2月11時点ではコンソールから確認できない模様です。作成時に指定したpdb名を忘れてしまった場合は、DB Systemのnodeへアクセスして、oracleユーザーでリスナーのエンドポイントを確認（`lsnrctl status`）するのが速いと思います。

なお、tnsnames.oraの書き方に問題があり、エラーになるケースも多いので、改めてoracle dbのマニュアルを確認してください。
参考：(18c) [6.2 tnsnames.oraの一般的な構文](https://docs.oracle.com/cd/E96517_01/netrf/local-naming-parameters-in-tnsnames-ora-file.html#GUID-47DAB4DF-1D35-46E5-B227-339FF912E058)


## 2.なんかいつもと違う…
nodeの中に入ってしまえば、OnPと同じOracle DB!!、、なのですが、OnPのOracle DBといっても、いろんな構成があり、ociのDbaaSと同じ構成を使ってなかった人にとっては、慣れない部分が多いと思います。

主なポイントは、CDB構成（12c~）ということと、grid infrastructureを採用しているという2点でしょうか。

### いつもの操作がエラーになる
ociのdbaasで12c以降のDBを指定した場合、CDB構成でDBが構築されます。sqlplusを通してOS認証でDBへ接続すると、CDBへ接続されるので、例えばこの状態でtestユーザーを作ろうとすると怒られます。

```sql
[oracle@dbaas ~]$ sqlplus /nolog

SQL*Plus: Release 18.0.0.0.0 - Production on Mon Feb 11 08:35:04 2019
Version 18.2.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

SQL> conn sys as sysdba
Enter password:
Connected.
SQL> create user test identified by oracle$$ORACLE00;
create user test identified by oracle$$ORACLE00
            *
ERROR at line 1:
ORA-65096: invalid common user or role name
```

これはクラウドに関係なく、12cやcdb/pdbの話なのですが、cdbに慣れていないとハマるポイントかもしれません。細かくは説明しませんが、cdbへ接続した状態からpdbへの接続するための以下のコマンドだけ紹介しておきます。

どんなPDBがあるのか確認

```sql
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB01                          READ WRITE NO
```

指定したPDBへ接続する

```sql
SQL> alter session set container=pdb01;

Session altered.
```

PDBへ接続できれば、あとはいつも通りの操作が可能です。

```sql
SQL> create user test identified by oracle$$ORACLE00;

User created.
```

いちいちpdbへ接続しなおすのは面倒なので、ネットワークサービス名を通してpdbへ直接接続することをおすすめします（tnsnames.oraに書く）。


### データファイルがない
こちらもクラウドならでは、のものではありませんが、普段、Oracle DBのデータファイルをファイルシステムに置いているユーザーは、$ORACLE_HOME/dbsにデータファイルがないことに戸惑うかもしれません。

```shell
[oracle@dbaas ~]$ cd /u01/app/oracle/product/18.0.0.0/dbhome_1/dbs/
[oracle@dbaas dbs]$ ll
total 12
-rw-rw---- 1 oracle asmadmin 1544 Feb 11 07:46 hc_orcl.dat
-rw-r--r-- 1 oracle oinstall 3079 May 14  2015 init.ora
-rw-r----- 1 oracle oinstall 3584 Dec 20 12:39 orapworcl
```

ociのDbaaSは、RACでよく利用されるgird infrastructureを採用していて、Oracle ClusterwareおよびASMという技術が使われており、データファイルはASMに格納されます（詳しい説明は省略）。

```shell
[grid@dbaas ~]$ asmcmd
ASMCMD> cd +DATA/<DBユニーク名>/DATAFILE
ASMCMD> ls
SYSAUX.262.995373185
SYSTEM.261.995373139
UNDOTBS1.263.995373199
USERS.274.995374183
```

ASMの方がいろいろ便利なのですが、慣れていないと戸惑うことが多いと思います。

データファイルの場所に限らず、grid infrastructureがベースになっていることで、運用が変わりうるので、本格的にoci DbaaSを利用する場合は、ASMやoracle clusterwareについては確認しておくと良いと思います。

### 参考
- (DBマニュアル18c) [Automatic Storage Management管理者ガイド](https://docs.oracle.com/cd/E96517_01/ostmg/index.html)
- (DBマニュアル18c) [Clusterware管理およびデプロイメント・ガイド](https://docs.oracle.com/cd/E96517_01/cwadd/index.html)
- (製品ページ) [Oracle Automatic Storage Management（Oracle ASM）](https://www.oracle.com/technetwork/jp/database/database-technologies/cloud-storage/asm/overview/index.html)
- (製品ページ) [Oracle Clusterware](https://www.oracle.com/technetwork/jp/database/database-technologies/clusterware/overview/index.html)
- (公開セミナー資料) [Oracle RAC/ Oracle ASM / Oracle Clusterware 最新機能詳解](https://www.oracle.com/technetwork/jp/ondemand/database/db-new/d3-02-dl-1626597-ja.pdf)


以上