由于开发需要连接 Oracle 数据库,就自己安装了一个 Oracle 12c,但是,每次开机都得
手动 lsnrctl start && dbstart
,比较麻烦,我们总是希望开机就自动为我们启动了相关
服务,于是就想着自己写一个 systemd.service
来管理 Oracle。
- 编写
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 的文档,这个相当详细。
- 写一个启动脚本,放在
/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
|
- enable 刚刚写的服务:
1
| $ sudo systemdctl enable oracle.service
|
我在此时启动 Oracle 时,突然出现了一个意想不到的错误:TNS-01190
。在网上搜索了一下,原因可能是 listener.ora
文件的权限不对;另一个是其他用户已经
启动了一个监听。ps -ef | grep -i listener
一看,果然是以另外一个用户身份启动了一个监听,在 Xshell 里面开了多个登陆连接,用另一个用户执行了 lsnrctl start
,
然后试图以 oracle
用户身份执行 lsnrctl stop
,当然会出错。真是粗心大意啊。。。
Refference: