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インストールで工数浮いたけど、ここのトラシューで工数飛んだ。。