LoginSignup
0
0

シングルインスタンスにおけるサービスの自動起動

Last updated at Posted at 2023-10-19

前回の続き

前回はPDBに独自のサービスをいくつか付与するところで終わってましたが、
実はDBMS_SERVICE.CREATE_SERVICEで付与したサービスはPDBの起動とは連動していません。

実際の運用を考えると、サービスを自動起動させたい場合もあると思うので、
今回はその方法について触れていきたいと思います。

本題

他の方法があるかもしれませんが、今回はトリガーを使った方法を扱いたいと思います。
トリガーを作る際には、対象となるPDBに切り替えたうえで、SYSユーザで実行ください。

alter session set container = pdb;

トリガーの名前は任意でよいです。

trigger
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を確認すれば、自動起動していることが確認できます。

v$active_services
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を起動すると自動的にサービスまで起動してくれるようになります。

実際には、運用ポリシーによって自動起動させない場合もあるかと思いますが、こういう選択肢があるということも覚えておくと幅が広がってよいかなと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0