溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

發(fā)布時(shí)間:2020-08-19 12:07:26 來源:ITPUB博客 閱讀:167 作者:記錄每一次錯誤 欄目:關(guān)系型數(shù)據(jù)庫
技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障     

      春風(fēng)輕輕吹走了冬日里的寒氣,又到了一年最美的花季,伴隨著溫暖的陽光 老K 再次與大家相見!此次的回歸老K不僅會繼續(xù)和大家分享一些自己處理過的小案例,更優(yōu)化了技術(shù)交流模塊,希望在探討的過程中大家可以提高技術(shù)等級的同時(shí),也能領(lǐng)略到中亦DBA團(tuán)隊(duì)獨(dú)有的匠人精神。

問題來了

      某一日的清晨,客戶打來電話稱巡檢時(shí)發(fā)現(xiàn)關(guān)鍵系統(tǒng)數(shù)據(jù)庫節(jié)點(diǎn)無法連接,原數(shù)據(jù)庫為 4 節(jié)點(diǎn) RAC ,現(xiàn)少一節(jié)點(diǎn),擔(dān)心業(yè)務(wù)高峰 3 個(gè)節(jié)點(diǎn)數(shù)據(jù)庫無法承擔(dān)業(yè)務(wù)高峰的壓力。這種情況需要盡快處理,所以老 K 選擇以最快的遠(yuǎn)程支持方式解決問題。


問題分析

環(huán)境描述

系統(tǒng): linux

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

數(shù)據(jù)庫:服務(wù)器上存在多個(gè)數(shù)據(jù)庫實(shí)例 p1 x1 (此處 p1 x1 為化名)

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

現(xiàn)象描述

本地使用 sqlplus 登錄到 x1 數(shù)據(jù)庫發(fā)現(xiàn)無法登錄到正常狀態(tài):

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

而我 們在本地登錄 p1 數(shù)據(jù)庫,則一切正常,無明顯問題

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

分析步驟小1:

   查看 alert 日志,了解到數(shù)據(jù)庫從前一天 18 點(diǎn)就開始有報(bào)錯;

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

   從日志看起來,問題似乎很簡單, oracle 運(yùn)行過程中,組發(fā)生了改變:啟動時(shí)的組為 501 oinstall ),當(dāng)前組卻變?yōu)榱? 503 asmadmin );同時(shí),我們也可以從 alert 所在目錄相關(guān) trace 文件的屬性變化來確認(rèn)這一點(diǎn):

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

   在 18:43 產(chǎn)生或更新的 trace 文件還是 oracle:oinstall 的屬主,而到了 18:44 ,新產(chǎn)生或更新的 trace 文件便成了 oracle:asmadmin 屬主。


技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

知識點(diǎn):

問: UNIX/LINUX 環(huán)境中, oracle 數(shù)據(jù)庫啟動后存在許多后臺進(jìn)程和前臺進(jìn)程,雖然相關(guān)進(jìn)程產(chǎn)生一些 trace 文件也是常有的事情,但是真正是什么決定了 oracle 相關(guān)進(jìn)程的屬性呢?

答:通常來說,oracle的后臺進(jìn)程的調(diào)用是依賴于$ORACLE_HOME/bin/oracle這個(gè)二進(jìn)制文件,但它從遠(yuǎn)端連入而分配的服務(wù)器進(jìn)程(server process)相關(guān)屬主的屬性則是繼承自listener進(jìn)程,而listener進(jìn)程的屬主屬性同樣是進(jìn)程自其啟動的用戶(分oracle用戶和grid用戶)$ORACLE_HOME/bin/oracle的屬主屬性。

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障


分析步驟小2:

   這樣,我們就可以查看 $ORACLE_HOME/bin/oracle 這個(gè)文件的屬主情況:

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

   老 K 2 10 日查看發(fā)現(xiàn) oracle 文件的屬主是 oracle ,屬組是 asmadmin ,它的上次修改時(shí)間是 12 10 日,對比起來相隔久遠(yuǎn);然而我們關(guān)注的文件屬組 / 屬主的變化,是不會影響到其顯示的修改時(shí)間的,只有修改內(nèi)容或替換文件才會出現(xiàn)文件修改時(shí)間的變化。下一步我們就可以使用如圖中命令來查看文件屬性變化的時(shí)間:

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

   顯而易見,文件屬主 / 屬組的改變正是在 2 9 日,這樣基本全部對應(yīng),就可以合理的推斷出: oracle 文件的屬主在 2 9 日發(fā)生了變化,隨后數(shù)據(jù)庫即產(chǎn)生報(bào)錯,也就是實(shí)際上這個(gè)數(shù)據(jù)庫實(shí)例自前一天的晚上就不可用了,只是到第二天早上才發(fā)現(xiàn)問題,那解決問題的方式就簡單多了,重啟數(shù)據(jù)庫!因?yàn)闊o法正常登錄數(shù)據(jù)庫(連 sysdba 也無法登錄),就不得不直接 kill 掉數(shù)據(jù)庫實(shí)例的關(guān)鍵進(jìn)程,然后再正常啟動數(shù)據(jù)庫,一切又再次恢復(fù)正常。

   按照上述步驟分析起來也不是什么麻煩問題,大家或許會想即使我們不懂詳細(xì)原因,看到數(shù)據(jù)庫沒法用了,直接使用重啟大法,這個(gè)問題不也輕易的就解決了嗎?難道還需要理解這個(gè)問題的本質(zhì)嗎?

在這里,老K有話說! ↓↓↓↓↓↓↓↓

         既然大家選擇要走技術(shù)的道路,最重要的是保持一顆持久的好奇心,尋找答案的過程予我們也是進(jìn)益,不斷的研究即是不斷的提高,永無止境的探索,才是前進(jìn)路上的唯一指引。當(dāng)然最重要的是在保證生產(chǎn)環(huán)境安全并且合規(guī)操作的前提下 !


難題首現(xiàn)

        OK ,言歸正傳我們繼續(xù)來說問題,前面雖然簡述了一些,其實(shí)不難發(fā)現(xiàn)這里有兩個(gè)重要的疑問還沒有解答

為什么 x1 實(shí)例存在問題,而 p1 實(shí)例卻沒有受到影響呢?

  老 K 首先猜想到的就是:“是不是 p1 實(shí)例的啟動是在 oracle 文件的屬組改變之后呢”?于是查看發(fā)現(xiàn) p1 實(shí)例的啟動時(shí)間:

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

        p1 數(shù)據(jù)庫實(shí)例的啟動時(shí)間是似乎就在 $ORACLE_HOME/bin/oracle 文件的屬組改變的前后,這真的是巧合嗎?這里引出了第二個(gè)疑問

  是誰改變了 oracle 文件的屬組,為什么要去這么做呢?

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

  如圖顯示 p1 實(shí)例的 trace 文件也曾在 2016 年的 12 10 日發(fā)生過改變,而且改變后,一直保持為 oracle:oinstall 的屬主屬性,而在 2 9 日重啟完成后恢復(fù)為 oracle:asmadmin 的屬主屬性(圖片中沒有顯示出來),也就是說在更早之前,我們可以推斷 $ORACLE_HOME/bin/oracle 文件的屬組是 asmadmin ,在 12 10 日更改為 oinstall ,而在 2 9 日再次更改為 asmadmin 。


老K的回憶沙龍~

  事情似乎又變的復(fù)雜起來了,這里讓老 K想起 遇到過的一段經(jīng)驗(yàn), CASE 是這樣的:我們在打完數(shù)據(jù)庫補(bǔ)丁之后,經(jīng)常會出現(xiàn) $ORACLE_HOME/bin/oracle 文件的屬組發(fā)生改變,導(dǎo)致本地的非 dba 用戶不通過監(jiān)聽連接數(shù)據(jù)庫時(shí)報(bào)無法訪問 ASM 磁盤的情況( asm 磁盤的屬組一般是 grid:asmadmin 的),而我們只需要通過使用 srvctl start database   的方式來重新啟動數(shù)據(jù)庫就可以解決該問題(當(dāng)然在數(shù)據(jù)庫停止的情況下直接 chown 的方式也可以) ;

  那么在這個(gè)問題里是不是也前一天重啟 p1 實(shí)例也是用的 srvctl 命令呢?

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

  正是因?yàn)榍耙惶焓褂? srvctl 的方式啟動了 p1 節(jié)點(diǎn),改變了 oracle 文件的屬組,導(dǎo)致了 x1 節(jié)點(diǎn)出現(xiàn)報(bào)錯;至于為什么要改變 oracle 文件的屬組,那就是 oracle 的機(jī)制的原因了。這里我們需要理解的一點(diǎn),使用 srvctl/crsctl 命令來啟停數(shù)據(jù)庫和使用 sqlplus 登錄到數(shù)據(jù)庫中啟停數(shù)據(jù)庫的區(qū)別是, srvctl/crsctl 命令調(diào)用的是 crs oraagent 來執(zhí)行的,而 sqlplus 是在 oracle 用戶下直接執(zhí)行的。


小結(jié)

1 .      數(shù)據(jù)庫實(shí)例 p1 x1 在正常運(yùn)行;

