您好,登錄后才能下訂單哦!
春風(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ù)據(jù)庫:服務(wù)器上存在多個(gè)數(shù)據(jù)庫實(shí)例 p1 和 x1 (此處 p1 和 x1 為化名)
現(xiàn)象描述
本地使用 sqlplus 登錄到 x1 數(shù)據(jù)庫發(fā)現(xiàn)無法登錄到正常狀態(tài):
而我 們在本地登錄 到 p1 數(shù)據(jù)庫,則一切正常,無明顯問題 :
查看 alert 日志,了解到數(shù)據(jù)庫從前一天 18 點(diǎn)就開始有報(bào)錯;
從日志看起來,問題似乎很簡單, oracle 運(yùn)行過程中,組發(fā)生了改變:啟動時(shí)的組為 501 ( oinstall ),當(dāng)前組卻變?yōu)榱? 503 ( asmadmin );同時(shí),我們也可以從 alert 所在目錄相關(guān) trace 文件的屬性變化來確認(rèn)這一點(diǎn):
在 18:43 產(chǎn)生或更新的 trace 文件還是 oracle:oinstall 的屬主,而到了 18:44 ,新產(chǎn)生或更新的 trace 文件便成了 oracle:asmadmin 屬主。
知識點(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的屬主屬性。
這樣,我們就可以查看 $ORACLE_HOME/bin/oracle 這個(gè)文件的屬主情況:
老 K 在 2 月 10 日查看發(fā)現(xiàn) oracle 文件的屬主是 oracle ,屬組是 asmadmin ,它的上次修改時(shí)間是 12 月 10 日,對比起來相隔久遠(yuǎn);然而我們關(guān)注的文件屬組 / 屬主的變化,是不會影響到其顯示的修改時(shí)間的,只有修改內(nèi)容或替換文件才會出現(xiàn)文件修改時(shí)間的變化。下一步我們就可以使用如圖中命令來查看文件屬性變化的時(shí)間:
顯而易見,文件屬主 / 屬組的改變正是在 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ī)操作的前提下 !
OK
,言歸正傳我們繼續(xù)來說問題,前面雖然簡述了一些,其實(shí)不難發(fā)現(xiàn)這里有兩個(gè)重要的疑問還沒有解答
:
為什么
x1
實(shí)例存在問題,而
p1
實(shí)例卻沒有受到影響呢?
老
K
首先猜想到的就是:“是不是
p1
實(shí)例的啟動是在
oracle
文件的屬組改變之后呢”?于是查看發(fā)現(xiàn)
p1
實(shí)例的啟動時(shí)間:
p1
數(shù)據(jù)庫實(shí)例的啟動時(shí)間是似乎就在
$ORACLE_HOME/bin/oracle
文件的屬組改變的前后,這真的是巧合嗎?這里引出了第二個(gè)疑問
是誰改變了
oracle
文件的屬組,為什么要去這么做呢?
如圖顯示
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
。
事情似乎又變的復(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
命令呢?
正是因?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í)屬組不一致
。
到這里,前面的兩個(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
日志:
看到日志老
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
日志:
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í)屬組不一致的問題了。
之前存在對
oracle
文件的
relink
操作,并將日志記錄在了
$ORACLE_HOME/install/relink.log
里,在我們查看
relink.log
的信息時(shí)就能定位到這條命令的操作時(shí)間了:
基于老
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)行溝通,對話如下:↓↓↓↓↓
現(xiàn)場運(yùn)維商確實(shí)在之前處理其它問題時(shí),使用過
relink
命令重現(xiàn)編譯
oracle
文件,但是當(dāng)時(shí)沒有啟動數(shù)據(jù)
庫。
厄。。。好像是的!
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ù)正常。
最后總結(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ā)分享是對我們最大的鼓勵!
免責(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)容。