RHEL7からのサービス管理(systemd)を使ってオラクル自動起動設定をしてみた


RHEL7よりサービスの管理方法が、initからsystemdに変更されました。
私もOracleの自動起動設定を追加してみたので、手順を記載します。

1.設定ファイル作成

環境変数を設定するファイルを作成

事前にenv等で、パスを確認し、自身の環境を設定

# vi /etc/sysconfig/env.oradb

ORACLE_BASE=/opt/app/oracle/
ORACLE_HOME=/opt/app/oracle/product/バージョン/dbhome_1  
ORACLE_SID=XXX

Listener起動用ファイルを作成

書式[ サービス名.service ]

後に自分がサービス状態の確認をする際のサービス名としても使用するので分かりやすく指定したほうが良い。例では、oralsnr.serviceとした

# vi /etc/systemd/system/oralsnr.service

[Unit]
Description = Oracle Listener ←タイトル的なもの
After=network.target      ←このサービスより前に起動しておくサービスを設定
                  Beforeの場合は対象サービスより前にこのサービスを起動
[Service]
Type=forking           ←バックグラウンドに処理を引き渡すタイプの起動判断設定
EnvironmentFile=/etc/sysconfig/env.oradb      ←環境変数ファイルのパス
ExecStart=/opt/app/oracle/product/バージョン/dbhome_1/bin/lsnrctl start  ←サービス起動時のコマンド
ExecStop=/opt/app/oracle/product/バージョン/dbhome_1/bin/lsnrctl stop   ←サービス停止時のコマンド
Restart=always         ←サービス停止時は常に再起動を試みる
User=oracle           ←実行する際のユーザ
Group=oinstall                ←実行する際のグループ

[Install]
WantedBy=multi-user.target  ←サービスをenableにした際に自動起動用のショートカットを作成してくれる

DB起動用ファイルを作成

Listener起動用の設定と同様に設定を行う

# vi /etc/systemd/system/oradb.service

[Unit]
Description=Oracle databaes service
After=network.target oralsnr.service      ←lsnrは先に起動するように設定

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/env.oradb
ExecStart=/opt/app/oracle/product/バージョン/dbhome_1/bin/dbstart /opt/app/oracle/product/バージョン/dbhome_1
ExecStop=/opt/app/oracle/product/バージョン/dbhome_1/dbhome_1/bin/dbshut /opt/app/oracle/product/バージョン/dbhome_1
Restart=always
User=oracle
Group=oinstall

[Install]
WantedBy=multi-user.target

2.設定

サービスファイルを systemd に反映

# systemctl daemon-reload

サービスの自動起動設定

# systemctl enable oralsnr
Created symlink from /etc/systemd/system/multi-user.target.wants/oralsnr.service to /etc/systemd/system/oralsnr.service.
# systemctl enable oradb
Created symlink from /etc/systemd/system/multi-user.target.wants/oradb.service to /etc/systemd/system/oradb.service.

3.起動確認

再起動

shutdown -r now

起動完了後、oracleのステータス確認

# systemctl status oralsnr.service
# systemctl status oracdb.service

「.service」を除いて、「systemctl status oracdb」にしても確認できる。状態がrunningになっていれば起動完了。

ちなみに

・設定ファイルについて
設定ファイルの格納先の「/usr/lib/systemd/system/」と「/etc/systemd/system/」の違いは、「/usr/lib/systemd/system/」がデフォルトのサービス格納先、「/etc/systemd/system/」が自身で設定を変更する際の格納先。
「/usr/lib/systemd/system/」に入っているサービスの設定を書き換えたいと思ったら、「/etc/systemd/system/」にコピーして使用する。

・自動起動順序について
オラクルが完全に立ち上がってから、業務APを起動させたいと思った際は、systemdのみでの設定は難しい。なぜなら、systemdではバックグラウンドプロセスの起動状態まで監視しないからだ。
「Type=forking」は、バックグラウンドに処理を引き渡すタイプの起動タイプだが、フロント側が起動した時点で、起動完了とみなしてしまう。Before、Afterで起動順序を決めていても、オラクルのバックグラウンドプロセスが完全に立ち上がっていなければ、業務APもコケてしまうだろう。
もし、設定をしたいのであれば、スクリプトの修正をするか、強引にはなるが、timer設定で、業務APプロセスを遅らせるなどの方法はある。

参考資料

RHEL 7 における systemd の概要
Systemd入門(4) - serviceタイプUnitの設定ファイル