2.   $ORACLE_HOME/bin/oracle 文件的屬組是 oinstall 的;

3.   2 9 日,運(yùn)維人員重啟了 p1 實(shí)例,啟動時(shí)的方式是 srvctl     startinstance -d p -i p1 ,這個(gè)過程中將 $ORACLE_HOME/bin/oracle 的屬組改為 asmadmin ;

4.   數(shù)據(jù)庫實(shí)例 x1 開始報(bào)錯運(yùn)行時(shí)屬組與啟動時(shí)屬組不一致 。



難題再現(xiàn)!

   到這里,前面的兩個(gè)難題已經(jīng)解開,不過我們在與客戶的溝通過程中就不免多問一句,為什么會去重啟 p1 實(shí)例呢?給出的答案又引起了我們的思考:前一天客戶發(fā)現(xiàn) p1 實(shí)例無法登錄,由于 p1 數(shù)據(jù)庫實(shí)際上已經(jīng)不作生產(chǎn)使用,平時(shí)可能會有一些簡單的測試使用到這個(gè)數(shù)據(jù)庫,所以客戶的現(xiàn)場維護(hù)人員直接重啟了 p1 實(shí)例解決問題。但是 為何 p1 實(shí)例會無法登錄呢? 如果僅僅是測試庫的話,正常是不應(yīng)該有壓力大的情況,還是說也是類似 x1 的情況?就此,我們再從分析 p1 實(shí)例之前的運(yùn)行情況。另外,從前面的過程來看,我們可以看到 oracle 文件屬組曾經(jīng)從 asmadmin 變?yōu)? oinstall ,這樣我們就還需要解釋一個(gè)問題, 如果說 srvctl 的方式啟停數(shù)據(jù)庫會將 $ORACLE_HOME/bin/oracle 文件的屬組改為 asmadmin 的話,那么,又是什么讓這個(gè)文件的屬組改為 oinstall 的呢 ? 帶著這兩個(gè)新的疑惑,老 K 再次踏上解惑的征程,先來看 p1 實(shí)例的 alert 日志:

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

   看到日志老 K 才發(fā)現(xiàn),原來 p1 實(shí)例在 12 10 09:18:09 開始啟動,啟動到 09:23:33 的時(shí)候就已經(jīng)開始報(bào)錯,并一直持續(xù)到 2 9 日重啟之前,通過重啟的方式最終解決。 P1 為什么會存在這樣的問題呢?那么 X1 實(shí)例呢,之前為什么沒有問題呢?我們再來看看 x1 實(shí)例之前的 alert 日志:

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

          x1 實(shí)例在啟動時(shí)也經(jīng)歷過啟動報(bào)錯的過程,只不過很不幸, x1 實(shí)例在啟動后臺進(jìn)程 RSMN 時(shí),就已經(jīng)出錯,導(dǎo)致實(shí)例啟動失敗,而后在 09:23 再次啟動,則啟動成功,后續(xù)因?yàn)? $ORACLE_HOME/bin/oracle 文件沒有修改過屬組,直到 2 9 18 點(diǎn),也沒有再報(bào)過錯。細(xì)心的同學(xué)可以看到   x1 實(shí)例和 p1 實(shí)例在 12 10 日的 shutdown 和初次 startup 的時(shí)間是基本一致的,于是我們猜測,這個(gè)動作應(yīng)該是使用 crsctl stop crs crsctl start crs 的方式來啟停 CRS 的過程中順帶將數(shù)據(jù)庫啟停了, 那么為什么 p1 實(shí)例啟動完成了,而 x1 實(shí)例啟動失敗了呢?事實(shí)上這里 p1 也就只是啟動了實(shí)例,并沒有打開數(shù)據(jù)庫,而 x1 實(shí)例啟動失敗是因?yàn)槠潢P(guān)鍵進(jìn)程 RSMN 的啟動時(shí)間正好在 $ORACLE_HOME/bin/oracle 的屬組修改的時(shí)間( 09:19:22 )之后導(dǎo)致啟動失敗,而再次啟動時(shí), x1 實(shí)例相關(guān)進(jìn)程的屬組也就都一致了不再存在啟動時(shí)和運(yùn)行時(shí)屬組不一致的問題了。

   現(xiàn)在,我們還剩下最后一個(gè)難題,那就是 12 10 日,客戶現(xiàn)場的維護(hù)人員做了什么才導(dǎo)致 $ORACLE_HOME/bin/oracle 文件的屬組變?yōu)榱瞬徽_的 oinstall 屬組?這里,我們查看了該節(jié)點(diǎn)上數(shù)據(jù)庫打補(bǔ)丁的信息,發(fā)現(xiàn)自安裝以來并沒有再打過補(bǔ)?。ㄈ罩具^長,這里就不再列出);不過很幸運(yùn),我們通過歷史命令記錄查到了蛛絲馬跡:

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

   之前存在對 oracle 文件的 relink 操作,并將日志記錄在了 $ORACLE_HOME/install/relink.log 里,在我們查看 relink.log 的信息時(shí)就能定位到這條命令的操作時(shí)間了:

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

   基于老 K 日常積累的經(jīng)驗(yàn),才可以這么認(rèn)定 relink 操作就會改變 oracle 文件的屬組信息。在 opatch 打完一些數(shù)據(jù)庫補(bǔ)丁后,通常會改變 oracle 文件的屬組信息,如果我們細(xì)看 opatch 過程中的詳細(xì)日志,我們就會發(fā)現(xiàn),這個(gè)過程中實(shí)際上使用的底層命令就是 relink ,也就認(rèn)為 relink 實(shí)際上會修改 oracle 文件的內(nèi)容,同時(shí)也會修改 oracle 文件的屬組(因?yàn)樽鲞@個(gè)操作的用戶是 oracle:oinstall )。得出結(jié)論后繼續(xù)與客戶進(jìn)行溝通,對話如下:↓↓↓↓↓

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

