Oracleのバッググラウンドプロセスをぶっこ●しちゃおうぜ!!の巻

※ここで記載した内容は独断と偏見に基づく個人の見解であり、実行しているコマンドや手順も必ずしも正しい手順とは限りません。その為、あくまで参考程度にご覧頂ければと思います。

 

■前置き

Oracleには大まかに以下7つの必須のバックグラウンドプロセスがあります。
 
 ======
 -プロセス・モニター・プロセス(PMON)
 -システム・モニター・プロセス(SMON)
 -データベース・ライター・プロセス(DBWn)
 -ログ・ライター・プロセス(LGWR)
 -チェックポイント・プロセス(CKPT)
 -管理性モニター・プロセス(MMONおよびMMNL)
 -リカバラ・プロセス(RECO)
 ======
 
上記のバックグラウンドプロセスは、DBで動作する必須のプロセスです。何らかの原因でどれか1つでも終了してしまった場合は、DBが正常に稼働できなくなる為、インスタンスが停止してしまいます。


■検証概要

今回は、実際に必須のバックグラウントプロセスをKILLコマンドにて停止させた場合に実際にインスタンスダウンが発生するのか確認します。また、それ以外のオプションのプロセスを停止した場合にどういった挙動となるのか検証して確認してみようと思います。


■検証環境

OS:Oracle Enterprise Linux 5.8
DB:Oracle Database Enterprise Edition 11.2.0.1


■検証内容

(1)まずはV$PROCESSから現在起動しているプロセスの状態を確認します。
 
  SQL> SELECT PNAME FROM V$PROCESS
  WHERE PNAME IS NOT NULL ORDER BY PNAME;
 
  PNAME
  ---------------
  ARC0
  ARC1
  ARC2
  ARC3
  CJQ0
  CKPT <-★チェックポイント(必須プロセス)
  D000
  DBRM
  DBW0 <-★データベースライター(必須プロセス)
  DIA0
  DIAG
 
  PNAME
  ---------------
  GEN0
  LGWR <-★ログライター(必須プロセス)
  MMAN
  MMNL <-★管理モニタライト(必須プロセス)
  MMON <-★管理モニタ(必須プロセス)
  NSA2
  PMON <-★プロセスモニター(必須プロセス)
  PSP0
  Q000
  Q001
  QMNC
 
  PNAME
  ---------------
  RECO <-★リカバラ(必須プロセス)
  S000
  SMCO <-★システムモニタ(必須プロセス)
  SMON
  VKRM
  VKTM
  W000
 
29行が選択されました。


(2)続いてOS側からpsコマンドにてDBのバッググラウンドプロセスについて確認します。
  
  bash-3.2$ ps -ef |grep ora_
  oracle 5149 1 0 00:00 ? 00:00:00 ora_pmon_orcl <-★プロセスモニター(必須プロセス)
  oracle 5151 1 0 00:00 ? 00:00:00 ora_vktm_orcl
  oracle 5155 1 0 00:00 ? 00:00:00 ora_gen0_orcl
  oracle 5157 1 0 00:00 ? 00:00:00 ora_diag_orcl
  oracle 5159 1 0 00:00 ? 00:00:00 ora_dbrm_orcl
  oracle 5161 1 0 00:00 ? 00:00:00 ora_psp0_orcl
  oracle 5163 1 0 00:00 ? 00:00:00 ora_dia0_orcl
  oracle 5165 1 0 00:00 ? 00:00:00 ora_mman_orcl
  oracle 5167 1 0 00:00 ? 00:00:00 ora_dbw0_orcl<-★データベースライター(必須プロセス)
  oracle 5169 1 0 00:00 ? 00:00:00 ora_lgwr_orcl<-★ログライター(必須プロセス)

  oracle 5171 1 0 00:00 ? 00:00:00 ora_ckpt_orcl<-★チェックポイント(必須プロセス)
  oracle 5173 1 0 00:00 ? 00:00:00 ora_smon_orcl<-★システムモニタ(必須プロセス)
  oracle 5175 1 0 00:00 ? 00:00:00 ora_reco_orcl<-★リカバラ(必須プロセス)
  oracle 5177 1 1 00:00 ? 00:00:00 ora_mmon_orcl<-★管理モニタ(必須プロセス)
  oracle 5179 1 0 00:00 ? 00:00:00 ora_mmnl_orcl<-★管理モニタライト(必須プロセス)
  oracle 5183 1 0 00:00 ? 00:00:00 ora_s000_orcl

  oracle 5227 1 0 00:00 ? 00:00:00 ora_arc0_orcl
  oracle 5229 1 0 00:00 ? 00:00:00 ora_arc1_orcl
  oracle 5231 1 0 00:00 ? 00:00:00 ora_arc2_orcl
  oracle 5233 1 0 00:00 ? 00:00:00 ora_arc3_orcl
  oracle 5235 1 0 00:00 ? 00:00:00 ora_nsa2_orcl
  oracle 5237 1 0 00:00 ? 00:00:00 ora_qmnc_orcl
  oracle 5245 1 0 00:00 ? 00:00:00 ora_arc4_orcl
  oracle 5263 1 0 00:00 ? 00:00:00 ora_cjq0_orcl
  oracle 5281 1 0 00:00 ? 00:00:00 ora_vkrm_orcl
  oracle 5290 1 0 00:00 ? 00:00:00 ora_q000_orcl
  oracle 5292 1 0 00:00 ? 00:00:00 ora_q001_orcl
  oracle 5298 1 1 00:00 ? 00:00:00 ora_j000_orcl
  oracle 5300 1 9 00:00 ? 00:00:01 ora_j001_orcl
  oracle 5302 1 0 00:00 ? 00:00:00 ora_j002_orcl
  oracle 5307 3632 0 00:00 pts/1 00:00:00 grep ora_
  

