Oracle Restart環境下的開機啟動指令碼

lhrbest發表於2020-06-28



Linux 7環境,假設已安裝GI,已基於ASM建立資料庫。我們來看一下資料庫是如何自動啟動的。


Linux 7使用systemd管理服務,systemd 是系統啟動後的第一個程式:


$ ps --pid 1

  PID TTY          TIME CMD

    1 ?        00:00:01 systemd


Oracle Restart的概念是作業系統包含OHAS,OHAS包含其他資源,如ASM,資料庫等。

在服務中我們找到了ohas(–type表示只列出服務,–all表示不論狀態):


$ systemctl list-units --type service --all|grep ohas

  UNIT                                                  LOAD      ACTIVE   SUB     DESCRIPTION

  ohasd.service                                         loaded    active   exited  LSB: Start and Stop Oracle High Availability Service

  oracle-ohasd.service                                  loaded    active   running Oracle High Availability Services


啟動指令碼中連結到了ohas指令碼:


$ ll /etc/rc3.d/S96ohasd

lrwxrwxrwx. 1 root root 17 Sep  9 01:37 /etc/rc3.d/S96ohasd -> /etc/init.d/ohasd



這兩個服務狀態都是active的,但子狀態有一個是exited:


$ systemctl is-active oracle-ohasd.service

active

$ systemctl is-active ohasd.service

active



看一下此兩服務的狀態:


$ systemctl status ohasd.service

● ohasd.service - LSB: Start and Stop Oracle High Availability Service

   Loaded: loaded (/etc/rc.d/init.d/ohasd; bad; vendor preset: disabled)

   Active: active (exited) since Tue 2019-09-10 00:41:44 UTC; 58min ago

     Docs: man:systemd-sysv-generator(8)

  Process: 1265 ExecStart=/etc/rc.d/init.d/ohasd start (code=exited, status=0/SUCCESS)

 

$ systemctl status oracle-ohasd.service

● oracle-ohasd.service - Oracle High Availability Services

   Loaded: loaded (/etc/systemd/system/oracle-ohasd.service; enabled; vendor preset: disabled)

   Active: active (running) since Tue 2019-09-10 00:41:43 UTC; 58min ago

 Main PID: 1262 (init.ohasd)

   CGroup: /system.slice/oracle-ohasd.service

           ├─1262 /bin/sh /etc/init.d/init.ohasd run >/dev/null 2>&1 </dev/null

           ├─1334 /u01/app/19.0.0/grid/bin/ohasd.bin reboot

           ├─2540 /u01/app/19.0.0/grid/bin/oraagent.bin

           ├─2646 /u01/app/19.0.0/grid/bin/tnslsnr LISTENER -no_crs_notify -inherit

           ├─2666 /u01/app/19.0.0/grid/bin/evmd.bin

           ├─3022 /u01/app/19.0.0/grid/bin/evmlogger.bin -o /u01/app/19.0.0/grid/log/[HOSTNAME]/evmd/evmlogger.info -l /u01/app/19.0.0/grid/log/[HOSTNAME]/...

           ├─3083 /u01/app/19.0.0/grid/bin/cssdagent

           ├─3199 /u01/app/19.0.0/grid/bin/ocssd.bin

           ├─4599 asm_pmon_+ASM

           ├─4601 asm_clmn_+ASM

           ├─4603 asm_psp0_+ASM

           ├─4606 asm_vktm_+ASM

           ├─4610 asm_gen0_+ASM

           ├─4612 asm_mman_+ASM

           ├─4616 asm_gen1_+ASM

           ├─4619 asm_diag_+ASM

           ├─4621 asm_pman_+ASM

           ├─4623 asm_dia0_+ASM

           ├─4625 asm_dbw0_+ASM

           ├─4627 asm_lgwr_+ASM

           ├─4629 asm_ckpt_+ASM

           ├─4631 asm_smon_+ASM

           ├─4633 asm_lreg_+ASM

           ├─4635 asm_pxmn_+ASM

           ├─4637 asm_rbal_+ASM

           ├─4639 asm_gmon_+ASM

           ├─4641 asm_mmon_+ASM

           ├─4643 asm_mmnl_+ASM

           ├─4705 oracle+ASM (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

           └─4706 oracle+ASM (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))



ohasd.service負責啟動ohas服務,已經退出。

oracle-ohasd.service正在執行,是實際的服務守護程式。


看一下這兩個服務執行的命令:


$ systemctl show oracle-ohasd.service|grep Exec

ExecMainStartTimestamp=Tue 2019-09-10 00:41:43 UTC

ExecMainStartTimestampMonotonic=11457980

ExecMainExitTimestampMonotonic=0

ExecMainPID=1262

ExecMainCode=0

ExecMainStatus=0

