systemdでOracleDBを自動起動する

OracleDBを自動起動させる方法に関して、systemdでの設定方法も含めて確認します。

SYSTEMD のユニットファイルの作成および変更

環境情報

systemdでのサービス化

特定のプロセスをsystemdで自動起動するには、該当のプロセスをsystemdでサービス化(サービス登録)する必要があります。systemdでサービス化を行うには、 unit typeService のユニットファイルを作成し、systemdに登録する必要があります。ユニットファイルとは、

ユニットファイルには、ユニットを説明し、その動作を定義する設定ディレクティブが含まれます。複数のsystemctlコマンドがバックグラウンドでユニットファイルと連携します。細かい調整を行うには、システム管理者は手動でユニットファイルを編集するか、または作成する必要があります。

ユニットファイルのPath

ユニットファイルを配置するPathは以下3種類あります。

  • /usr/lib/systemd/system/
    • インストール済みのRPMパッケージで配布されたsystemdユニットファイル
  • /run/systemd/system/
    • ランタイム時に作成されたsystemdユニットファイル
    • /usr/lib/systemd/system/ディレクトリーに優先
  • /etc/systemd/system/
    • systemctl enableで作成されたsystemdユニットファイル、およびサービス拡張向けに追加されたユニットファイル
    • /run/systemd/system/ディレクトリーに優先

自作ユニットファイルを置くPathは /etc/systemd/system/ となります。

ユニットファイルのファイル名

ユニットファイルのファイル名は、下記フォーマットとなっています。

unit_name.type_extension

unit_name はそのサービスを特定する名前を設定し、 type_extension には利用するユニットタイプを設定します。今回はサービス化を行うので、Type_extensionは .service となります。

利用可能な systemd Unit タイプ

ユニットファイルに記載する情報

ユニットファイルでは、具体的には以下3つのディレクティブを記載することになります。

[Unit] ユニットのタイプに依存しない汎用的なオプションが含まれます。これらのオプションはユニットの説明を提供し、ユニットの動作を指定し、他のユニットへの依存関係を設定します。

設定可能なオプションは systemd.unitmanに記載されています。

[(unit type名)] ユニットにタイプ固有のディレクティブがある場合、それらはユニットタイプに基づいて名前が付けられるセクションにグループ分けされます。

前述の通り、今回設定するユニットタイプはserviceとなります。設定可能なオプションは、 systemd.servicemanに記載されています。

[Install] systemctl enable コマンドおよび disable コマンドで使用されるユニットインストールに関する情報が含まれます。

設定可能なオプションは、 systemd.unitmanに記載されています。

systemd向け環境変数の設定

実際にユニットファイルを作成する前に、systemdでの処理で利用することになるOracle環境変数ファイルを用意しておきます。Systemdでの起動処理では、ユーザプロファイルに定義した環境変数ファイルを利用しないらしいです。

/etc/sysconfig/oracledb というファイルに、起動したいOracleDB用の設定を記載しておきます。

ORACLE_BASE=/u01/app/oracle/
ORACLE_HOME=/u01/app/oracle/product/12.2.0/db_1
ORACLE_SID=orcl

変数展開ができないらしく、ORACLE_HOMEの値を、ちゃんとフルパスで書いてあげます。

ファイル・パーミッションの変更。

$ sudo chown root:root /etc/sysconfig/oracledb
$ sudo chmod 644 /etc/sysconfig/oracledb

Listener用のユニットファイルを作成

Listener起動用のユニットファイルを、/etc/systemd/system/oralistener.service に作成します。

[Unit]
Description = Oracle DB Listener
After=network.target

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/oracledb
ExecStart=/u01/app/oracle/product/12.2.0/db_1/bin/lsnrctl start
ExecStop=/u01/app/oracle/product/12.2.0/db_1/bin/lsnrctl stop
Restart=always
User=oracle
Group=oinstall

[Install]
WantedBy=multi-user.target

ファイル・パーミッションの変更。

$ sudo chown root:root /etc/systemd/system/oralistener.service
$ sudo chmod 644 /etc/systemd/system/oralistener.service

大凡のオプションは、そのオプション名から設定内容を予想できるので、 WantedBy=multi-user.target だけ補足。

WantedByのオプションとは、manでは下記の説明がされています。

A symbolic link is created in the wants/ or .requires/ directory of each of the listed units when this unit is installed by systemctl enable.

system enable 時に、指定したユニットの wants または .requires ディレクトリ配下にシンボリックリンクを作るよ、というもの。今回設定しているユニットは multi-user.target となりますが、これは以前のinit処理におけるrunlevel3に該当する概念となっています。 graphical.target がrunlevel5。実際 system enable コマンド実行後に、 ディレクト/etc/systemd/system/multi-user.target.wants を見ると、以下のようにシンボリックリンクが作成されています。

$ sudo ls -l /etc/systemd/system/multi-user.target.wants | grep ora
lrwxrwxrwx  1 root root 33 Nov 18 13:02 oradb.service -> /etc/systemd/system/oradb.service
lrwxrwxrwx  1 root root 39 Nov 18 12:56 oralistener.service -> /etc/systemd/system/oralistener.service

systemdはこの情報を元に、CUIGUIでの起動プロセスを管理しているみたいです。

データベース用のユニットファイルを作成

データベース起動用のユニットファイルを、 /etc/systemd/system/oradb.service に作成します。

[Unit]
Description=Oracle DB Instance service
After=network.target oralistener.service

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/oracledb
ExecStart=/u01/app/oracle/product/12.2.0/db_1/bin/dbstart /u01/app/oracle/product/12.2.0/db_1
ExecStop=/u01/app/oracle/product/12.2.0/db_1/bin/dbshut /u01/app/oracle/product/12.2.0/db_1
Restart=always
User=oracle
Group=oinstall

[Install]
WantedBy=multi-user.target
$ sudo chown root:root /etc/systemd/system/oradb.service
$ sudo chmod 644 /etc/systemd/system/oradb.service

oratabを編集

自動起動したいインスタンスを、 /etc/oratab で指定します。

orcl:/u01/app/oracle/product/12.2.0/db_1:Y

末尾を Y にすることで、そのインスタンス自動起動対象になります。

設定

設定の反映。

$ sudo systemctl daemon-reload

自動起動の登録。

$ sudo systemctl enable oralistener.service
$ sudo systemctl enable oradb.service

OSを再起動すると、DBが起動してくれています。