1. 修改 oracle 的启动脚本配置
[root@orcl ~]# vim /etc/oratab
legion:/u01/app/oracle/product/19.3.0/dbhome_1:N
改为:
legion:/u01/app/oracle/product/19.3.0/dbhome_1:Y
2. 编写oracle启停脚本
将脚本放入/usr/bin/ 中,并赋权 chmod +x 权限
[root@legion ~]# vim /usr/bin/oracle_services
[root@legion ~]# chmod +x /usr/bin/oracle_services
脚本内容为:
#!/bin/bash
# Constants
ORACLE_HOME="/u01/app/oracle/product/19.3.0/dbhome_1"
ORACLE_USER="oracle"
# Functions
check_user() {
if [[ $(whoami) != "$ORACLE_USER" ]]; then
printf "This script can only be run by the oracle user.\n" >&2
return 1
fi
}
start_instance() {
if ! "$ORACLE_HOME/bin/dbstart" "$ORACLE_HOME"; then
printf "Failed to start the database instance.\n" >&2
return 1
fi
printf "Database instance enabled successfully.\n"
}
stop_instance() {
local force=$1
if [[ $force == "--force" ]]; then
if ! "$ORACLE_HOME/bin/sqlplus" / as sysdba <<EOF
shutdown abort;
EOF
then
printf "Failed to force stop the database instance.\n" >&2
return 1
fi
else
if ! "$ORACLE_HOME/bin/dbshut" "$ORACLE_HOME"; then
printf "Failed to stop the database instance.\n" >&2
return 1
fi
fi
printf "Database instance stopped successfully.\n"
}
restart_instance() {
local force=$1
if ! stop_instance "$force"; then return 1; fi
sleep 5
if ! start_instance; then return 1; fi
printf "Database instance restarted successfully.\n"
}
instance_info() {
local status
if ! status=$(ps -ef | grep pmon | grep -v grep); then
printf "Database instance is stopped.\n"
return 1
fi
printf "Database instance is enabled.\n$status\n"
}
start_listener() {
if ! "$ORACLE_HOME/bin/lsnrctl" start; then
printf "Failed to start the listener.\n" >&2
return 1
fi
printf "Listener enabled successfully.\n"
}
stop_listener() {
if ! "$ORACLE_HOME/bin/lsnrctl" stop; then
printf "Failed to stop the listener.\n" >&2
return 1
fi
printf "Listener stopped successfully.\n"
}
restart_listener() {
if ! stop_listener; then return 1; fi
sleep 5
if ! start_listener; then return 1; fi
printf "Listener restarted successfully.\n"
}
listener_info() {
printf "Listener status:\n"
if ! "$ORACLE_HOME/bin/lsnrctl" status; then
printf "Failed to get listener status.\n" >&2
return 1
fi
}
# Main
main() {
if [[ $# -lt 2 ]]; then
printf "Usage: $0 <lsnrctl|instance|all> <start|stop [--force]|restart [--force]|info>\n" >&2
return 1
fi
local service=$1
local action=$2
local option=$3
if ! check_user; then return 1; fi
case "$service" in
lsnrctl)
case "$action" in
start)
start_listener
;;
stop)
stop_listener
;;
restart)
restart_listener
;;
info)
listener_info
;;
*)
printf "Invalid action for lsnrctl: $action\n" >&2
printf "Usage: $0 <lsnrctl|instance|all> <start|stop [--force]|restart [--force]|info>\n" >&2
return 1
;;
esac
;;
instance)
case "$action" in
start)
start_instance
;;
stop)
stop_instance "$option"
;;
restart)
restart_instance "$option"
;;
info)
instance_info
;;
*)
printf "Invalid action for instance: $action\n" >&2
printf "Usage: $0 <lsnrctl|instance|all> <start|stop [--force]|restart [--force]|info>\n" >&2
return 1
;;
esac
;;
all)
case "$action" in
start)
start_listener
start_instance
;;
stop)
stop_instance "$option"
stop_listener
;;
restart)
restart_instance "$option"
restart_listener
;;
info)
listener_info
instance_info
;;
*)
printf "Invalid action for all: $action\n" >&2
printf "Usage: $0 <lsnrctl|instance|all> <start|stop [--force]|restart [--force]|info>\n" >&2
return 1
;;
esac
;;
*)
printf "Invalid service: $service\n" >&2
printf "Usage: $0 <lsnrctl|instance|all> <start|stop [--force]|restart [--force]|info>\n" >&2
return 1
;;
esac
}
main "$@"
3. 设置 oracle19c.servicc
[root@orcl ~]# vi /etc/systemd/system/oracle.service
[root@orcl ~]# systemctl daemon-reload
编辑添加内容为:
[Unit]
Description=Oracle 19c Database Service
After=network.target
[Service]
Type=forking
User=oracle
Group=oinstall
LimitMEMLOCK=infinity
LimitNOFILE=65535
Environment="ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1"
ExecStart=/usr/bin/oracle_services all start
ExecStop=/usr/bin/oracle_services all stop
ExecReload=/usr/bin/oracle_services all restart
RemainAfterExit=true
Restart=on-failure
[Install]
WantedBy=multi-user.target
4. 设置开机自动启动
测试启停,并测试开机自启动
[root@orcl ~]# systemctl start oracle
[root@orcl ~]# systemctl status oracle
[root@orcl ~]# systemctl stop oracle
[root@orcl ~]# systemctl enable oracle