systemdでOracleDBを自動起動する
OracleDBを自動起動させる方法に関して、systemdでの設定方法も含めて確認します。
環境情報
systemdでのサービス化
特定のプロセスをsystemdで自動起動するには、該当のプロセスをsystemdでサービス化(サービス登録)する必要があります。systemdでサービス化を行うには、 unit type
が Service
のユニットファイルを作成し、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
となります。
ユニットファイルに記載する情報
ユニットファイルでは、具体的には以下3つのディレクティブを記載することになります。
[Unit] ユニットのタイプに依存しない汎用的なオプションが含まれます。これらのオプションはユニットの説明を提供し、ユニットの動作を指定し、他のユニットへの依存関係を設定します。
設定可能なオプションは systemd.unit
のmanに記載されています。
[(unit type名)] ユニットにタイプ固有のディレクティブがある場合、それらはユニットタイプに基づいて名前が付けられるセクションにグループ分けされます。
前述の通り、今回設定するユニットタイプはserviceとなります。設定可能なオプションは、 systemd.service
のmanに記載されています。
[Install] systemctl enable コマンドおよび disable コマンドで使用されるユニットインストールに関する情報が含まれます。
設定可能なオプションは、 systemd.unit
のmanに記載されています。
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はこの情報を元に、CUIとGUIでの起動プロセスを管理しているみたいです。
データベース用のユニットファイルを作成
データベース起動用のユニットファイルを、 /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が起動してくれています。