前回はPDBに独自のサービスをいくつか付与するところで終わってましたが、
実はDBMS_SERVICE.CREATE_SERVICE
で付与したサービスはPDBの起動とは連動していません。
実際の運用を考えると、サービスを自動起動させたい場合もあると思うので、
今回はその方法について触れていきたいと思います。
本題
他の方法があるかもしれませんが、今回はトリガーを使った方法を扱いたいと思います。
トリガーを作る際には、対象となるPDBに切り替えたうえで、SYSユーザで実行ください。
alter session set container = pdb;
トリガーの名前は任意でよいです。
CREATE OR REPLACE TRIGGER pdb_service_trigger
ALTER STARTUP ON DATABASE
BEGIN
DBMS_SERVICE.START_SERVICE('new_service');
END pdb_service_trigger;
/
上記のトリガーによって、PDBがOPENした際にDBMS_SERVICE.START_SERVICE
が呼び出されます。
サービスが複数ある場合は、DBMS_SERVICE.START_SERVICE
を複数記述すればよいです。
トリガーを設定した後は、PDBをCLOSE⇒OPENしてv$active_serice
を確認すれば、自動起動していることが確認できます。
alter session set container = PDB;
shutdown immediate;
startup;
select name from v$active_services;
NAME
---------------------
PDB
new_service
OS起動停止に合わせてDBも自動起動させたい場合
シングルインスタンスの場合、OCWによる自動起動が働かないのでどうしても自前で自動起動の準備が必要です。インスタンスは$ORACLE_HOME/bin
にdbstartとdbshutが用意されていますので、これを用いて systemd にサービスを登録することで、OSの起動停止に連動してインスタンスを自動起動/停止させることができます。(リスナーも)
PDBに関してはalter pluggable database [all|<PDB_NAME>] save state
することで、インスタンス起動時に保存した状態を維持してくれます(=READ WRITE (OPEN) でSAVEしておけば、自動的にOPENされます)
で、今回のサービス起動トリガーを仕込んでおけば、OSを起動すると自動的にサービスまで起動してくれるようになります。
実際には、運用ポリシーによって自動起動させない場合もあるかと思いますが、こういう選択肢があるということも覚えておくと幅が広がってよいかなと思います。