网上和官方文档已经有不少介绍如何设置开机启动Oracle实例的文章(Linux平台),不过以sysvinit和service这种方式居多。最近遇到了UAT环境的服务器打补丁后需要重启服务器的情况, 需要DBA去手工启动Oracle实例的情形,和同事讨论,决定将UAT环境的Oracle实例启停设置成systemd服务,使其开机自启动,避免在服务器打补丁重启的情况下, 需要DBA去手工启动Oracle实例。这样可以大大减少工作量。 下面是设置Linux平台Oracle开机自启动的总结性文档,仅供参考。

实验环境:

操作系统版本: Red Hat Enterprise Linux release 8.10 (Ootpa)

数据库版本 : Oracle 19c

方案1

  1. 修改oratab文件
    修改/etc/oratab的配置,找到如下这样的配置(不同环境,ORACLE_SID以及Oracle安装路径可能不一致,以实际情况为准)

原始值:

gsp:/opt/oracle19c/product/19.3.0/db_1:N
修改后:

gsp:/opt/oracle19c/product/19.3.0/db_1:Y
在oratab文件中,ORACLE_SID:$ORACLE_HOME:<N|Y>,设置为Y时,表示允许Oracle实例开机自启动,当设置为N时,则不允许开机自启动。 这个文件里的配置仅仅起一个开关的作用, 其实它并不会具体的执行启动和关闭Oracle实例操作. 因为后面的脚本dbstart中会从oratab获取相关值,它类似一个参数配置文件。所以这一步至关重要。

[root@OraPrefTest system]# more /etc/oratab

This file is used by ORACLE utilities. It is created by root.sh

and updated by either Database Configuration Assistant while creating

a database or ASM Configuration Assistant while creating ASM instance.

A colon, ‘:’, is used as the field terminator. A new line terminates

the entry. Lines beginning with a pound sign, ‘#’, are comments.

Entries are of the form:

O R A C L E S I D : ORACLE_SID: ORACLESID:ORACLE_HOME:<N|Y>:

The first and second fields are the system identifier and home

directory of the database respectively. The third field indicates

to the dbstart utility that the database should , “Y”, or should not,

“N”, be brought up at system boot time.

Multiple entries with the same $ORACLE_SID are not allowed.

gsp:/opt/oracle19c/product/19.3.0/db_1:Y
简单方式,可以使用下面命令修改

sed -i ‘s/:N/:Y/’ /etc/oratab
2.修改dbstart
dbstart文件的具体路径为:$ORACLE_HOME/bin/dbstart

上述脚本在启动监听时,只启动了默认监听服务(LISTENER),不会启动命名的监听服务,如果你配置的是命名监听的话, 那么需要修改脚本,如下所示,如果你使用的是默认的监听服务的话,那么直接跳过这一步。

–修改前

Determine location of listener.log

mkdir -p – O R A C L E B A S E H O M E / n e t w o r k / l o g L O G = ORACLE_BASE_HOME/network/log LOG= ORACLEBASEHOME/network/logLOG=ORACLE_BASE_HOME/network/log/listener.log

Start Oracle Net Listener

if [ -x $ORACLE_HOME/bin/tnslsnr ] ; then
echo “$0: Starting Oracle Net Listener” >> $LOG 2>&1
$ORACLE_HOME/bin/lsnrctl start >> KaTeX parse error: Expected 'EOF', got '&' at position 7: LOG 2>&̲1 & VER10LI…ORACLE_HOME/bin/lsnrctl version | grep "LSNRCTL for " | cut -d’ ’ -f5 | cut -d’.’ -f1`
export VER10LIST
else
echo “Failed to auto-start Oracle Net Listener using $ORACLE_HOME/bin/tnslsnr”
fi
–修改后

此处监听名为gsp,那么我们调整为"$ORACLE_HOME/bin/lsnrctl start gsp"

Determine location of listener.log

mkdir -p – O R A C L E B A S E H O M E / n e t w o r k / l o g L O G = ORACLE_BASE_HOME/network/log LOG= ORACLEBASEHOME/network/logLOG=ORACLE_BASE_HOME/network/log/listener.log

Start Oracle Net Listener

if [ -x $ORACLE_HOME/bin/tnslsnr ] ; then
echo “$0: Starting Oracle Net Listener” >> $LOG 2>&1
$ORACLE_HOME/bin/lsnrctl start gsp >> KaTeX parse error: Expected 'EOF', got '&' at position 7: LOG 2>&̲1 & VER10LI…ORACLE_HOME/bin/lsnrctl version | grep “LSNRCTL for " | cut -d’ ’ -f5 | cut -d’.’ -f1`
export VER10LIST
else
echo “Failed to auto-start Oracle Net Listener using $ORACLE_HOME/bin/tnslsnr”
fi
另外,这里不需要修改其它配置,网上有些文章修改"ORACLE_HOME_LISTNER=$1”,其实这个看你的方案与思路,至少这里无需修改其它任何代码。 因为调用dbstart脚本的时候,会传入参数。

3.设置dbshut
dbshut文件的具体路径为:$ORACLE_HOME/bin/dbshut

这里跟步骤2一致,如果是默认的监听服务,那么也请跳过这一步。

修改前:

Determine location of listener.log

mkdir -p – O R A C L E B A S E H O M E / n e t w o r k / l o g L O G = ORACLE_BASE_HOME/network/log LOG= ORACLEBASEHOME/network/logLOG=ORACLE_BASE_HOME/network/log/listener.log

Stop Oracle Net Listener

if [ -x $ORACLE_HOME/bin/tnslsnr ] ; then
echo “$0: Stopping Oracle Net Listener” >> $LOG 2>&1
$ORACLE_HOME/bin/lsnrctl stop >> $LOG 2>&1 &
else
echo “Failed to auto-stop Oracle Net Listener using $ORACLE_HOME/bin/tnslsnr”
fi
修改后:

Determine location of listener.log

mkdir -p – O R A C L E B A S E H O M E / n e t w o r k / l o g L O G = ORACLE_BASE_HOME/network/log LOG= ORACLEBASEHOME/network/logLOG=ORACLE_BASE_HOME/network/log/listener.log

Stop Oracle Net Listener

if [ -x $ORACLE_HOME/bin/tnslsnr ] ; then
echo “$0: Stopping Oracle Net Listener” >> $LOG 2>&1
$ORACLE_HOME/bin/lsnrctl stop gsp >> $LOG 2>&1 &
else
echo “Failed to auto-stop Oracle Net Listener using $ORACLE_HOME/bin/tnslsnr”
fi
4. 配置systemd服务
在/etc/systemd/system/下创建一个新的systemd服务文件,命名为oracle.service

方式1:

more oracle.service

[Unit]
Description=Oracle Database Service
After=network.target

[Service]
Type=forking
User=oracle
Group=oinstall
ExecStart=/opt/oracle19c/product/19.3.0/db_1/bin/dbstart /opt/oracle19c/product/19.3.0/db_1
ExecStop=/opt/oracle19c/product/19.3.0/db_1/bin/dbshut /opt/oracle19c/product/19.3.0/db_1
TimeoutStopSec=5min
Restart=on-failure

[Install]
WantedBy=multi-user.target
注意:/opt/oracle19c/product/19.3.0/db_1为$ORACLE_HOME,根据实际情况进行调整。

配置完成,执行下面命名后,就可以使用systemctl启动或停止Oracle实例了。

systemctl daemon-reload

systemctl enable oracle.service

在测试oracle服务的启停前,先确保oracle实例和监听服务已经关闭,如果手工启动的oracle实例,使用下面命令关闭时会异常。详情请见下文"问题1"。

systemctl start oracle.service

systemctl status oracle.service

systemctl stop oracle.service

此时,你通过命令"systemctl status oracle.service",可以知道查看oracle实例是否正常,你也可以通过$ORACLE_HOME/rdbms/log/startup.log日志查看 其实这个日志是在dbshut中生成的。当前测试环境为/opt/oracle19c/product/19.3.0/db_1/rdbms/log/startup.log

方案2
如下所示,我们可以在systemd中引入环境变量,如下所示

more oracle.service

[Unit]
Description=Oracle Database Service
After=network.target

[Service]
Type=forking
User=oracle
Group=oinstall
Environment=“ORACLE_HOME=/opt/oracle19c/product/19.3.0/db_1”
ExecStart=/opt/oracle19c/product/19.3.0/db_1/bin/dbstart $ORACLE_HOME
ExecStop=/opt/oracle19c/product/19.3.0/db_1/bin/dbshut $ORACLE_HOME
TimeoutStopSec=5min
Restart=no
RemainAfterExit=yes
KillMode=none

[Install]
WantedBy=multi-user.target
我们也可以使用EnvironmentFile来指定环境变量,如下所示,创建文件/home/oracle/dba_scripts/oracle.env,在文件中指定环境变量

ORACLE_HOME=/opt/oracle19c/product/19.3.0/db_1

more oracle.service

[Unit]
Description=Oracle Database Service
After=network.target

[Service]
Type=forking
User=oracle
Group=oinstall
EnvironmentFile=/home/oracle/dba_scripts/oracle.env
ExecStart=/opt/oracle19c/product/19.3.0/db_1/bin/dbstart $ORACLE_HOME
ExecStop=/opt/oracle19c/product/19.3.0/db_1/bin/dbshut $ORACLE_HOME
TimeoutStopSec=5min
Restart=no
RemainAfterExit=yes
KillMode=none

[Install]
WantedBy=multi-user.target
做完上述操作后,执行下面命令重新加载systemd系统和服务管理器配置

systemctl daemon-reload

方案3
上面的方案有一个问题,就是如果监听服务是命名监听,那么必须修改dbstart或dbshut脚本,如果是一台或两台数据库实例,这样修改倒也没有什么问题。 如果服务器多了的话,那么每一台都要修改,那么我们应该考虑不修改这些脚本,通过另外的形式来事项。这个就是方案3的出现的理由。

我们新建一个脚本oracle_start_stop.sh

#!/bin/bash
###################################################################################################

Script used to start or stop oracle instance

#*************************************************************************************************#

Version Autor Modified Date Description

#*************************************************************************************************#

1.0 Kerry Kong 2019-09-10 create the shell script.

###################################################################################################
SUCCESS=0
FAILURE=1

Check the number of parameter.

if [ $# -lt 2 ]; then
echo “please check the scirpt’s parameter”
exit $FAILURE
fi

STATUS=$1
LISTENER_NAME=$2

if [ $STATUS == ‘start’ ];then
$ORACLE_HOME/bin/lsnrctl start $LISTENER_NAME
$ORACLE_HOME/bin/dbstart $ORACLE_HOME
exit $SUCCESS
elif [ $STATUS == ‘stop’ ]; then
$ORACLE_HOME/bin/lsnrctl stop $LISTENER_NAME
$ORACLE_HOME/bin/dbshut $ORACLE_HOME
exit $SUCCESS
else
echo “the parameter is not correct”
fi
新建一个oracle.service的systemd服务文件,如下所示,ExecStart和ExecStop中去调用执行oracle_start_stop.sh文件

vi oracle.service

[Unit]
Description=Oracle Database Service
After=network.target

[Service]
Type=forking
User=oracle
Group=oinstall
ExecStart=/home/oracle/dba_scripts/oracle_start_stop.sh start gsp
ExecStop=/home/oracle/dba_scripts/oracle_start_stop.sh stop gsp
TimeoutStopSec=5min
Restart=on-failure

[Install]
WantedBy=multi-user.target
配置完成,执行下面命名后,就可以使用systemctl启动或停止Oracle实例了。

systemctl daemon-reload

systemctl enable oracle.service

问题汇总
问题1: 手工启动oracle实例,使用systemctl stop oracle关闭不了。这是为什么呢?
systemctl是systemd系统和服务管理器的命令行工具,主要用于控制systemd管理的服务。对于那些不是通过 systemd 启动的服务或进程, systemctl 默认情况下是无法直接控制的。例如,如果Oracle实例是通过sqlplus手工启动的话,脚本中不做一些特殊控制或修改,默认情况下, systemctl将无法控制它(关闭它)。

问题2 在oracle.service中使用变量问题
[Unit]
Description=Oracle Database Service
After=network.target

[Service]
Type=forking
User=oracle
Group=dba
ExecStart= O R A C L E H O M E / b i n / d b s t a r t E x e c S t o p = ORACLE_HOME/bin/dbstart ExecStop= ORACLEHOME/bin/dbstartExecStop=ORACLE_HOME/bin/dbshut
Restart=on-failure

[Install]
WantedBy=multi-user.target
这种情况下,无法获取系统变量$ORACLE_HOME的值。会报如下错误,如下所示:

systemctl start oracle.service

Failed to start oracle.service: Unit oracle.service has a bad unit file setting.
See system logs and ‘systemctl status oracle.service’ for details.

systemctl status oracle.service

● oracle.service - Oracle Database Service
Loaded: bad-setting (Reason: Unit oracle.service has a bad unit file setting.)
Active: inactive (dead)

Oct 21 08:28:30 OraPrefTest systemd[1]: /etc/systemd/system/oracle.service:9: Neither a valid executable name nor an absolute path:$ORACLE_HOME/bin/dbstart
lines 1-5/5 (END)
分析如下:

systemd-analyze verify oracle.service

/etc/systemd/system/./oracle.service:10: Neither a valid executable name nor an absolute path: $ORACLE_HOME/bin/dbstart
其实出现这个问题,是因为在systemd中脚本必须使用绝对路径。这个归因于systemd的工作方式和路径解析机制,出于安全(避免路径遍历攻击、防止命令注入等) 等方面的原因。

但是可以在脚本后面使用环境变量,如下所示

ExecStart=/opt/oracle19c/product/19.3.0/db_1/bin/dbstart $ORACLE_HOME
ExecStop=/opt/oracle19c/product/19.3.0/db_1/bin/dbshut $ORACLE_HOME
问题3
关于有些版本的一些bug问题,systemd服务里面可能需要设置一些系统变量,如下所示。具体参考官方文档Automatic Stop of Database (dbshut) not working in OL 7 with systemd (Doc ID 2229679.1)。

[Unit]
Description=Oracle Database Start/Stop Service
After=syslog.target network.target local-fs.target remote-fs.target
[Service]

systemd, by design does not honor PAM limits

See: https://bugzilla.redhat.com/show_bug.cgi?id=754285

LimitNOFILE=65536
LimitNPROC=16384
LimitSTACK=32M
LimitMEMLOCK=infinity
LimitCORE=infinity
LimitDATA=infinity

Type=simple
User=oracle
Group=oinstall
Restart=no
ExecStartPre=/bin/rm -rf /u01/app/oracle/product/12.2.0/dbhome_1/listener.log
ExecStartPre=/bin/rm -rf /u01/app/oracle/product/12.2.0/dbhome_1/startup.log
ExecStart=/bin/bash /u01/app/oracle/product/12.2.0/dbhome_1/bin/dbstart /u01/app/oracle/product/12.2.0/dbhome_1
RemainAfterExit=yes
ExecStop=/bin/rm -rf /u01/app/oracle/product/12.2.0/dbhome_1/shutdown.log
ExecStop=/bin/bash /u01/app/oracle/product/12.2.0/dbhome_1/bin/dbshut /u01/app/oracle/product/12.2.0/dbhome_1
TimeoutStopSec=5min

[Install]
WantedBy=multi-user.target

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88584.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88584.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88584.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

商品中心—商品B端搜索系统的实现文档(二)

8.步骤四&#xff1a;基于索引实现搜索功能 (1)基于suggest索引的自动补全实现 实现自动补全的代码比较简单&#xff0c;其原理是&#xff1a;把搜索词汇和倒排索引里的所有前缀匹配的词条进行score比较&#xff0c;然后把分数最高的那些返回&#xff0c;其中会涉及到suggest索…

Codeforces Round 1027 (Div. 3)

A. Square Year 题目大意 给你一个四个字符的字符串&#xff0c;代表一个数字s 问是否存在a,b两个数字&#xff0c;使得 ( a b ) 2 s (ab)^2s (ab)2s 思路 如果s是奇数或不能被开根号一定不行 设sq为s开根号后的结果 将sq一分为2&#xff0c;考虑sq/2有没有余数的情况 //…

时序数据库IoTDB的架构、安装启动方法与数据模式总结

一、IoTDB的架构 IoTDB的架构主要分为三个部分&#xff1a; ‌时序文件&#xff08;Tsfile&#xff09;‌&#xff1a; 专为时序数据设计的文件存储格式。支持高效的压缩和查询性能。可独立使用&#xff0c;并可通过TsFileSync工具同步至HDFS进行大数据处理。 ‌数据库引擎‌…

ArrayList和LinkedList详解

在Java后端开发中&#xff0c;集合框架是我们日常编程不可或缺的工具&#xff0c;它为数据存储和操作提供了丰富的实现方式。作为Java集合框架中最常用的两种List实现&#xff0c;ArrayList和LinkedList各自具有独特的特性和适用场景。 1. 基本概念 1.1 ArrayList的定义与特性…

警惕微软Entra ID风险:访客账户存在隐蔽的权限提升策略

访客用户订阅权限漏洞解析 微软Entra ID的订阅管理存在访问控制缺陷&#xff0c;允许访客用户在受邀租户中创建和转移订阅&#xff0c;同时保留对这些订阅的完全所有权。访客用户只需具备在源租户创建订阅的权限&#xff0c;以及受邀成为外部租户访客的身份即可实施此操作。这…

EEG分类攻略2-Welch 周期图

在EEG信号处理的上下文中&#xff0c;使用Welch方法来估算信号的功率谱密度&#xff08;Power Spectral Density, PSD&#xff09;是一种常见的做法。你的代码片段是利用**scipy.signal.welch**函数来进行功率谱密度估算&#xff0c;并且涉及到一些关键的参数和步骤。让我们逐步…

开疆智能CCLinkIE转ModbusTCP网关连接脉冲计数器配置案例

本案例是三菱PLC通过CCLinkIE转ModbusTCP网关连接脉冲计数器的配置案例&#xff0c;具体配置如下。 配置过程&#xff1a; 首先设置从站通讯参数 主要设置IP地址&#xff0c;工作模式以及端口号&#xff08;Modbus默认502&#xff09; 找到通讯点表&#xff0c;找到需要读写的…

gRPC 使用(python 版本)

.proto 文件 .proto 文件 是 gRPC 和 Protocol Buffers 的接口定义文件&#xff0c;它描述了&#xff1a; 要传递什么数据&#xff08;也就是消息体 message&#xff09;。要暴露什么接口&#xff08;也就是服务 service 和它们的 方法&#xff09;。 也就是一份规范文件&am…

VMware安装

勾选【增强型键盘驱动程序】 #后期虚拟机用鼠标键盘比较好用 VMware创建主机Windows2 选择类型配置【自定义】 安装客户机操作系统【稍后安装操作系统】 客户机操作系统【Microsoft Windows】,版本选Windows最高版本 【固件类型】默认UEFI 【处理器配置】选1个处理…

【沉浸式解决问题】微服务子模块引入公共模块的依赖后无法bean未注入

目录 一、问题描述二、场景还原三、原因分析四、解决方案五、拓展知识参考文献 一、问题描述 在微服务项目中的公共模块进行了Mybatis Plus配置&#xff0c;创建了配置类并添加了Configuration注解&#xff0c;其他模块引入该模块后不生效 我这里是在Mybatis Plus公共模块中注…

SQL进阶:CASE表达式

目录 1、用一条SQL语句进行不同条件的统计 建表语句&#xff08;MySQL8&#xff09;&#xff1a; 录入数据&#xff1a; *按性别统计SQL 输出结果&#xff08;行列转换&#xff09; 2、在UPDATE语句里进行条件分支 建表语句&#xff08;MySQL8&#xff09;&#xff1a;…

哪四款AI工具让3D人物手办制作如此简单?

在当今数字化时代&#xff0c;AI技术的飞速发展为我们的生活带来了诸多便利和惊喜。其中&#xff0c;AI生成3D人物手办工具的出现&#xff0c;让我们能够轻松地将自己的创意和想象转化为实体手办&#xff0c;满足了众多手办爱好者的个性化需求。今天&#xff0c;我将为大家推荐…

Docker高级管理--Dockerfile镜像制作

目录 一:Docker 镜像管理 1:Docker 镜像结构 2:Dockerfile介绍 二:Dockerfile 语法基础 1:基础指令 2:环境设置指令 3:文件操作指令 4:执行命令指令 5:网络和暴露端口指令 6.容器挂载指令 三&#xff1a;dockerfile案例 1.构建nginx容器 一:Docker 镜像管理 Docker…

数字时代的“灵魂”之争:虚拟人形象的著作权困局与破局之道

首席数据官高鹏律师数字经济团队创作&#xff0c;AI辅助。 一、虚拟人的“数字生命”&#xff1a;一场关于“灵魂”的商业博弈 当一个虚拟偶像的“眼神”被复刻成千万个相似的数字面孔&#xff0c;当一段虚拟主播的“声音”被拆解为可交易的数据碎片——我们正在见证一个“数…

小型CI/CD搭建(TODO)

1 方案 因为是在国内&#xff0c;所以gitbub Actions&#xff0c;​​Azure DevOps​这些就直接拜拜了。 目前主流的大概是三种&#xff1a; 1 阿里云效/腾讯云CODING 2 GitLab CE GitLab Runner 3 Gitee Jenkins deepeseek比较了一下如下&#xff1a; 阿里云效 vs Git…

Android Studio flutter项目运行、打包时间太长

Android Studio&#xff1a;Android Studio Meerkat Feature Drop | 2024.3.2 Patch 1 flutter Sdk&#xff1a;3.29.3 系统&#xff1a;windows flutter sdk从2.10.5升级到3.29.3&#xff0c;但是Flutter 3.16开始新增了使用 Gradle声明式 plugins {} 块&#xff0c;gradle文…

【OpenGL学习】(六)图形添加纹理

文章目录 【OpenGL学习】&#xff08;六&#xff09;图形添加纹理纹理环绕纹理过滤纹理颜色与顶点颜色混合 OpenGL纹理介绍&#xff1a;https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/ 【OpenGL学习】&#xff08;六&#xff09;图形添加纹理 项目…

allure安装

一、安装java 需要安装java环境&#xff0c;不安装的话在运行前会报错下列问题&#xff08;前提是安装了allure未安装java&#xff09; 1.官网地址&#xff1a;https://www.oracle.com/ 2.点击”Download Java“ 3.选择JDK正式版本&#xff08;需要jdk1.8&#xff09; 4.选择W…

SpringBoot基于JavaWeb的城乡居民基本医疗信息管理系统

概述 一个基于SpringBoot框架开发的JavaWeb医疗信息管理系统&#xff0c;采用了现代化的技术架构&#xff0c;功能全面&#xff0c;非常适合作为学习项目或二次开发的基础。 主要内容 该系统主要包含以下核心功能模块&#xff1a; ​​用户管理模块​​ 实现管理员、医生、…

SQL变量声明与赋值 分支 循环

– 变量 分支 循环 – declare 变量名 数据类型 – declare 关键字&#xff0c;作用声明变量 – 变量名&#xff1a;以开头 – 数据类型&#xff1a;数据库中支持的数据类型&#xff1a;int varchar(n) text char(n) nvarchar(n) nchar(n) declare name varchar(255)– 定义多…