ExecStart={ path=/etc/init.d/init.ohasd ; argv[]=/etc/init.d/init.ohasd run >/dev/null 2>&1 </dev/null ; ignore_errors=no ; start_time=[Tue 2019-09-10 00:41:43 UTC] ; stop_time=[n/a] ; pid=1262 ; code=(null) ; status=0/0 }

ExecStop={ path=/etc/init.d/init.ohasd ; argv[]=/etc/init.d/init.ohasd stop >/dev/null 2>&1 </dev/null ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }


$ systemctl show ohasd.service|grep Exec

ExecMainStartTimestampMonotonic=0

ExecMainExitTimestampMonotonic=0

ExecMainPID=0

ExecMainCode=0

ExecMainStatus=0

ExecStart={ path=/etc/rc.d/init.d/ohasd ; argv[]=/etc/rc.d/init.d/ohasd start ; ignore_errors=no ; start_time=[Tue 2019-09-10 00:41:43 UTC] ; stop_time=[Tue 2019-09-10 00:41:44 UTC] ; pid=1265 ; code=exited ; status=0 }

ExecStop={ path=/etc/rc.d/init.d/ohasd ; argv[]=/etc/rc.d/init.d/ohasd stop ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }


檢視一下上面輸出中的ExecMainPID:


$ ps p 1262

  PID TTY      STAT   TIME COMMAND

 1262 ?        Ss     0:00 /bin/sh /etc/init.d/init.ohasd run >/dev/null 2>&1 </dev/null



我們注意到,有兩個關鍵的指令碼,ohasd和init.ohasd,在/etc/init.d和/etc/rc.d/init.d下都有,互為hard link,因為inode相同:


$ ls -l /etc/init.d/*ohas*

-rwxr-x---. 1 root root 15119 Sep  9 01:37 /etc/init.d/init.ohasd

-rwxr-x---. 1 root root  7791 Sep  9 01:37 /etc/init.d/ohasd


$ ls -l /etc/rc.d/init.d/*ohas*

-rwxr-x---. 1 root root 15119 Sep  9 01:37 /etc/rc.d/init.d/init.ohasd

-rwxr-x---. 1 root root  7791 Sep  9 01:37 /etc/rc.d/init.d/ohasd


$ ls -i /etc/init.d/ohasd /etc/rc.d/init.d/ohasd

83447865 /etc/init.d/ohasd  83447865 /etc/rc.d/init.d/ohasd


ohasd雖然有300多行,但核心就一句話,啟動ohas服務:


$ grep "crsctl start" ohasd

      log_console "Fix the problem and issue command 'crsctl start has' as $HAS_USER user to start Oracle Grid Infrastructure."

        my_crsctl start has -nowait



再來看iint.ohasd,有500多行。他的一個作用是監控ohas的狀態,並在錯誤時重啟。


看一下關於has的程式,init.ohasd是root執行的,而ohasd.bin是GI使用者執行的,可能是實際的has服務程式:


$ ps -ef|grep ohas

root      1262     1  0 00:41 ?        00:00:00 /bin/sh /etc/init.d/init.ohasd run >/dev/null 2>&1 </dev/null

grid      1334     1  0 00:41 ?        00:00:40 /u01/app/19.0.0/grid/bin/ohasd.bin reboot

grid     10586  4880  0 02:25 pts/0    00:00:00 grep --color=auto ohas


最後再來說一下dbstart和dbshut,可用來啟停資料庫:


$ which dbstart dbshut

/u01/app/19.0.0/grid/bin/dbstart

/u01/app/19.0.0/grid/bin/dbshut


其它


參考

https://oracle-base.com/articles/linux/automating-database-startup-and-shutdown-on-linux

https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units

https://unix.stackexchange.com/questions/396630/the-proper-way-to-test-if-a-service-is-running-in-a-script

https://orainternals.wordpress.com/2013/06/05/clusterware-startup/

https://zhuanlan.zhihu.com/p/54221584







About Me

........................................................................................................................

● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除

● 本文在個人微 信公眾號( DB寶)上有同步更新

● QQ群號: 230161599 、618766405,微信群私聊

● 個人QQ號(646634621),微 訊號(db_bao),註明新增緣由

● 於 2020年6月 在西安完成

● 最新修改時間:2020年6月

● 版權所有,歡迎分享本文,轉載請保留出處

........................................................................................................................

小麥苗的微店https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

● 小麥苗出版的資料庫類叢書: http://blog.itpub.net/26736162/viewspace-2142121/

小麥苗OCP、OCM、高可用、DBA學習班http://blog.itpub.net/26736162/viewspace-2148098/

● 資料庫筆試面試題庫及解答: http://blog.itpub.net/26736162/viewspace-2134706/

........................................................................................................................

請掃描下面的二維碼來關注小麥苗的微 信公眾號( DB寶)及QQ群(230161599、618766405)、新增小麥苗微 信(db_bao), 學習最實用的資料庫技術。

........................................................................................................................

 

 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2700907/,如需轉載,請註明出處,否則將追究法律責任。

相關文章