(3)必須プロセスのDBWRn(nは数字)をやっちゃいます(^^)/

bash-3.2$ kill -9 5167


(4)DB側の起動状況をアラートログから確認すると、一定間隔でバックグラウンド・プロセスの状態監視を行っているPMONがDBWRの異常終了を感知しDBが強制的に停止された状況が確認できます(★2)DBWRn(nは数字)は必須のバッググラウンドプロセスとなる為、インスタンスが停止されたのも想定通りの動作になるかと思います。
  
  ===アラートログより該当時間帯抜粋
  Thu Feb 26 00:02:59 2015
  PMON (ospid: 5149): terminating the instance due to error 471<-★1
  Instance terminated by PMON, pid = 5149 <-★2
  ===
  
★1でアラートログには「error 471」のエラーが出力されている事も確認できます。こちらの出力は「ORA-00471」エラーが発生した事を表します。ORA-00471エラーはDBWRが何らかの理由で異常終了した場合に出力されるエラーです。


(5)続いてオプションのプロセスとなる一般タスク実行プロセス(GENn(nは数字))を停止します。

bash-3.2$ kill -9 30534


(6)一般タスク実行プロセスをkill後、アラートログを確認します。オプションのプロセスにも関わらず、PMONが該当プロセスの異常終了を検知しインスタンスを強制停止させた事が確認できます。
  
  ====アラートログより該当箇所抜粋
  PMON (ospid: 30528): terminating the instance due to error 495 <-★
  Instance terminated by PMON, pid = 30528 <-★
  ====
  
上記で出力されている「error 495」は「ORA-495」エラーが発生した事を表し、こちらのエラーは一般タスク実行プロセスが何らかの原因によって異常終了した場合に出力されます。


(7)次はオプションのプロセスの中でもかなりメジャーなプロセスとなるARCn(nは数字)を停止した場合の動作について確認していきます。

bash-3.2$ kill -9 30939


(8)該当時間帯のアラートログを確認してみます。以下の様な出力が確認出来ました。
 

  =====アラートログより該当箇所抜粋
  Thu Feb 26 00:31:46 2015
  ARCH shutting down <-★1
  ARC4: Archival stopped <-★2
  Thu Feb 26 00:31:46 2015
  Thu Feb 26 00:33:46 2015
  ARC2: Detected ARCH process failure <-★3
  ARC2: STARTING ARCH PROCESSES <-★4
  Thu Feb 26 00:33:46 2015
  ARC0 started with pid=29, OS id=31076 <-★5
  Thu Feb 26 00:33:47 2015
  ARC0: Archival started <-★6
  ARC2: STARTING ARCH PROCESSES COMPLETE <-★7
  =====
  
上記の出力結果より、アーカイバプロセスのKILLではPMONによるインスタンスの強制終了は行われない事が確認できます。

また、該当時間帯に複数の出力がありますので、順をおってそちらも確認していきましょう。まず、★1の箇所でKILLコマンドが実行されたことを受け、ARCHが停止された事が確認出来ます。

 

-1.アラートの★2の出力からARCHの停止に伴い、ARC4プロセスも停止してしまった様です。

-2.アラートの★3の出力でARCH2プロセスがARCHプロセスの障害を検知した様子が確認出来ます。

-3.アラートの★4の出力からARCH2プロセスによってアーカイブプロセスが起動された様です。

-4.アラートの★5の出力からARC0プロセスの起動が開始した事が確認出来ます。

-5.アラートの★6や★7の出力からアーカイブプロセスの起動が完了した事が確認できます。


(9)続いて CJQnプロセスを停止した場合の動作について確認します。

bash-3.2$ kill -9 30979
  
  ====アラートログより該当箇所抜粋
  Thu Feb 26 01:00:51 2015
  Restarting dead background process CJQ0<-★
  Thu Feb 26 01:00:51 2015
  CJQ0 started with pid=28, OS id=31687<-★
  ====
  
この場合、アラートログにはCJQn(nは数字)プロセスが停止された事を示す出力はなされない様です。また停止後、即座にCJQn(nは数字)プロセスが再起動されることが確認出来ました。

 

■まとめ

その後も、KILLコマンドでバックグラウンドプロセスを停止させた場合の動作を確認しましたが必須プロセスについてはどのプロセスを停止した場合にもインスタンが強制停止される動作となりました。

 

ただし、オプションのプロセスについてはプロセスの種類によって、インスタンスが強制停止される動作となるものや、インスタンスの停止は無くプロセス再起動となるプロセス、停止後も起動されないプロセス等プロセスの種類によって様々な動作となりました。

 

しかしながら、上記で確認した内容については、OSの種類やDBのバージョンによって挙動は異なってくるものだろうし、中には私の検証環境の設定等による固有の動作もあったのかなと推察しています。