Add Oracle as a Systemd Service

由于开发需要连接 Oracle 数据库,就自己安装了一个 Oracle 12c,但是,每次开机都得
手动 lsnrctl start && dbstart,比较麻烦,我们总是希望开机就自动为我们启动了相关
服务,于是就想着自己写一个 systemd.service 来管理 Oracle。

  1. 编写 systemd.service 服务脚本,在 /etc/systemd/system/oracle.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Unit]
Description=Oracle Service
After=network.target
After=syslog.target

[Service]
User=oracle
Group=dba
Type=oneshot
ExecStart=/home/oracle/bin/oracle.sh start
ExecReload=/home/oracle/bin/oracle.sh restart
ExecStop=/home/oracle/bin/oracle.sh stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
Alias=oracle.service

关于,systemd.service 服务文件的语法格式,参见 man systemd.service 或者 ArchLinux 关于 Systemd 的文档,这个相当详细。

  1. 写一个启动脚本,放在 /home/oracle/bin/oracle.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/${ORACLE_BASE}/product/12.1.0/dbhome_1

function oracle_start(){
${ORACLE_HOME}/bin/lsnrctl start
${ORACLE_HOME}/bin/dbstart

}

function oracle_stop(){
${ORACLE_HOME}/bin/dbshut
${ORACLE_HOME}/bin/lsnrctl stop

}

case "$1" in
start)
oracle_start
echo "Oracle Started Successfully."
;;
stop)
oracle_stop
echo "Oracle Stopped."
;;
restart)
oracle_stop
oracle_start
;;
status)
${ORACLE_HOME}/bin/lsnrctl status
;;
*)
echo "Usage: $(basename $0) {start|strop|restart|status}"
exit 1
esac

exit 0
  1. enable 刚刚写的服务:
1
$ sudo systemdctl enable oracle.service

我在此时启动 Oracle 时,突然出现了一个意想不到的错误:TNS-01190。在网上搜索了一下,原因可能是 listener.ora 文件的权限不对;另一个是其他用户已经
启动了一个监听。ps -ef | grep -i listener 一看,果然是以另外一个用户身份启动了一个监听,在 Xshell 里面开了多个登陆连接,用另一个用户执行了 lsnrctl start
然后试图以 oracle 用户身份执行 lsnrctl stop,当然会出错。真是粗心大意啊。。。

Refference: