Linux平臺Oracle開機自啟動設置

網上和官方文檔已經有不少介紹如何設置開機啟動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: ORACLES?ID: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= ORACLEB?ASEH?OME/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= ORACLEB?ASEH?OME/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= ORACLEB?ASEH?OME/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= ORACLEB?ASEH?OME/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= ORACLEH?OME/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)– 定義多…