Oracle19cをRPMでインストール後にPDBに接続するために必要な設定

Oracle18cくらいからRPMベースのインストール方法が提供されて、すごい入れやすくなった。手順的には、OSインストール後とかEC2起動後のまっさらの状態から、プリインストールRPM(OSの設定が自動的に入ってインストール要件パッケージが自動インストールされる)をインストールして、RPMでOracleをインストールしたら、標準出力に出力されるメッセージに従ってconfigureコマンドを実行すれば、CDBと基本的なPDBが作成された状態でできあがる。OS設定もDB作成も面倒なので、この方法素晴らしいと思う(エディションとか選べないので検証用途で)。で、この方法で作成したPDBに接続しようとしたら、全然接続できないorz
CDBに接続してPDB起動して、PDBにalter pluggable sessionでセッション切り替えてつなぐことはできるんだけど、ターミナルからリスナー経由で直接接続したりとか、TNSNAMES接続が全然つながらない。つながらないときのエラーはこれ。

```
[oracle@host ~]$ sqlplus system/password@orclpdb1

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Mar 29 10:21:02 2021
Version 19.3.0.0.0

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

ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory
Additional information: 4376
Additional information: 1626951335
Process ID: 0
Session ID: 0 Serial number: 0
```

つないだときに、ORA-01034とORA-27101のエラーでつながらないときは、listener.ora/tnsnames.oraが間違ってる(sid指定ミスとか、ORACLE_HOME指定ミス)ケースがある。けど、PDBはそもそも最初からリスナーに動的にサービス登録される仕様で、特に何も設定しなくていいはず。lsnrctl startしたあと、CDBにつないで```alter system register;```とか打ってもリスナーには何も登録されない。lsnrctl statusしたときの出力はこれ。

```
[oracle@host ~]$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 29-MAR-2021 09:55:35

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                29-MAR-2021 09:55:03
Uptime                    0 days 0 hr. 0 min. 32 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/host/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=host)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully
```

```The listener supports no services```のとおり、サービス登録がない。
Oracleのリファレンス見てもconfigureしたあとのことは書いてないし、ネット上で手順を乗せてるサイトも、configureしてCDB/PDBができたらsqlplus / as sysdbaでつながるよってところで終わってて、PDBに接続する部分の記載が一切見当たらない。
ためしにlistener.oraに```SID_LIST_LISTENER=```書いて静的登録してみてもつながらない。

え～サービス登録本当に手動でするのー??(インストール簡略化のためのRPMなのに??)と思いながら、血迷ってサービス確認したりサービス登録してたりサービス起動してみたり。。(```v$service```
 ```exec dbms_service.create_service('orclpdb1','orclpdb1');``` ```exec dbms_service.start_service('orclpdb1');```)
でも、サービスは元々作成されて起動されてるからそこじゃない感。

他に、サービス登録に関係あるものを調べてたら、LOCAL_LISTENERパラメータも関係してることを見つける。試しにshow parameterしてみると

```
NAME                                 TYPE        VALUE
local_listener                       string      LISTENER_ORCLCDB
```

ふーん、valueがLISTENER_ORCLCDB。うーん、これってなんかもっと長ったらしかったような。。？
設定例みると

```
(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=1521))
```

たしかにこんな感じだった。全然違うやん
試しに設定してみる。一旦scope=memoryで

```
SQL> alter system set LOCAL_LISTENER="(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=1521))" scope=memory;
```

でsqlplus抜けてlsnrctl statusしてみると

```
[oracle@host ~]$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 29-MAR-2021 10:23:07

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                29-MAR-2021 10:20:25
Uptime                    0 days 0 hr. 2 min. 41 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/host/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=host)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "ORCLCDBXDB" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "bdb6f093eb0f29c3e053d20b020af2f8" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "bde012dcb45c5fafe0531606020ae253" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "orclcdb" has 2 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
  Instance "orclcdb", status UNKNOWN, has 1 handler(s) for this service...
Service "orclpdb1" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
```

一瞬で復旧したやんけ。。
RPMインストールで工数浮いたけど、ここのトラシューで工数飛んだ。。