現(xiàn)場運(yùn)維商確實(shí)在之前處理其它問題時(shí),使用過 relink 命令重現(xiàn)編譯 oracle 文件,但是當(dāng)時(shí)沒有啟動數(shù)據(jù) 庫。

是不是當(dāng)時(shí)先重啟了操作系統(tǒng)呢?
技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障
技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障
請輸入
技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

厄。。。好像是的!


到底發(fā)生了什么?

1. 12 10 ,客戶的現(xiàn)場運(yùn)維商需要使用 relink 命令解決問題;

2. relink 之前直接重啟操作系統(tǒng),操作系統(tǒng)啟動時(shí),自動啟動 CRS ,并且將試圖啟動數(shù)據(jù)庫以恢復(fù)到之前狀態(tài)

3. 在啟動數(shù)據(jù)庫的過程中,維護(hù)商沒有關(guān)注到是否有數(shù)據(jù)庫正在運(yùn)行即已開始執(zhí)行 relink 操作;

4. relink 操作的過程中, p1 完成了實(shí)例啟動,而 x1 實(shí)例則因?yàn)? RSMN 啟動時(shí) oracle 文件的屬組已經(jīng)發(fā)生改變, RSMN 啟動失敗,繼而導(dǎo)致 x1 實(shí)例失敗,而 p1 實(shí)例雖然啟動成功,但是一直報(bào)錯,數(shù)據(jù)庫也未能打開;

5. 在此期間 p1 實(shí)例實(shí)際上是不可用的,在 2 9 日維護(hù)商發(fā)現(xiàn) p1 實(shí)例不可用,因?yàn)檎J(rèn)為 p 1庫不重要,在未核查原因的情況下直接重啟了 p1 實(shí)例, p1 實(shí)例正常 ;

6. 因?yàn)樵趩? p1 實(shí)例是使用的 srvctl start 的命令,導(dǎo)致啟動時(shí)修改了 $ORACLE_HOME/bin/oracle 的屬組,導(dǎo)致 x1 實(shí)例不可用 ;

7. 最終通過重啟 x1 實(shí)例恢復(fù)正常。

技術(shù)人生系列 · 我和數(shù)據(jù)中心的故事(第十一期)- 一次啟停引發(fā)的故障

  最后總結(jié):

     通過詳細(xì)的分析,我們發(fā)現(xiàn)從 p1 實(shí)例的處理方式能很快的解決,但是問題的根本是 有一系列的操作上的失誤導(dǎo)致, 所以老 K 想再一次安利下自己的觀點(diǎn):我們在解決問題的過程中,對于任何小疑點(diǎn)都不能輕易濾過,現(xiàn)在發(fā)生的問題也許就是由多個(gè)小的問題愈演愈烈最終影響正常業(yè)務(wù),我們只要對整體分析透徹,自然可以從本質(zhì)上解決問題。所以大家一定時(shí)刻保持探索精神,不忽略任何一個(gè)細(xì)節(jié),這也是我們作為中亦人一直在堅(jiān)持的精神??!

   好啦,本期就到這里, 今年 我們中亦 DBA 團(tuán)隊(duì)將全力以赴,用詼諧和嚴(yán)謹(jǐn)?shù)姆绞綄⑽覀兊慕?jīng)驗(yàn)進(jìn)行分享, 希望大家多多支持,伙伴們的轉(zhuǎn)發(fā)分享是對我們最大的鼓勵!


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI