Oracle 19c 单机自启动

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值