oracle rac理解和用途扩展
?
Oracle RAC的優(yōu)勢(shì)在于利用多個(gè)節(jié)點(diǎn)(數(shù)據(jù)庫(kù)實(shí)例)組成一個(gè)數(shù)據(jù)庫(kù),這樣在保證了數(shù)據(jù)庫(kù)高可用性的情況下更充分的利用了多個(gè)主機(jī)的性能,而且可以通過(guò)增加節(jié)點(diǎn)進(jìn)行性能的擴(kuò)展。實(shí)現(xiàn)Oracle RAC需要解決的關(guān)鍵問(wèn)題就是多節(jié)點(diǎn)進(jìn)行數(shù)據(jù)訪問(wèn)時(shí)如何保證數(shù)據(jù)的一致性,Oracle是通過(guò)各節(jié)點(diǎn)間的私有連接進(jìn)行內(nèi)存融合(cache fusion)來(lái)保證各節(jié)點(diǎn)數(shù)據(jù)訪問(wèn)的一致性。用一個(gè)例子來(lái)解釋一下內(nèi)存融合的過(guò)程,在存在A、B兩個(gè)節(jié)點(diǎn)的RAC環(huán)境中,當(dāng)A節(jié)點(diǎn)使用DML語(yǔ)句(如Update)對(duì)一個(gè)數(shù)據(jù)塊中的數(shù)據(jù)進(jìn)行修改時(shí),A節(jié)點(diǎn)實(shí)例會(huì)到GRD(Global Resource Directory)中查找該數(shù)據(jù)塊的信息,這些信息包括該數(shù)據(jù)塊的Master(第一次讀這個(gè)數(shù)據(jù)塊的節(jié)點(diǎn)),Owner(當(dāng)前擁有這個(gè)數(shù)據(jù)塊的節(jié)點(diǎn)),以及數(shù)據(jù)塊在各個(gè)節(jié)點(diǎn)間的傳遞記錄。A節(jié)點(diǎn)如果發(fā)現(xiàn)GRD中沒(méi)有需要讀取的數(shù)據(jù)塊的信息,說(shuō)明該數(shù)據(jù)塊是一個(gè)干凈的數(shù)據(jù)塊,A節(jié)點(diǎn)從磁盤或Buffer Cache中獲得該數(shù)據(jù)塊,然后對(duì)需要修改的行加鎖,進(jìn)行相應(yīng)的修改,當(dāng)然SCN會(huì)隨之增加。在A完成修改而沒(méi)有提交或回滾的情況下,如果B節(jié)點(diǎn)也需要訪問(wèn)這個(gè)數(shù)據(jù)塊修改某些行(假設(shè)不同于A修改的行),B同樣去到GRD中查找該數(shù)據(jù)塊的信息,當(dāng)然B發(fā)現(xiàn)該數(shù)據(jù)塊的Master為A,Owner也為A,為了保證A的修改不丟失,B需要發(fā)信息給A,讓A將需要修改的數(shù)據(jù)塊通過(guò)私有連接直接從內(nèi)存中傳給B,當(dāng)然該數(shù)據(jù)塊中包含A的鎖信息,這樣A節(jié)點(diǎn)與B節(jié)點(diǎn)間的一次內(nèi)存的數(shù)據(jù)傳遞就是內(nèi)存融合。Oracle RAC的內(nèi)存融合也面臨一些問(wèn)題,繼續(xù)剛剛的例子,如果A又再次請(qǐng)求對(duì)該數(shù)據(jù)塊修改或者結(jié)束事務(wù)(提交或回滾)的時(shí)候,又需要從B節(jié)點(diǎn)內(nèi)存中取得數(shù)據(jù)塊,又要發(fā)生內(nèi)存融合,這樣在兩個(gè)節(jié)點(diǎn)業(yè)務(wù)沒(méi)有合理分割的情況下,數(shù)據(jù)庫(kù)繁忙時(shí),大量的內(nèi)存融合會(huì)對(duì)數(shù)據(jù)庫(kù)性能造成嚴(yán)重的影響。通過(guò)對(duì)Oracle RAC技術(shù)的理解,在實(shí)現(xiàn)Oracle RAC架構(gòu)時(shí)的業(yè)務(wù)分割就成為了保證系統(tǒng)性能的重要手段,業(yè)務(wù)分割的根本在于使不同的實(shí)例不能訪問(wèn)相同的數(shù)據(jù)塊,這樣業(yè)務(wù)分割規(guī)則可以小到表的級(jí)別(不同的表不會(huì)共享一個(gè)數(shù)據(jù)塊),大到表空間、Schema的級(jí)別。心跳應(yīng)該用獨(dú)立的網(wǎng)卡。
?
當(dāng)然,rac本身之保證了數(shù)據(jù)庫(kù)服務(wù)器的高可用和高性能,所以最好有其他的存儲(chǔ)技術(shù)來(lái)保證存儲(chǔ)的高可用,例如raid\vplex等。
在距離不太遠(yuǎn)(幾十公里),且速度較快(例如裸光纖)下,延時(shí)較小,,米足夠多,可以考慮使用oracle rac實(shí)現(xiàn)雙活或者災(zāi)備,RTO RPO=0。
?
?
附:
1.rac基本理論知識(shí)
?
1.1 Public NIC接入公共網(wǎng)絡(luò),private NIC接入私有網(wǎng)絡(luò),這是個(gè)完全隔離的網(wǎng)絡(luò)傳遞的數(shù)據(jù)只是RAC節(jié)點(diǎn)的心跳數(shù)據(jù)和cache fusion數(shù)據(jù)。oracle不建議私有網(wǎng)絡(luò)直接用交叉線連接。
1.2 RAC最重要的是共享存儲(chǔ)。數(shù)據(jù)文件、聯(lián)機(jī)日志、控制文件、參數(shù)文件都必須放在共享存儲(chǔ)上。現(xiàn)在的存儲(chǔ)環(huán)境基本上都是基于SAN的,跑FC協(xié)議(FC協(xié)議封裝了SCSI協(xié)議)。
1.3 RAC環(huán)境需要OS必須版本相同包括小版本、補(bǔ)丁包都必須一致。
1.4 集群件安裝在OS之上,負(fù)責(zé)管理整個(gè)集群環(huán)境中的硬件資源并為上層的RAC集群提供基礎(chǔ)服務(wù)。如果把集群看成是一臺(tái)虛擬的計(jì)算機(jī),那么集群件就是這臺(tái)計(jì)算機(jī)上的OS,而RAC是運(yùn)行在其上的一個(gè)應(yīng)用。
10g之前,oracle只針對(duì)linux、windows兩個(gè)OS提供了一個(gè)不完善的集群件產(chǎn)品OCM(oracle cluster manager),其它平臺(tái)需要第三方集群產(chǎn)品比如HACMP、sun cluster。10g開(kāi)始,10.1版本提供CRS,10.2版????????????本提供oracle clusterware(10.1的改名)。10.2開(kāi)始的集群件提供API接口,因此還能夠?yàn)槠渌浖峁〩A功能。CRS可以和其它集群件產(chǎn)品集成。10g之前oralce只提供對(duì)裸設(shè)備的支持,所以9i RAC裸設(shè)備是常見(jiàn)選擇。10后oracle提供OCFS和ASM兩種存儲(chǔ)方案。
1.5 OEL(oracle enterprise linux)是oracle在RHEL基礎(chǔ)上重新開(kāi)發(fā)出的linux。
1.6 需要強(qiáng)調(diào)的是,10g的clusterware的vote disk、ocr在目前的版本上還只能創(chuàng)建在裸設(shè)備、ocfs上。VIP在clusterware安裝過(guò)程中創(chuàng)建(調(diào)用VIPCA),不需要手工設(shè)置。
1.7 集群的分類:高性能計(jì)算集群(用在科學(xué)計(jì)算)、LB、HA、
1.8 健忘癥:集群環(huán)境配置文件不是集中存放,每個(gè)節(jié)點(diǎn)都有一個(gè)本地副本,用戶修改任何節(jié)點(diǎn)的集群配置會(huì)將更改同步到其它節(jié)點(diǎn)。但這樣有一個(gè)問(wèn)題:節(jié)點(diǎn)1正常維護(hù)需要關(guān)閉,然后在節(jié)點(diǎn)2修改了配置,然后節(jié)點(diǎn)2關(guān)閉,啟動(dòng)節(jié)點(diǎn)1,由于沒(méi)有同步,所以節(jié)點(diǎn)1啟動(dòng)后,它用的仍然是舊的配置文件,這時(shí)就造成配置丟失,這就叫健忘癥。RAC的解決方案是OCR。
1.9 腦裂:節(jié)點(diǎn)間了解彼此的健康狀況是通過(guò)心跳機(jī)制來(lái)實(shí)現(xiàn)的。如果僅僅是心跳出了問(wèn)題,各節(jié)點(diǎn)還正常運(yùn)行,這時(shí)每個(gè)節(jié)點(diǎn)都認(rèn)為其它節(jié)點(diǎn)宕機(jī),自己是集群環(huán)境的唯一健在者自己應(yīng)該獲得集群的控制權(quán),因?yàn)榇鎯?chǔ)是共享的,這意味著數(shù)據(jù)災(zāi)難。這就叫腦裂。RAC解決腦裂的方法是引入Quorum disk,誰(shuí)先得到quorum disk這一票誰(shuí)獲勝,另一個(gè)節(jié)點(diǎn)被踢出集群。
1.10 IO隔離:解決被踢出集群的節(jié)點(diǎn)不能操作共享存儲(chǔ)上的數(shù)據(jù)。
1.11?CRS resource:CRS對(duì)運(yùn)行于其上的應(yīng)用進(jìn)行監(jiān)視,并在發(fā)生異常時(shí)進(jìn)行重啟、切換等干預(yù)手段。這些被CRS監(jiān)控的對(duì)象就叫CRS resource。這些resource是在RAC安裝過(guò)程中自動(dòng)或手動(dòng)創(chuàng)建的,并且注冊(cè)登記到CRS中,以metadata的形式被記錄在OCR磁盤上,這些metadata包括resource的名稱、如何啟動(dòng)、停止、如何檢查健康狀況等配置信息。RAC的CRS resource包括GSD、ONS、VIP、database、instance、listener等。
1.12?oracle clusterware的運(yùn)行環(huán)境由兩個(gè)磁盤文件、若干后臺(tái)進(jìn)程及網(wǎng)絡(luò)元素組成。OCR解決健忘問(wèn)題,OCR位于共享存儲(chǔ)上保存整個(gè)群集的配置,無(wú)論在哪個(gè)節(jié)點(diǎn)修改配置都是修改相同的配置文件。配置信息以“key-value的形式保存其中,10g以前這個(gè)文件叫server manageability repository(SRVM)。OCR的位置記錄在ocr.loc文件中,9i對(duì)應(yīng)的是srvConfig.loc文件。
1.13?能讀寫OCR disk中內(nèi)容的節(jié)點(diǎn)稱OCR master。這個(gè)節(jié)點(diǎn)的OCR process負(fù)責(zé)更新本地和其它節(jié)點(diǎn)的OCR cache。其它節(jié)點(diǎn)想修改OCR需要向本節(jié)點(diǎn)的OCR process提出請(qǐng)求,然后本節(jié)點(diǎn)的process再向OCR master的OCR process提出請(qǐng)求。
1.14 voting disk主要記錄節(jié)點(diǎn)成員狀態(tài),在出現(xiàn)腦裂時(shí),仲裁哪個(gè)partion獲得集群的控制權(quán)。它的位置可以用這個(gè)命令來(lái)查看:$crsctl query css votedisk
1.15?clusterware最重要的三個(gè)后臺(tái)進(jìn)程:CRSD、CSSD、EVMD。在安裝clusterware的最后階段會(huì)要求在每個(gè)節(jié)點(diǎn)執(zhí)行root.sh,目的是在/etc/inittab文件中添加三行使每次系統(tǒng)重啟時(shí),cluseter也會(huì)自動(dòng)啟動(dòng)。EVMD和CRSD兩個(gè)進(jìn)程如果出現(xiàn)異常,系統(tǒng)會(huì)自動(dòng)重啟這兩個(gè)進(jìn)程。如果CSSD出現(xiàn)異常,系統(tǒng)會(huì)立即重啟。
OCSSD進(jìn)程:該進(jìn)程提供CSS(cluster synchronization service)服務(wù),CSS服務(wù)通過(guò)多種心跳機(jī)制實(shí)時(shí)監(jiān)控集群健康狀態(tài),提供腦裂保護(hù)等基礎(chǔ)集群服務(wù)功能。心跳機(jī)制包含兩種:私有網(wǎng)絡(luò)、voting disk。
兩個(gè)心跳都有最大時(shí)延,對(duì)于disk heartbeat,這個(gè)時(shí)延叫IOT,對(duì)于network heartbeat,這個(gè)時(shí)延叫MC,兩個(gè)參數(shù)都是以秒為單位,缺省IOT大于MC。可以通過(guò)以下命令來(lái)查看這兩個(gè)參數(shù):
$crsctl get css disktimeout??????$crsctl get css misscount
另外這個(gè)進(jìn)程還用來(lái)支持ASM instance和RDBMS instance之間的通信。如果在已經(jīng)安裝了ASM的節(jié)點(diǎn)上安裝RAC,會(huì)遇到一個(gè)問(wèn)題,RAC要求節(jié)點(diǎn)只有一個(gè)OCSSD進(jìn)程,并且是運(yùn)行在$CRS_HOME目錄下的。這就需要先停止ASM,并通過(guò)$ORACLE_HOME/bin/localconfig.sh delete刪除之前的inittab條目。
CRSD進(jìn)程:實(shí)現(xiàn)HA的主要進(jìn)程,它所提供的服務(wù)叫CRS(cluster ready service)它監(jiān)控資源,并在資源運(yùn)行異常時(shí)進(jìn)行干預(yù),包括關(guān)閉、重啟進(jìn)程或轉(zhuǎn)移服務(wù)。默認(rèn)情況下,CRS會(huì)自動(dòng)嘗試重啟資源5次,如果還是失敗則放棄嘗試。
EVMD進(jìn)程:負(fù)責(zé)發(fā)布CRS產(chǎn)生的各種事件,這些event可以通過(guò)兩種方式發(fā)布給客戶--ONS和callout script。另外它還負(fù)責(zé)CRSD和CSSD兩個(gè)進(jìn)程間的通信。
RACGIMON進(jìn)程:負(fù)責(zé)檢查數(shù)據(jù)庫(kù)健康狀態(tài),負(fù)責(zé)service的啟動(dòng)、停止、故障轉(zhuǎn)移,這個(gè)進(jìn)程會(huì)建立到數(shù)據(jù)庫(kù)的持久連接,定期檢查SGA中的特定信息,該信息由PMON進(jìn)程定時(shí)更新。
OPROCD進(jìn)程:也叫process monitor daemon。在非linux平臺(tái)且沒(méi)有使用第三方集群軟件時(shí),會(huì)看到這個(gè)進(jìn)程,用來(lái)檢測(cè)節(jié)點(diǎn)的CPU掛起,如果調(diào)度時(shí)間超過(guò)1.5S,會(huì)認(rèn)為CPU工作異常,會(huì)重啟節(jié)點(diǎn)。在linux平臺(tái)上時(shí)候時(shí)利用hangcheck-timer模塊來(lái)實(shí)現(xiàn)IO隔離功能的。
1.16 IP利用的是TCP層超時(shí),VIP利用的是應(yīng)用層的立即響應(yīng)。詳見(jiàn)P94。
1.17 clusterware的日志體系比較復(fù)雜,日志的根目錄在$CRS_HOME/log/[node]
1.18 單實(shí)例下的并發(fā)控制
lock框架包括3個(gè)組件:資源、鎖、排隊(duì)機(jī)制。前兩者是數(shù)據(jù)結(jié)構(gòu),后者是使用算法。
資源:由owner、waiter、converter三個(gè)成員組成,這是3個(gè)指針?lè)謩e指向lock組成的鏈表。
鎖:當(dāng)要訪問(wèn)共享資源時(shí),需要鎖定資源。如果不能獲得資源的訪問(wèn)權(quán),就把lock掛到資源的waiter鏈表中,如果能獲得就掛到lock的owner鏈表中。
排隊(duì)機(jī)制:lock使用的是enqueue的算法即“先入先出隊(duì)列”。如進(jìn)程的鎖定不能滿足,該進(jìn)程的lock structure就被加到waiter鏈表的末端。
waiter和converter排隊(duì)機(jī)制的區(qū)別:如果某個(gè)操作需要先后兩種不同模式的鎖,比如先share mode然后exclusive mode,則進(jìn)程先請(qǐng)求share mode,獲得后的lock structure會(huì)掛在owner上,當(dāng)需要exclusive mode鎖時(shí),進(jìn)程必須先釋放share mode的鎖,然后再次申請(qǐng)exclusive mode的鎖,但是可能無(wú)法立即獲得,這時(shí)這個(gè)請(qǐng)求就會(huì)被掛在converter隊(duì)列下,converter隊(duì)列會(huì)優(yōu)先于waiter隊(duì)列被處理。可以從v$lock看到這些lock信息。
LMODE>0,REQUEST=0???Owner
LMODE=0,REQUEST>0???Waiter(Acquirer)
LMODE>0,REQUEST>0???Converter
對(duì)于粗粒度或數(shù)量有限的資源使用這種機(jī)制還可以,但對(duì)于幾百G的數(shù)據(jù)量,如果每條記錄都分配一個(gè)resourece、lock數(shù)據(jù)結(jié)構(gòu),無(wú)論從內(nèi)存需求還是維護(hù)開(kāi)銷都是一個(gè)噩夢(mèng)。對(duì)于數(shù)據(jù)記錄這種細(xì)粒度資源,oracle使用的是行級(jí)鎖。行級(jí)鎖其實(shí)只是數(shù)據(jù)塊頭、數(shù)據(jù)記錄頭的一些字段,不會(huì)消耗資源。所以它雖然有鎖的功能,但無(wú)鎖的開(kāi)銷。詳見(jiàn)書(shū)的P102。
latch于lock的對(duì)比:latch請(qǐng)求、獲得、釋放等操作是原子操作,一般幾個(gè)硬件指令就可以完成。lock相反。進(jìn)程申請(qǐng)lock沒(méi)有獲得,這個(gè)進(jìn)程會(huì)釋放CPU資源,也就是進(jìn)行上下文切換,整個(gè)過(guò)程較耗資源。如果進(jìn)程申請(qǐng)latch沒(méi)有獲得,進(jìn)程不釋放CPU資源,而是不斷的嘗試請(qǐng)求,只有嘗試了一定次數(shù)之后還不能獲得,才釋放CPU,這就是latch的spin機(jī)制。這時(shí)的表現(xiàn)是:CPU利用率非常高,但吞吐量卻很低。另外latch使用的是搶占機(jī)制,而不是lock使用的排隊(duì)機(jī)制。
1.19 DLM(分布式鎖管理):可以把它想象成一個(gè)仲裁,它記錄著哪個(gè)節(jié)點(diǎn)正在用哪種方式操作哪個(gè)數(shù)據(jù),并負(fù)責(zé)協(xié)調(diào)解決節(jié)點(diǎn)間的競(jìng)爭(zhēng)。DLM在不同的階段有不同的名稱,OPS的叫PCM,RAC的叫cache fusion。
Non-Cache Fusion資源:典型的資源包括sharepool的row cache和library cache內(nèi)容。通過(guò)每個(gè)節(jié)點(diǎn)的LCK0進(jìn)程來(lái)同步。
Cache Fusion資源:buffer cache的數(shù)據(jù)塊。數(shù)據(jù)塊的狀態(tài)可以從v$BH視圖查看。
以上兩種資源可以通過(guò)v$resource_limit來(lái)查看。
1.20 GRD:記錄每個(gè)數(shù)據(jù)塊在集群間的分布圖。每個(gè)實(shí)例SGA中都是部分GRD,所有實(shí)例的GRD構(gòu)成一個(gè)完整的GRD。
1.21 PCM lock:GRD中記錄的是PCM lock信息,這種鎖有3個(gè)屬性:Mode、Role、PI。Role這個(gè)屬性是用來(lái)描述臟數(shù)據(jù)塊在集群間分布狀況的,有l(wèi)ocal和global兩個(gè)取值。有l(wèi)ocal role的實(shí)例可以把數(shù)據(jù)塊寫到磁盤不需要聯(lián)系GRD,由本實(shí)例完成即可。擁有l(wèi)ocal role和X mode的實(shí)例要給其它instance發(fā)送這個(gè)數(shù)據(jù)塊,如果發(fā)送的是和磁盤一致的版本,那么本實(shí)例任然保持local role。如果發(fā)送的是和磁盤不一致的版本,那么本實(shí)例的角色就轉(zhuǎn)換成global,同時(shí)接收方也是global,代表多個(gè)實(shí)例擁有臟數(shù)據(jù)塊版本。擁有g(shù)lobal role的實(shí)例想把數(shù)據(jù)塊寫到磁盤,必須要聯(lián)系GRD,由擁有數(shù)據(jù)塊current版本的實(shí)例完成寫動(dòng)作。
PI: past image,代表著這個(gè)實(shí)例的SGA中是否擁有和磁盤內(nèi)容不一致的版本,以及版本順序,并不是代表這個(gè)節(jié)點(diǎn)是否曾經(jīng)修改過(guò)這個(gè)數(shù)據(jù)塊。PI主要能夠加速crash recovery的恢復(fù)過(guò)程。
AST: DLM使用兩個(gè)隊(duì)列跟蹤所有的lock請(qǐng)求,并用兩個(gè)ASTs(異步中斷或陷阱)來(lái)完成請(qǐng)求的發(fā)送和響應(yīng)。具體的過(guò)程見(jiàn)書(shū)的P120。
1.22 RAC進(jìn)程名稱和進(jìn)程提供的服務(wù)名稱差異很大,不便記憶。造成這種現(xiàn)象是因?yàn)檫M(jìn)程名稱是從OPS時(shí)代延續(xù)下來(lái)的,但是服務(wù)名稱卻已經(jīng)在RAC中重新設(shè)計(jì)并命名。
LMSn:負(fù)責(zé)數(shù)據(jù)塊在實(shí)例間的傳遞,對(duì)應(yīng)的服務(wù)叫GCS(global cache service)。進(jìn)程的數(shù)據(jù)量通過(guò)參數(shù)GCS_SERVER_PROCESSES控制,默認(rèn)是2,取值范圍為:0-9。
LMD: 負(fù)責(zé)在多個(gè)實(shí)例之間協(xié)調(diào)對(duì)數(shù)據(jù)塊的訪問(wèn)順序,保證數(shù)據(jù)的一致性訪問(wèn)。它負(fù)責(zé)提供GES(global enqueue service)服務(wù)。GCS、GES、GRD構(gòu)成RAC最核心的功能:cache fusion。
LCK:負(fù)責(zé)non-cache fusion資源的同步訪問(wèn),每個(gè)實(shí)例有一個(gè)LCK進(jìn)程。
LMON: 各實(shí)例的LMON進(jìn)程會(huì)定期通信,以檢查集群中各節(jié)點(diǎn)的健康狀態(tài),當(dāng)某個(gè)節(jié)點(diǎn)出現(xiàn)故障時(shí),負(fù)責(zé)集群重構(gòu)、GRD恢復(fù)等操作,它提供的服務(wù)叫CGS(cluster group services)。LMON可以和下層的clusterware合作也可以單獨(dú)工作。當(dāng)LMON檢測(cè)到實(shí)例級(jí)別的腦裂時(shí),LMON會(huì)通知下層的clusterware,期待clusterware解決腦裂問(wèn)題,但是RAC并不假設(shè)clusterware肯定能夠解決問(wèn)題,因此,LMON不會(huì)無(wú)盡等待clusterware層的處理結(jié)果。如果發(fā)生等待超時(shí),LMON會(huì)自動(dòng)觸發(fā)IMR(instance membership recovery)IMR功能可以看做是oracle在數(shù)據(jù)庫(kù)層提供的腦裂、IO隔離機(jī)制。LMON主要是借助兩種心跳機(jī)制來(lái)完成健康檢測(cè):1、節(jié)點(diǎn)間的網(wǎng)絡(luò)心跳。2、控制文件的磁盤心跳。每個(gè)節(jié)點(diǎn)的CKPT進(jìn)程每隔3S更新一次控制文件一個(gè)數(shù)據(jù)塊。可以通過(guò)x$kcccp看到這個(gè)動(dòng)作。SQL>select inst_id,cphbt from x$kcccp
DIAG: 監(jiān)控實(shí)例的健康狀態(tài),并在實(shí)例出現(xiàn)運(yùn)行錯(cuò)誤時(shí)收集診斷數(shù)據(jù)記錄到alert.log
GSD: 負(fù)責(zé)從客戶端工具,比如srvctl接收用戶命令,為用戶提供管理接口。
1.23 RAC中的文件。
spfile文件:放在共享存儲(chǔ)
redo thread: 每個(gè)實(shí)例有套redo log,這套redo log叫做一個(gè)redo thread。RAC中每個(gè)實(shí)例要設(shè)置thread參數(shù),該參數(shù)缺省值時(shí)0。如果設(shè)置了這個(gè)參數(shù),則實(shí)例啟動(dòng)時(shí),會(huì)用等于該thread的private redo thread。如果用缺省值,實(shí)例啟動(dòng)會(huì)選擇使用public redo thread,并且該實(shí)例會(huì)以獨(dú)占的方式使用該redo thread。RAC環(huán)境下,redo log group是在整個(gè)數(shù)據(jù)庫(kù)級(jí)別進(jìn)行編號(hào)的,比如實(shí)例1有1,2,3三個(gè)日志組,那么實(shí)例2的日志組就應(yīng)該從4開(kāi)始編號(hào)。
歸檔日志:歸檔日志不必放在共享存儲(chǔ)上,每個(gè)實(shí)例可以在本地存放歸檔日志,但是如果在單個(gè)實(shí)例進(jìn)行備份歸檔日志或進(jìn)行介質(zhì)恢復(fù)操作,又要求這個(gè)節(jié)點(diǎn)能夠訪問(wèn)到所有實(shí)例的歸檔日志。因此RAC環(huán)境下配置歸檔日志有多種選擇:1、NFS。2、實(shí)例間歸檔。3、ASM。常用第二種方法進(jìn)行配置。
undo表空間:每個(gè)實(shí)例都需要一個(gè)單獨(dú)的回滾表空間。
1.24 RAC中的SCN。在單實(shí)例環(huán)境中只有一個(gè)SCN產(chǎn)生器,改變發(fā)生的順序就是SCN的順序。在RAC下,每個(gè)節(jié)點(diǎn)都有自己的SCN發(fā)生器,必須有某種機(jī)制保證這些SCN在時(shí)間排序上的精確。RAC中GCS負(fù)責(zé)維護(hù)全局的SCN產(chǎn)生,缺省用的時(shí)Lamport SCN生成算法。原理如下:節(jié)點(diǎn)間通信內(nèi)容中都攜帶SCN,每個(gè)節(jié)點(diǎn)把接收到的SCN和本機(jī)的SCN比,如果本機(jī)的SCN小,則調(diào)整本機(jī)的SCN和接收到的一致。如果節(jié)點(diǎn)間通信不多,還會(huì)主動(dòng)定期互相通報(bào),因此節(jié)點(diǎn)即使處于idle狀態(tài),還是會(huì)有一些redo log的產(chǎn)生。另外一種算法是廣播算法。原理:每個(gè)commit操作后,節(jié)點(diǎn)向其它節(jié)點(diǎn)廣播SCN,雖然會(huì)對(duì)系統(tǒng)造成負(fù)載,但是確保每個(gè)節(jié)點(diǎn)在commit后都能看到SCN號(hào)。10g RAC就是用的廣播算法,可以在alert.log中看到。
1.25 當(dāng)不同的實(shí)例請(qǐng)求相同的數(shù)據(jù)塊,這個(gè)數(shù)據(jù)塊就需要在實(shí)例間進(jìn)行傳遞。oracle7的OPS中,這種傳遞是通過(guò)磁盤完成的。實(shí)例1必須先把這個(gè)塊寫回磁盤,然后實(shí)例2再?gòu)拇疟P讀取這個(gè)數(shù)據(jù)塊。oracle8i只能傳遞沒(méi)有修改過(guò)的數(shù)據(jù)塊,對(duì)于修改的數(shù)據(jù)塊還是要通過(guò)磁盤傳遞。9i才使用cache fusion通過(guò)私有網(wǎng)絡(luò)傳遞數(shù)據(jù)塊。
1.26 RAC和clusterware的交互。RAC集群和節(jié)點(diǎn)集群是兩個(gè)層次的集群,兩個(gè)集群都有腦裂,IO隔離等問(wèn)題。這兩個(gè)集群有各自的故障檢測(cè)機(jī)制,二者之間的機(jī)制可以有重疊也可以不同。RAC的集群狀態(tài)維護(hù)是由RAC的LMON進(jìn)程提供的,這個(gè)進(jìn)程提供了CGS和NM(node management)兩個(gè)服務(wù)。NM是RAC集群和clusterware集群的通信通道,通過(guò)它把本節(jié)點(diǎn)的資源狀態(tài)登記到本地的clusterware,進(jìn)而由后者提供給其它節(jié)點(diǎn)的clusterware,NM還要從clusterware獲得其它節(jié)點(diǎn)的資源狀態(tài)。
NM組:RAC的每個(gè)實(shí)例的所有進(jìn)程是作為一個(gè)組注冊(cè)到clusterware中的,其中LMON進(jìn)程作為組里的primary member注冊(cè)并獲得Member ID,而其它進(jìn)程作為這個(gè)組的slave Member并以相同的member id注冊(cè)到clusterware。整個(gè)集群的節(jié)點(diǎn)成員信息是通過(guò)一個(gè)位圖來(lái)維護(hù)的,每個(gè)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)bit,0代表節(jié)點(diǎn)down,1代表up,整個(gè)位圖有個(gè)有效/無(wú)效標(biāo)志位。這個(gè)位圖在整個(gè)集群中作為一個(gè)全局資源被永久記錄。當(dāng)有新的節(jié)點(diǎn)加入集群時(shí),該節(jié)點(diǎn)需要讀取該位圖,找到對(duì)應(yīng)的bit,把值從0改變成1,并且把位圖的無(wú)效標(biāo)志位置為1,這時(shí)雖然位圖內(nèi)容是正確的,但狀態(tài)是無(wú)效的,其它節(jié)點(diǎn)發(fā)現(xiàn)這個(gè)狀態(tài)位圖無(wú)效,就會(huì)觸發(fā)集群的重構(gòu),達(dá)到新的穩(wěn)態(tài)后,再把位圖狀態(tài)置為有效,當(dāng)集群完成重構(gòu)后,NM會(huì)把這個(gè)事件傳遞給CGS層,CGS負(fù)責(zé)同步所有節(jié)點(diǎn)間的重構(gòu)。對(duì)于實(shí)例的正常啟動(dòng)和關(guān)閉,該實(shí)例的NM會(huì)向clusterware進(jìn)行注冊(cè)或取消注冊(cè),注冊(cè)過(guò)程中,NM同時(shí)從clusterware獲得集群的其它節(jié)點(diǎn)列表,然后NM通知其它節(jié)點(diǎn)的NM,最后NM事件發(fā)送給CGS層,由CGS層負(fù)責(zé)協(xié)調(diào)整個(gè)集群的組重構(gòu),當(dāng)CGS完成了重構(gòu)之后,再通知GCS,GES進(jìn)行實(shí)例重構(gòu)(GRD層的重構(gòu))。對(duì)于實(shí)例的異常關(guān)閉,clusterware、NM就不會(huì)知道,這時(shí)就需要CGS提供的IMR功能進(jìn)行感知,然后進(jìn)行重構(gòu)。
IMR的重構(gòu)原理:IMR是由CGS提供的重構(gòu)機(jī)制,用于確認(rèn)實(shí)例之間的連通性、快速的排除故障節(jié)點(diǎn)以減少對(duì)數(shù)據(jù)的損害。在這個(gè)過(guò)程中,每個(gè)實(shí)例都需要做出投票,投票的內(nèi)容是它所認(rèn)為的整個(gè)集群現(xiàn)在的狀態(tài),然后由一個(gè)實(shí)例根據(jù)這些投票,重新規(guī)劃出一個(gè)新的集群,并把這個(gè)投票結(jié)果記錄到控制文件,其它實(shí)例讀取這個(gè)結(jié)果,確認(rèn)自己是否還屬于集群,如果不屬于集群,就要自動(dòng)重啟,如果屬于集群則參與重構(gòu)。IMR發(fā)現(xiàn)出現(xiàn)腦裂,即集群中出現(xiàn)兩個(gè)group,這時(shí)IMR會(huì)先通知CM,然后等待CM去解決這個(gè)問(wèn)題,等待時(shí)間是_IMR_SPLITBRAIN_RES_WAIT,缺省600毫秒,超時(shí)后IMR自己執(zhí)行節(jié)點(diǎn)排除。在CGS完成節(jié)點(diǎn)的重構(gòu)后,GCS,GES才進(jìn)行數(shù)據(jù)層面的重構(gòu),也就是crash recovery。
重構(gòu)觸發(fā)類型:1,節(jié)點(diǎn)的加入或離開(kāi),由NM觸發(fā)。2,網(wǎng)絡(luò)心跳異常,超時(shí)時(shí)間默認(rèn)300S,由_cgs_send_timeout參數(shù)控制,由IMR觸發(fā)。3,控制文件心跳異常,超時(shí)時(shí)間默認(rèn)900S,由_controlfile_enqueue_timeout參數(shù)控制,由IMR觸發(fā)。
?
?
2.ASM存儲(chǔ)方案
?
2.1red hat as4以后,裸設(shè)備已經(jīng)被linux社區(qū)拋棄了,而是通過(guò)支持O_DIRECT標(biāo)識(shí)來(lái)繞過(guò)OS緩沖。10gR2缺省就是用O_DIRECT的方式操作設(shè)備的。但是oracle clusterware 10R2的開(kāi)發(fā)沒(méi)能及時(shí)跟上,仍然需要使用裸設(shè)備來(lái)創(chuàng)建voting disk和OCR。
2.2 ASM中的shared pool有extent map,每100GB需要1MB的extent map,根據(jù)這個(gè)空間再加上額外的2MB就可以了,ASM SGA的默認(rèn)值一般能滿足要求。
2.3 ASM實(shí)例比RDBMS多出兩個(gè)進(jìn)程:RBAL和ABRn
RBAL:rebalancer進(jìn)程,負(fù)責(zé)規(guī)劃ASM磁盤組的reblance活動(dòng)。
ABRn:RBAL的子進(jìn)程,數(shù)量上可以有多個(gè)1-9,這組進(jìn)程負(fù)責(zé)真正完成reblance活動(dòng)。
2.4 使用ASM作為存儲(chǔ)的RDBMS實(shí)例,會(huì)多出兩個(gè)進(jìn)程:RBAL和ASMB
RBAL:打開(kāi)每個(gè)磁盤組的所有磁盤和數(shù)據(jù)的rebalance。
ASMB:負(fù)責(zé)與ASM實(shí)例的通信,它先利用diskgroup name從CSS獲得管理改diskgroup的ASM實(shí)例的連接串,然后建立到ASM的持久連接,兩個(gè)實(shí)例通過(guò)這條連接定期交換信息,同時(shí)也是一種心跳機(jī)制。
RDBMS要想使用ASM作為存儲(chǔ),必須在啟動(dòng)時(shí)從ASM實(shí)例獲得extent map,以后發(fā)生磁盤組的維護(hù)操作,ASM實(shí)例還要把extent map的更新信息通知給RDBMS,這兩個(gè)實(shí)例間的信息交互就是通過(guò)ASMB進(jìn)程完成的。因此ASM實(shí)例必須先于數(shù)據(jù)庫(kù)實(shí)例的啟動(dòng)。
O0nn 01-10:這組實(shí)例建立到ASM實(shí)例的連接,某些長(zhǎng)時(shí)間操作比如創(chuàng)建數(shù)據(jù)文件,RDBMS會(huì)通過(guò)這些進(jìn)程向ASM發(fā)送信息。
2.5 ASM實(shí)例運(yùn)行不需要任何文件只是表面現(xiàn)象,其實(shí)ASM也需要很多文件來(lái)保證它的運(yùn)行,只不過(guò)這些文件是oracle內(nèi)部維護(hù)的,對(duì)DBA不可見(jiàn),也不需要DBA的干預(yù)。
2.6 ASM實(shí)例和RDBMS是1:1的關(guān)系,兩個(gè)實(shí)例可以共用一個(gè)$ORACLE_HOME。ASM和RDBMS是1:n的關(guān)系,則最好為ASM安裝單獨(dú)的ASM_HOME,并和RDBMS的ORACLE_HOME區(qū)分開(kāi)來(lái),這種環(huán)境需要使用ASM_HOME下的監(jiān)聽(tīng)器。
2.7 創(chuàng)建ASM磁盤:首先要讓ASM實(shí)例發(fā)現(xiàn)磁盤,另外要讓磁盤分區(qū)的屬主設(shè)成oracle。接下來(lái)就是創(chuàng)建ASM磁盤,ASM可以通過(guò)兩種方式使用磁盤,一是裸設(shè)備方式,二是ASMlib方式(允許在塊設(shè)備上創(chuàng)建ASM,目前oracle只提供了linux下的ASMlib)。
2.8 使用裸設(shè)備。solaris平臺(tái)下,系統(tǒng)同時(shí)提供對(duì)磁盤設(shè)備的字符(c)、塊(b)方式訪問(wèn)。每個(gè)磁盤有兩個(gè)設(shè)備文件名(/dev/dsk/c1t1d1s1;/dev/rdsk/c1t1d1s1),創(chuàng)建ASM直接用這些設(shè)備名就可以了,無(wú)需額外配置裸設(shè)備。AIX也是一樣的道理。linux平臺(tái)比較麻煩,缺省沒(méi)有提供對(duì)磁盤設(shè)備的字符訪問(wèn)方式,必須配置rawdevices服務(wù),把塊設(shè)備綁定到裸設(shè)備才行。這里有三種方式來(lái)配置。只要區(qū)別在于對(duì)oracle用戶權(quán)限處理方法不同。
方式1:#vi /etc/sysconfig/rawdevices 添加裸設(shè)備、塊設(shè)備的綁定條目:/dev/raw/raw30 /dev/sdc1?????/dev/raw/raw31 /dev/sdc2???...??--> #service rawdevices start??--》#chkconfig rawdevices on(系統(tǒng)啟動(dòng)時(shí),自動(dòng)啟動(dòng)rawdevices服務(wù))??--》#service rawdevices status??--》cd /dev/raw;ll(查看裸設(shè)備)??--》#cd /dev/raw;chown oracle:dba raw*??-->在/etc/rc.local或其它腳本中添加改raw設(shè)備屬性的命令。(因?yàn)閞awdevices是以root運(yùn)行的,因此裸設(shè)備缺省的owner是root:root)
方式2:#mknod /oradata/system.dbf c 162 1(這里的162,1分別是major device number,minor device number) --》#chown oracle:dba /oradata/system.dbf??-->#vi /etc/sysconfig/rawdevices
/oradata/system.dbf /dev/sdd7???-->#service rawdevices restart 服務(wù)重啟后會(huì)在/dev/raw目錄下創(chuàng)建出一個(gè)新的裸設(shè)備。
方式3:適合在red hat as4使用,這個(gè)版本是用UDEV來(lái)管理設(shè)備,設(shè)備啟動(dòng)后的屬主可以在文件中配置。前面的步驟跟方式一樣,權(quán)限的修改步驟如下:#vi /etc/udev/permissions.d/50-udev.permissions??找到raw一節(jié),修改成下面內(nèi)容:raw/*:oracle:dba:0660??-->#service rawdevices restart???RHEL5 UDEV的工作方式又發(fā)生了變化,50-udev.permissions 文件被拋棄,而使用rule文件來(lái)配置。
2.9 ASMlib方式。ASMlib是一個(gè)由ORACLE定義接口、由存儲(chǔ)廠商實(shí)現(xiàn)的函數(shù)庫(kù),目前oralce只提供了linux平臺(tái)下的實(shí)現(xiàn)庫(kù)。下載ASMlib時(shí)要選擇和OS內(nèi)核匹配的版本。安裝完成后,配置驅(qū)動(dòng)(#/etc/init.d/oracleasm configure) ,確認(rèn)配置成功(#lsmod |grep asm;cat /proc/filesystem;df -ha)。創(chuàng)建ASM磁盤(#/etc/init.d/oracleasm createdisk VOL1 /dev/sdb1 ...),這時(shí)能在/dev/oracleasm/disks目錄下看到createdisks創(chuàng)建的磁盤VOL1。列出創(chuàng)建好的磁盤(#/etc/init.d/oracleasm listdisks),進(jìn)一步查看每個(gè)ASM磁盤對(duì)應(yīng)的物理設(shè)備(#/etc/init.d/oracleasm querydisk VOL1)。如果是RAC環(huán)境,只需要在一個(gè)節(jié)點(diǎn)上執(zhí)行,其它節(jié)點(diǎn)執(zhí)行這個(gè)命令就可以掃描的磁盤了,#/etc/init.d/oracleasm scandisks。
2.10 如果完全使用裸設(shè)備實(shí)現(xiàn)RAC,配置存儲(chǔ)的時(shí)候有兩點(diǎn)需要注意:1、保證LUN在各節(jié)點(diǎn)上的順序一樣。2、設(shè)備名對(duì)應(yīng)的物理設(shè)備不會(huì)因?yàn)橄到y(tǒng)的重啟發(fā)生變化。比如sda、sdb這類名字,到底是a還是b取決于總線對(duì)硬件的掃描順序。RAC環(huán)境中一個(gè)節(jié)點(diǎn)連著兩套存儲(chǔ),一套是本地,另一套是通過(guò)HBA卡連接的SAN,HBA卡和本地盤的掃描順序決定著這類名字對(duì)應(yīng)的設(shè)備的變化。為了避免這種不一致,要在/etc/mobprobe.conf中添加兩行,強(qiáng)迫掃描本地盤,再掃描HBA。(alias scsi_hostadapter1 aic7xxx???alias scsi_hostadapter2 lpfc)不過(guò)到了RED HAT AS4默認(rèn)就是這種順序了。如果使用ASM就不需要這些配置,ASM磁盤頭會(huì)有metadata信息可以準(zhǔn)確的識(shí)別磁盤。但是磁盤名稱在所有節(jié)點(diǎn)一致仍然是一個(gè)好習(xí)慣。
2.11 major number,minor number。前者找到設(shè)備驅(qū)動(dòng)程序,后者找到設(shè)備具體位置。major number,minor number是預(yù)先分配好的,比如裸設(shè)備的major number是162,SCSI設(shè)備的major number是8。SCSI設(shè)備的minor number=driver*16 + partition number。SCSI設(shè)備的用戶空間名是sd driver partition。linux下SCSI磁盤/dev/sda的partition number是0,代表整個(gè)磁盤,linux每個(gè)磁盤最多有16個(gè)分區(qū),其中分區(qū)4代表整個(gè)擴(kuò)展分區(qū),可用分區(qū)只有15個(gè)。
2.12 配置ASM實(shí)例:先介紹幾個(gè)初始化參數(shù)。ASM_POWER_LIMIT:當(dāng)在磁盤組中添加或刪除磁盤時(shí),磁盤組會(huì)自動(dòng)對(duì)數(shù)據(jù)在新舊磁盤間重新分配,從而實(shí)現(xiàn)分散IO,這個(gè)過(guò)程叫再平衡(rebalance)。取值范圍0-11。0代表不做rebalance,11代表最快的速度做rebalance,也意味著最嚴(yán)重的性能影響。alter diskgroup dg1 add disk 'a' rebalance power 1 (往磁盤組增加一個(gè)磁盤a,并定義rebalance為1。)
ASM_DISKSTRING:定義哪些磁盤可以被ASM使用。使用ASMlib時(shí),需要使用”ORCL:磁盤名“格式。ASM實(shí)例也可以使用SPFILE。
無(wú)論是否在RAC環(huán)境,ASM實(shí)例都需要CSS進(jìn)程,否則會(huì)報(bào)29701的錯(cuò)誤。啟動(dòng)CSS進(jìn)程的命令如下:/oracle/product/10.2.0/db1/bin/localconfig add
創(chuàng)建磁盤組的操作需要連接到ASM實(shí)例中進(jìn)行,記得創(chuàng)建一個(gè)spfile文件。SQL>create diskgroup dg1 external redundancy disk 'ORCL:VOL1','ORCL:VOL2';(創(chuàng)建磁盤組dg1)。
現(xiàn)在RDBMS可以使用ASM的磁盤組了。使用前必須保證ASM實(shí)例已經(jīng)注冊(cè)到Listener,否則需要手工注冊(cè)(SQL>alter system register;)。使用ASM的磁盤組中的磁盤很簡(jiǎn)單(SQL>create tablespace test datafile '+dg1/test.dbf' size 100M;)。RDBMS在運(yùn)行的時(shí)候,ASM實(shí)例是無(wú)法關(guān)閉的,手工關(guān)閉也不可能。
?
?
3.RAC維護(hù)工具集
?
oracle clusterware命令集的分類:
節(jié)點(diǎn)層:olsnodes
網(wǎng)絡(luò)層:oifcfg
集群層:crsctl ocrcheck ocrdump ocrconfig
應(yīng)用層:srvctl onsctl crs_stat
oifcfg的4個(gè)子命令:iflist;getif;setif;delif????舉例:
$oifcfg iflist????--顯示網(wǎng)口列表
$oifcfg getif?????--查看每個(gè)網(wǎng)卡的屬性
$oifcfg getif -global dbp???--查看節(jié)點(diǎn)dbp的global類型的配置
$oifcfg getif -type public??--查看public類型的網(wǎng)卡配置
$oifcfg getif -type cluster_interconnect
$oifcfg setif -global ten@none/10.0.0.1:public???--添加新的網(wǎng)卡,這個(gè)命令并不會(huì)檢查網(wǎng)卡是否真的存在。
$oifcfg delif -global??--刪除接口配置
$oifcfg setif -g global eth0/192.168.12.1:public???--添加接口配置
$oifcfg setif -g global eth1/10.0.0.0:cluster_interconnect
$crsctl check crs???--檢查CRS狀態(tài)
$crsctl check cssd/crsd/evmd????--分別檢查三個(gè)組件的狀態(tài)
CRS進(jìn)程默認(rèn)隨著OS的啟動(dòng)而自動(dòng)啟動(dòng),有時(shí)出于維護(hù)的目的需要停止這個(gè)進(jìn)程,可以用以下命令:
#/oracle/product/oem/crs/bin/crsctl disable/enable crs
這個(gè)命令實(shí)際上是修改了/etc/oracle/scls_scr/dbp/root/crsstart 這個(gè)文件的內(nèi)容。
啟動(dòng)、停止CRS棧:crsctl start/stop crs
$crsctl get query css votedisk???--查看votedisk磁盤的位置。
$crsctl get css misscount???--查看參數(shù)
$crsctl set css miscount 100???--設(shè)置參數(shù)
CRS由CRS、CSS、EVM3個(gè)服務(wù)組成,每個(gè)服務(wù)又是由一系列module組成的。CRSCTL允許對(duì)每個(gè)module進(jìn)行跟蹤,并把跟蹤內(nèi)容記錄到日志中。
$crsctl lsmodules css/crs/evm
#/oracle/product/oem/crs/bin/crsctl debug log css "CSSD:1"???--跟蹤C(jī)SSD模塊。
#more $CRS_HOME/log/dbp/cssd/ocssd.log??--查看跟蹤產(chǎn)生的日志。
維護(hù)votedisk:可以通過(guò)crsctl命令添加votedisk,votedisk使用是的是一種過(guò)半數(shù)的算法,所以添加votedisk應(yīng)該添加兩個(gè)。添加和刪除votedisk的操作比較危險(xiǎn),必須停止數(shù)據(jù)庫(kù)、停止ASM、停止CRS后操作,并且操作時(shí)必須使用-force參數(shù)。舉例如何添加一個(gè)votedisk:
1.#$ORA_CRS_HOME/bin/crsctl add css votedisk /dev/raw/raw1 -force
??#$ORA_CRS_HOME/bin/crsctl add css votedisk /dev/raw/raw2 -force
2.#$ORA_CRS_HOME/bin/crsctl query css votedisk
3.#crsctl start crs??
OCR系列命令:ORACLE會(huì)每4個(gè)小時(shí)對(duì)OCR做一個(gè)備份,并且保留最后3個(gè)備份,以及前一天,前一周的最后一個(gè)備份。這個(gè)備份由master node的CRSD進(jìn)程完成,備份的默認(rèn)位置為:$CRS_HOME/crs/cdata/<cluster_name>目錄下,每次備份后,備份文件名會(huì)自動(dòng)更改,最近一次備份叫backup00.ocr。建議DBA除了保存在本地外,還應(yīng)該在其它地方保存一份。
ocrdump:以ASCII的方式打印出OCR的內(nèi)容,產(chǎn)生的文件只能用于閱讀,不能用于恢復(fù)。
$ocrdump -stdout -keyname SYSTEM.css -xml|more??--把SYSTEM.css鍵的內(nèi)容以.xml格式打印輸出到屏幕。命令的執(zhí)行過(guò)程中,會(huì)在$CRS_HOME/log/<nodename>/client目錄下產(chǎn)生名為ocrdump_<pid>.log的日志文件,如果命令出現(xiàn)執(zhí)行問(wèn)題,可以查看這個(gè)日志。
ocrcheck:用于檢查OCR內(nèi)容的一致性,不需要參數(shù)。這個(gè)命令會(huì)產(chǎn)生ocrcheck_pid.log日志文件。
ocrconfig:用于維護(hù)OCR磁盤,OCR磁盤最多只能有兩個(gè),一個(gè)是primary OCR,另一個(gè)是Mirror OCR。
$ocrconfig -help???--查看命令幫助
$ocrconfig -showbackup??--查看自動(dòng)備份,OCR的自動(dòng)備份在$CRS_HOME/crs/cdata/<cluster_name>目錄ixa,可以通過(guò)ocrconfig -backuploc <directory_name>命令修改到新目錄。
OCR的備份與恢復(fù):oracle推薦在對(duì)集群作調(diào)整時(shí),比如增加、刪除節(jié)點(diǎn)前,應(yīng)該對(duì)OCR做一個(gè)備份。可以使用export備份到指定文件。如果做了replace或restore等操作,oracle建議使用cluvfy comp ocr -n all命令做一次全面檢查。下面舉一個(gè)OCR備份與恢復(fù)的案例:
1.crsctl stop crs
2.ocrconfig -export /oracle/ocr.exp??(注意這里要用root用戶導(dǎo)出)
3.crsctl start crs
4.crsctl check crs
5.dd if=/dev/zero of=/dev/raw/raw1 bs=1024 count=102400??(故意破壞ocr內(nèi)容)
6.ocrcheck???--檢查會(huì)失敗。
7./backup/install_medir/clusterware/cluvfy/runcluvfy.sh comp ocr -n all???--檢查一致性也失敗。
8.ocrconfig -import /oracle/ocr.exp???--恢復(fù)OCR內(nèi)容。
9.再次用剛才的兩個(gè)工具進(jìn)行檢查。
10.crsctl start crs
?
移動(dòng)OCR的位置:(/dev/raw/raw1移到/dev/raw/raw31)
1.ocrconfig -showbackup /??ocrconfig -export /tmp/ocrexp -s online???--查看OCR是否有備份,如果沒(méi)有執(zhí)行一次導(dǎo)出做備份。
2.ocrcheck???/??ocrconfig -replace ocrmirror??/dev/raw/raw21????--查看當(dāng)前OCR的位置,發(fā)現(xiàn)只有一個(gè)primary ocr,沒(méi)有mirror ocr,所以不能直接改變OCR的位置,需要添加鏡像再修改OCR位置。
3.ocrcheck??--驗(yàn)證一下是否添加成功。
4.ocrconfig -replace ocr /dev/raw/raw31???--改變位置。
5.檢查/etc/oracle/ocr.loc文件。系統(tǒng)默認(rèn)會(huì)修改這個(gè)文件,如果沒(méi)有更改,需要手工修改相應(yīng)的條目。
?
crs_stat??--查看CRS維護(hù)的所有資源的運(yùn)行狀態(tài),包括2個(gè)GSD,ONS,VIP,ASM INSTANCE,LISTENER,RDBMS INSTANCE和1個(gè)database。使用-v -p參數(shù)可以獲得更詳細(xì)的信息。 -ls選項(xiàng)可以獲得每個(gè)資源的權(quán)限定義。
?
onsctl??--這個(gè)命令用于管理配置ONS(oracle notification service),ONS是oracle clusterware實(shí)現(xiàn)FAN(fast application notification)Event push模型的基礎(chǔ)。傳統(tǒng)模型中,客戶端需要定期檢索服務(wù)器來(lái)判斷服務(wù)端狀態(tài),本質(zhì)上是一個(gè)PULL模型。10g引入了一種全新的PUSH機(jī)制-FAN,當(dāng)服務(wù)端發(fā)生某些事件時(shí),服務(wù)器會(huì)主動(dòng)的通知客戶端這種變化,這樣客戶端能盡早知道服務(wù)端的變化,而這種機(jī)制就是依賴ONS實(shí)現(xiàn)的。在使用這個(gè)命令之前,需要先配置ONS服務(wù)。
ONS配置內(nèi)容:配置文件在$CRS_HOME/opmn/conf/ons.config,注意這個(gè)文件中的nodes和useocr這兩個(gè)參數(shù)。這兩個(gè)參數(shù)共同決定了本機(jī)ONS daemon要和哪些遠(yuǎn)程節(jié)點(diǎn)上的ONS daemon進(jìn)行通信。如果useocr=ON,說(shuō)明信息保存在OCR中,如果是OFF說(shuō)明信息取nodes中的配置。對(duì)于單實(shí)例而言,要把useocr設(shè)置成OFF。看幾個(gè)配置的例子:
useocr=off
nodes=dbs:6200,dbp:6200
(節(jié)點(diǎn)信息從nodes參數(shù)讀取,本機(jī)的ONS要和這dbs,dbp兩個(gè)節(jié)點(diǎn)上的6200端口通信)
useocr=on
(使用OCR時(shí),這個(gè)信息是保存在DATABASE.ONS_HOSTS這個(gè)鍵下。可以把這個(gè)鍵從OCR導(dǎo)出來(lái):ocrdump -xml abc.xml -keyname DATABASE.ONS_HOSTS)。
可以直接編輯這個(gè)配置文件來(lái)配置ONS,如果使用了OCR則可以通過(guò)racgons命令進(jìn)行配置。舉個(gè)例子:
racgons add_config dbs:6200 dbp:6200??--添加配置
racgons remove_config dbs:6200 dbp:6200??--刪除配置
ONS進(jìn)程運(yùn)行,并不代表ONS正常工作,需要使用ping命令來(lái)確認(rèn)。比如ps -ef|grep ons可以看到ONS進(jìn)程正常運(yùn)行,但onsctl ping看到ons is not running...,啟動(dòng)ONS服務(wù):onsctl start 再次確認(rèn)ONS服務(wù)狀態(tài),已經(jīng)ok。 $onsctl debug??--查看詳細(xì)信息。
?
srvctl --RAC維護(hù)中最常用的命令,也是最復(fù)雜的命令。
查看配置:
$srvctl config database???--顯示在OCR中注冊(cè)的所有數(shù)據(jù)庫(kù)
$srvctl config database -d a??--查看數(shù)據(jù)庫(kù)a的配置
$srvctl config database -d a -a --查看數(shù)據(jù)庫(kù)a更詳細(xì)的配置
$srvctl config nodeapps -n dbs??--返回節(jié)點(diǎn)名、實(shí)例、$ORACLE_HOME
$srvctl config nodeapps -n dbs -a??--查看VIP配置
$srvctl config nodeapps -n dbs -g??--查看GSD
$srvctl config nodeapps -n dbs -s??--查看ONS
$srvctl config nodeapps -n dbs -l??--查看listener
$srvctl config listener -n dbs???--查看監(jiān)聽(tīng)器的名稱
$srvctl config asm -n dbp???--查看ASM實(shí)例名和$ORACLE_HOME
$srvctl config service -d test -a??--查看數(shù)據(jù)庫(kù)的所有service配置
$srvctl add database -d abc -o $ORACLE_HOME??--添加數(shù)據(jù)庫(kù)
$srvctl add instance -d abc -n dbs -i abc2??--添加實(shí)例
$srvctl add service -d abc -s abcservice -r abc1 -a abc2 -P BASIC??--添加服務(wù)
?
配置數(shù)據(jù)庫(kù)隨CRS的啟動(dòng)而自動(dòng)啟動(dòng):
srvctl enable/disable database -d test???--啟動(dòng)/關(guān)閉數(shù)據(jù)庫(kù)的自動(dòng)啟動(dòng)特性
srvctl config database -d test -a??--確認(rèn)配置是否成功
srvctl enable/disable instance -d test -i abc1??--開(kāi)啟/關(guān)閉某個(gè)實(shí)例的自動(dòng)啟動(dòng)
srvctl disable service -d test -s abcservice -i abc1??--禁止服務(wù)在某個(gè)實(shí)例上運(yùn)行
?
$srvctl remove service -d test -s abcservice??--刪除service
$srvctl remove instance -d test -i abc1??--刪除abc1
$srvctl remove database -d test??--刪除數(shù)據(jù)庫(kù)
remove命令刪除的只是對(duì)象在OCR中的定義信息,對(duì)象本身不會(huì)被刪除。
?
$srvctl start database -d test???--啟動(dòng)數(shù)據(jù)庫(kù)。
$srvctl start database -d test -i abc1 -o mount??--啟動(dòng)實(shí)例abc1到mount狀態(tài)。
$srvctl stop instance -d test -i abc1 -o immediate
$srvctl stop instance -d test -i abc1 -o abort
$srvctl start service -d test -s abcservice -i abc1
$srvctl status service -d test -v
?
跟蹤srvctl:10g中跟蹤srvctl,只需要設(shè)置SRVM_TRACE=true這個(gè)OS環(huán)境變量即可,這個(gè)命令的所有函數(shù)調(diào)用會(huì)輸出到屏幕上。
?
一個(gè)恢復(fù)案例(OCR磁盤和votedisk磁盤全部破壞,并且沒(méi)有備份):
1.crsctl stop crs??--停止所有節(jié)點(diǎn)的clusterware stack
2.$CRS_HOME/install/rootdelete.sh???--分別在每個(gè)節(jié)點(diǎn)執(zhí)行這個(gè)腳本。
3.$CRS_HOME/install/rootdeinstall.sh??--只需要在一個(gè)節(jié)點(diǎn)上執(zhí)行即可。
4.$CRS_HOME/root.sh??--在和步驟3同一個(gè)節(jié)點(diǎn)執(zhí)行這個(gè)腳本。
5.$CRS_HOME/root.sh??--在其它節(jié)點(diǎn)執(zhí)行這個(gè)腳本。
6.用netca命令重新配置監(jiān)聽(tīng)器,確認(rèn)注冊(cè)到了clusterware中:crs_stat -t -v
7.srvctl add asm -n dbs -i +ASM1 -o /oracle/product/database
??srvctl add asm -n dbp -i +ASM2 -o /oracle/product/database
8.srvctl start asm -n dbs
??srvctl start asm -n dbp(這里出現(xiàn)了ORA-27550:的錯(cuò)誤,這個(gè)問(wèn)題是因?yàn)镽AC無(wú)法確認(rèn)使用哪個(gè)網(wǎng)卡作為private interconncect,所以可以通過(guò)在兩個(gè)ASM實(shí)例的pile中添加以下參數(shù)解決這個(gè)問(wèn)題。
+ASM1.cluster_interconnects='10.0.0.8'
+ASM2.cluster_interconnects='10.0.0.9'
重啟ASM,問(wèn)題得到解決)
9.srvctl add database -d test -o /oracle/product/database
10.srvctl add instance -d test -i abc1 -n dbs
???srvctl add instance -d test -i abc2 -n dbp
11.srvctl modify instance -d test -i abc1 -s +ASM1???--修改實(shí)例和ASM實(shí)例的依賴關(guān)系
???srvctl modify instance -d test -i abc2 -s +ASM2
12.srvctl start database -d test(啟動(dòng)過(guò)程又出錯(cuò),跟ASM問(wèn)題相同,解決辦法類似,修改database參數(shù)即可,如下:
SQL>alter system set cluster_interconnect='10.0.0.8' scope=spfile sid='abc1';
SQL>alter system set cluster_interconnect='10.0.0.9' scope=spfile sid='abc2';)
srvctl start database -d test??--重啟數(shù)據(jù)庫(kù),操作成功。
?
?
?
4.HA和LB
?
HA=MTTF/(MTTF+MTTR)??MTTF=平均故障間隔時(shí)間???MTTR=平均修復(fù)時(shí)間
10g RAC failover的分類:client-side connect time failover;TAF;service-side TAF
注意:不要在listner.ora中設(shè)置GLOBAL_DB_NAME,這個(gè)參數(shù)會(huì)禁用connect_time failover和transparent application failover
?
client-side connect time failover:用戶端tnsname中配置了多個(gè)地址,用戶發(fā)起連接請(qǐng)求時(shí),先嘗試第一個(gè)地址,如果連接失敗嘗試第二個(gè)地址,直到遍歷所有地址。它的特點(diǎn)是只在發(fā)起連接的時(shí)候才去感知節(jié)點(diǎn)故障,一旦連接建好后,節(jié)點(diǎn)故障不會(huì)處理,客戶端的表現(xiàn)就是會(huì)話斷開(kāi),用戶程序必須重新建立連接。在tnsnames.ora添加FAILOVER=ON條目即可實(shí)現(xiàn)此功能,系統(tǒng)默認(rèn)就能實(shí)現(xiàn)這種功能。
?
TAF:如果某個(gè)實(shí)例發(fā)生故障,連接到這個(gè)實(shí)例上的用戶就會(huì)被自動(dòng)遷移到其它的健康實(shí)例上。遷移對(duì)應(yīng)用程序而言是透明的,但用戶未提交的事務(wù)會(huì)回滾。TAF的配置也很簡(jiǎn)單,只要在tnsnames.ora添加FAILOVER_MODE配置項(xiàng),這個(gè)條目有4個(gè)子項(xiàng)目需要定義。METHOD=BASIC/PRECONNECT??(BASIC:感知節(jié)點(diǎn)故障時(shí)才創(chuàng)建到其它實(shí)例的連接。 PRECONNECT:在最初建立連接時(shí)就同時(shí)建立到所有實(shí)例的連接,這樣切換速度就快)。??TYPE=session/select(session:對(duì)于select語(yǔ)句切換后需要重新執(zhí)行查詢語(yǔ)句。 select:對(duì)于select語(yǔ)句切換后在新的幾點(diǎn)繼續(xù)返回剩下的記錄。兩種方式對(duì)未提交的事務(wù)都自動(dòng)回滾)。
DELAY和RETRIES表示重試間隔時(shí)間和重試次數(shù)。
?
service-side TAF:直接在服務(wù)器上修改配置,無(wú)需修改客戶端的tnsnames.ora文件。它通過(guò)結(jié)合service在數(shù)據(jù)庫(kù)里保存FAIL_MODE的配置,把所有的TAF配置保存在數(shù)據(jù)字典中,省去了客戶端的配置工作。
service-side TAF比TAF多出了一個(gè)instance role,所謂實(shí)例角色,就是有多個(gè)instance參與一個(gè)service時(shí),可以配置優(yōu)先使用哪個(gè)instance為用戶提供服務(wù),用戶共有兩種可選角色:
PREFERRED:首選實(shí)例??AVAILABLE:后備實(shí)例。要想實(shí)現(xiàn)這個(gè)功能必須配置services(DBCA,手工方式(srvctl)都可以配置)。使用srvctl這個(gè)工具時(shí),命令只更新OCR中的配置,不會(huì)更新數(shù)據(jù)字典和監(jiān)聽(tīng)器中的信息,因此還要用dbms_service包來(lái)更新數(shù)據(jù)字典。無(wú)論使用DBCA還是srvctl命令來(lái)配置service,都無(wú)法配置TAF的type、delay、retries3個(gè)屬性。必須使用dbms_services包來(lái)修改這些屬性。10g配置了service-side TAF,客戶端甚至都不需要tnsnames.ora文件。10g提供新連接方法:easy connect naming methods。連接串格式如下:username/password@[//]host[:port][/service_name]
?
oracle clusterware HA框架:這里強(qiáng)調(diào)的是oracle clusterware是一款獨(dú)立的集群件產(chǎn)品,不只是針對(duì)RAC,另外oracle也提供了API,用戶可以進(jìn)行二次開(kāi)發(fā)實(shí)現(xiàn)更豐富的功能。詳見(jiàn)書(shū)的P210。
?
LOADBALANCE:10g RAC提供兩種手段實(shí)現(xiàn)分散負(fù)載:純技術(shù)的分散負(fù)載;面向業(yè)務(wù)的的分散負(fù)載。
純技術(shù)的分散負(fù)載有兩種實(shí)現(xiàn)方法:客戶端均衡;服務(wù)器端均衡
客戶端均衡:oracle8實(shí)現(xiàn)的方法,使用隨機(jī)算法把連接請(qǐng)求分散到各個(gè)實(shí)例,這種分配方法沒(méi)有考慮每個(gè)節(jié)點(diǎn)的真實(shí)負(fù)載。
服務(wù)器端均衡:oracle9引進(jìn)的方法。負(fù)載均衡的實(shí)現(xiàn)依賴于listener收集的負(fù)載信息,PMON進(jìn)程會(huì)收集系統(tǒng)的負(fù)載信息,然后登記到listener中,最少1分鐘,最多10分鐘PMON要做一次更新,節(jié)點(diǎn)負(fù)載越高,更新頻率越高。如果listener關(guān)閉,PMON會(huì)每隔1秒鐘檢查listener是否重啟。除了自動(dòng)定時(shí)更新任務(wù)外,用戶也可以使用alter system register命令手工進(jìn)行這個(gè)過(guò)程。整個(gè)過(guò)程可以在listener日志看到。我們也可以使用1025事件跟蹤PMON進(jìn)程,來(lái)查看注冊(cè)的內(nèi)容。PMON不僅會(huì)向本地注冊(cè),還可以向其它節(jié)點(diǎn)上的listener注冊(cè),但到底向何處注冊(cè),是由remote_listeners決定的,參數(shù)值是一個(gè)tnsnames項(xiàng)。
客戶端均衡和服務(wù)器端均衡不是互拆的,兩者可以一起工作。配置LB時(shí)有點(diǎn)需要注意:需要將各個(gè)實(shí)例的listener.ora文件中去掉缺省產(chǎn)生的sid_list_listener_name條目,這樣才能保證listener獲得的信息都是動(dòng)態(tài)注冊(cè)的,而不是從文件中讀取的靜態(tài)信息。
?
利用service分散負(fù)載:通過(guò)把應(yīng)用按照功能模塊進(jìn)行劃分成service,進(jìn)而把每個(gè)service固定在某些RAC節(jié)點(diǎn)上。(cache fusion減少了)
?
?
?
5.備份
?
flash recovery area:閃回恢復(fù)區(qū)可以集中存放所有與恢復(fù)有關(guān)的文件,這些文件包括以下幾類:
控制文件(創(chuàng)建db時(shí)使用了閃回恢復(fù)區(qū),會(huì)自動(dòng)在這里創(chuàng)建一個(gè)控制文件的copy)
控制文件和spfile的自動(dòng)備份
備份集backup set文件
image copy文件
歸檔日志,log_archive_dest_10會(huì)自動(dòng)指向flash recovery area
閃回日志(閃回?cái)?shù)據(jù)庫(kù)需要這種功能)
10g中的閃回功能家族中,只有閃回?cái)?shù)據(jù)庫(kù)和閃回恢復(fù)區(qū)有關(guān)系(閃回日志必須放在閃回恢復(fù)區(qū)),其它的沒(méi)有直接關(guān)系。
10g中的v$logfile,v$control_file,v$datafile_copy,v$backup_piece,v$archived_log 這些視圖中也增加了
is_reconvery_dest_file列,代表該文件是否放在recovery area中。
RMAN>select name,is_recovery_dest_file from v$archived_log;
?
配置閃回區(qū):RAC環(huán)境下的配置,要保證每個(gè)節(jié)點(diǎn)的配置值都相同。可以在線修改,立即生效:
SQL>alter system set db_recovery_file_dest='+DISKA' scope=both;
SQL>alter system set db_recover-y_file_dest_size='5g' scope=both sid='*';
使用ASM作為閃回區(qū),只能指定到diskgroup級(jí)別,而不能指定到目錄,ASM存儲(chǔ)管理是采用OMF方式,每個(gè)數(shù)據(jù)庫(kù)會(huì)被分配到指定目錄diskgroup/instance_name。
?
閃回區(qū)的監(jiān)控:當(dāng)空間使用率達(dá)到90%,會(huì)自動(dòng)觸發(fā)刪除,如果沒(méi)有空間可以釋放,并且使用空間超過(guò)85%,會(huì)記錄一條warning日志,如果超過(guò)97%會(huì)記錄一條critical warning日志,這些日志內(nèi)容可以從DBA_OUTSTANDING_ALERTS視圖查看。閃回區(qū)的使用情況可以通過(guò)v$recovery_file_dest來(lái)進(jìn)行監(jiān)控。
?
RMAN使用方法:
1.批處理方法:把命令寫入文本文件。cat back
run {
backup database;
}
通過(guò)cmdfile指定命令文件,使用log指定日志文件:
$rman target / cmdfile=back log=back.log
?
2.腳本方式:需要恢復(fù)目錄,腳本分local和global兩種。
local:連接到target db和catalog db
RMAN>create script full_bakcup
{
backup database plus archivelog
delete obsolete;
}
?
global:需要用global關(guān)鍵字
RMAN>create global script global_full_backup
{
backup database plus archivelog;
delete obsolete;
}
?
使用腳本: RMAN>run { execute script full_bakcup;}
?
備份格式:image copy只能在磁盤上進(jìn)行,backup set是一種壓縮格式,RMAN能跳過(guò)空數(shù)據(jù)塊,備份的時(shí)候還可以額外壓縮,但image copy比backup set的restore速度快,盡管它占用較多的空間。
RMAN的備份保留策略: RMAN>configure retention policy to recovery window of 7 days;
????????????????????RMAN>configure retention policy to redundancy 2;
RMAN>report obsolete;
RMAN>report obsolete recovery window of 7 days;
RMAN>report obsolete redundancy 2;
RMAN>show retention policy;
RMAN>delete obsolete;
RMAN>delete obsolete redundancy 2;
RMAN>delete obsolete recovery window of 4 days;
RMAN>configure retention policy to none;
?
RMAN只能對(duì)數(shù)據(jù)文件進(jìn)行增量備份,控制文件、日志文件不能增量備份。增量備份能夠捕獲nologging操作的數(shù)據(jù)變化,而這些操作不會(huì)被記錄到日志上。
backup as copy db_file_name_convert=('+data/wxxrzxm','/backup/test') database;???--路徑的轉(zhuǎn)變。
如果想把ASM上的數(shù)據(jù)文件備份到ASM上,上述方法可能會(huì)出錯(cuò),因?yàn)锳SM是使用OMF方式管理數(shù)據(jù)文件的。
?
增量備份:oracle10g只允許0和1兩級(jí)了,0級(jí)相當(dāng)于全備,但不能作為0級(jí)使用。
種類:RMAN>backup incremental level 1 database;???--差異增量
??????RMAN>backup incremental level 1 cumulative database;??--累加增量
舉個(gè)例子:
RMAN>run {
?????backup as copy db_file_name_convert=('+DATA/wxxrzm','/backup/test') incremental level 0 database tag 'full_backup';
????}
RMAN>run {
?????backup incremental level 1 CUMULATIVE for recover of copy with tag 'full_backup' database;
?????recover copy of database with tag 'full_backup';
?????}
增量備份為了獲得要備份的數(shù)據(jù)塊,必須對(duì)數(shù)據(jù)文件中的所有數(shù)據(jù)塊進(jìn)行遍歷,效率不高。因此oracle提供了一個(gè)特殊的文件叫block change tracking file,每當(dāng)數(shù)據(jù)塊發(fā)生變化時(shí),相關(guān)信息同時(shí)記錄到這個(gè)文件中。
SQL>alter database enable/disable block change tracking;???--啟用關(guān)閉該功能。
SQL>select * from v$block_change_tracking;??--查看文件的位置。
SQL>alter database enable block change tracking using file 'path'???--手工指定文件位置。
啟用這個(gè)特征后oracle會(huì)啟動(dòng)一個(gè)ctwr進(jìn)程,它負(fù)責(zé)跟蹤數(shù)據(jù)變化。
?
RMAN>backup duration 2:00 database;??--希望在2小時(shí)內(nèi)完成備份,如果無(wú)法完成,整個(gè)任務(wù)都會(huì)出錯(cuò)返回,產(chǎn)生的備份文件也不可用。
RMAN>backup duration 2:00 partial database filesperset 1;??--保證產(chǎn)生的每個(gè)備份文件都對(duì)應(yīng)一個(gè)數(shù)據(jù)文件。完成的備份保留。
RMAN>backup duration 0:01 minimize load database;
RMAN>backup duration 0:01 minimize time database;
?
恢復(fù)命令:10G,restore命令增加了一個(gè)preview子命令。舉例如下:
$rman / target
RMAN>spool log to test.log
RMAN>restore datafile 1 preview;
RMAN>restore database preview summary;
RMAN>spool log off;
?
RMAN>list backup;
RMAN>list copy;
RMAN>crosscheck copy;
RMAN>delete expired copy;??--list顯示的信息是從控制文件獲得,如果用rm命令刪除copy這個(gè)動(dòng)作不會(huì)同步到控制文件,這會(huì)造成不一致。
?
v$rman_output:查看每個(gè)備份任務(wù)的日志。??v$rman_status:查看備份任務(wù)的完成情況。
?
RAC的備份:RAC的備份與單實(shí)例備份有兩點(diǎn)需要注意:1.RMAN連接集群中的某個(gè)實(shí)例即可。 2.備份歸檔時(shí),必須保證在備份實(shí)例上能夠訪問(wèn)所有實(shí)例的歸檔日志,否則會(huì)報(bào)錯(cuò)。
SQL>alter system set log_archive_dest_state_2=defer scope=both sid='*';
注意10g里增加的新參數(shù)log_archive_local_first參數(shù),10g以前本地和遠(yuǎn)程的歸檔都完成后,聯(lián)機(jī)日志文件才能被重用。這個(gè)參數(shù)設(shè)置為true后,oracle先進(jìn)行本地歸檔,然后同時(shí)遠(yuǎn)程傳遞和使用聯(lián)機(jī)日志。
?
?
?
6.恢復(fù)
?
修改數(shù)據(jù)塊之前,代表本次修改操作的redo記錄必須先要被保存下來(lái),然后才能修改數(shù)據(jù)記錄。舊的日志被覆蓋前需要完成兩件事:1,檢查點(diǎn)必須完成。2,完成歸檔。
SCN的種類:系統(tǒng)檢查點(diǎn)SCN--記錄在控制文件中(v$database可以看到)。??數(shù)據(jù)文件檢查點(diǎn)SCN--記錄在控制文件中(v$datafile)。 數(shù)據(jù)文件的啟動(dòng)、終止SCN--數(shù)據(jù)文件頭記錄啟動(dòng)scn(v$datafile_header),控制文件記錄數(shù)據(jù)文件的終止scn。這兩個(gè)SCN用來(lái)確認(rèn)數(shù)據(jù)文件是否需要恢復(fù)。數(shù)據(jù)庫(kù)運(yùn)行中,所有數(shù)據(jù)文件的終止SCN都是null,正常關(guān)閉數(shù)據(jù)庫(kù)后數(shù)據(jù)文件的終止scn會(huì)被設(shè)置成啟動(dòng)scn,異常關(guān)閉數(shù)據(jù)庫(kù)后,終止scn來(lái)不及修改還是null。
每個(gè)實(shí)例對(duì)應(yīng)的聯(lián)機(jī)日志就是一個(gè)redo thread。rac環(huán)境下每個(gè)實(shí)例都需要自己的聯(lián)機(jī)日志,也就是每個(gè)實(shí)例都有自己的redo thread,所以在rac下添加日志時(shí)必須指定線程號(hào):
SQL>alter database add logfile thread 1 group 5('/oracle/oradata/redo5') size 50m;
日志切換觸發(fā)檢查點(diǎn),檢查點(diǎn)啟動(dòng)DBWR把data buffer cache中的dirty block寫入磁盤,當(dāng)該聯(lián)機(jī)日志所覆蓋的操作都被同步到數(shù)據(jù)時(shí),這個(gè)聯(lián)機(jī)日志文件就可以被重用了。但是dirty blcok在磁盤上不是連續(xù)分布的,所以日志切換要等待DBWR寫完,這就會(huì)導(dǎo)致用戶進(jìn)程必須長(zhǎng)時(shí)間的等待。oracle 8開(kāi)始出現(xiàn)了增量檢查點(diǎn)的算法。執(zhí)行檢查點(diǎn)時(shí),只在控制文件中記錄當(dāng)時(shí)的檢查點(diǎn)SCN,然后DBWR在后臺(tái)進(jìn)程進(jìn)行寫操作,每隔3s,DBWR會(huì)在控制文件中更新checkpoint progress record,代表工作進(jìn)展情況,而用戶進(jìn)程繼續(xù)前臺(tái)操作,不受DBWR的影響。
記住RAC下的聯(lián)機(jī)日志必須放在共享存儲(chǔ)上,因?yàn)榛謴?fù)時(shí)必須把所有實(shí)例的聯(lián)機(jī)日志都合并,把redo log record按照SCN排序。
crash recovery:RAC下某個(gè)實(shí)例發(fā)生了crash后在其它實(shí)例上進(jìn)行的recovery。在執(zhí)行crash recovery時(shí),故障節(jié)點(diǎn)被IO fencing,即故障節(jié)點(diǎn)不能對(duì)共享數(shù)據(jù)進(jìn)行操作。
PCM-lock:用來(lái)描述數(shù)據(jù)塊的buffer copy在不同實(shí)例間的分布情況。它有三個(gè)屬性:MODE,ROLE,PAST IMAGE。具體參見(jiàn)書(shū)的P270。可以根據(jù)其它節(jié)點(diǎn)上的PCM-lock推斷出哪些數(shù)據(jù)塊需要恢復(fù)。關(guān)于crash recovery的過(guò)程詳見(jiàn)p273。
online block recovery:某個(gè)用戶進(jìn)程修改數(shù)據(jù)時(shí)異常死掉,導(dǎo)致data buffer數(shù)據(jù)不一致,這時(shí)就會(huì)觸發(fā)online block recovery動(dòng)作。這個(gè)動(dòng)作找到一個(gè)恢復(fù)起點(diǎn)(最近的past image)應(yīng)用聯(lián)機(jī)日志進(jìn)行恢復(fù)。
?
完全恢復(fù)的一個(gè)特殊案例:數(shù)據(jù)結(jié)構(gòu)改變后的恢復(fù)
先做一個(gè)全備份,然后添加一個(gè)數(shù)據(jù)文件,并創(chuàng)建一個(gè)表空間,同時(shí)增加一些數(shù)據(jù)。--》關(guān)閉數(shù)據(jù)庫(kù),模擬災(zāi)難。刪除剛才新建的數(shù)據(jù)文件。--》啟動(dòng)數(shù)據(jù)庫(kù),因?yàn)閯h除的數(shù)據(jù)文件沒(méi)有備份,所以restore,recover的方法都不行。 --》只能用alter database create datafile重建數(shù)據(jù)文件(無(wú)需指定數(shù)據(jù)文件所屬的表空間,也不用指定數(shù)據(jù)文件大小,因?yàn)檫@些屬性在控制文件都有記錄) --》在ASM里要注意,你指定建的數(shù)據(jù)文件名可能跟控制文件記錄的數(shù)據(jù)文件名不同。這時(shí)需要將控制文件記錄的數(shù)據(jù)文件名rename成ASM里記錄的數(shù)據(jù)文件名。SQL>alter database rename file '' to ''??-->再次recover datafile就可以了。
?
ASM也可以像目錄一樣操作:
$export ORACLE_SID=+ASM1
$asmcmd -p
ASMCMD[+] >cd +DATA2/DB/controlfile/
>ls
>rm ...
?
不完全恢復(fù)的一個(gè)案例:
1.RMAN>backup database;???--先做一個(gè)全備份。
2.abort數(shù)據(jù)庫(kù),進(jìn)ASM刪除數(shù)據(jù)文件、聯(lián)機(jī)日志、控制文件。
3.SQL>startup nomount;
4.RMAN>restore controlfile from '自動(dòng)備份‘
5.RMAN>sql 'alter database mount';
6.RMAN>restore database;??--恢復(fù)過(guò)程中,數(shù)據(jù)文件被自動(dòng)改名,并且改動(dòng)被同步到控制文件中。
7.確定恢復(fù)終點(diǎn)。控制文件記錄的歸檔文件(v$archived_log)和磁盤上的歸檔文件數(shù)量不一樣,有4個(gè)文件時(shí)備份之后產(chǎn)生的。
8.RMAN>catalog archivelog '歸檔’;???--將備份后產(chǎn)生的歸檔登記到控制文件。
9.SQL>recover database using backup controlfile until cancel;??--執(zhí)行不完全恢復(fù)。如果使用RMAN工具,需要使用set until提前指定恢復(fù)終點(diǎn):
RMAN>run {
set until sequence 64 thread 2;
restore database;
recover database;
}
10.RMAN>sql 'alter database open resetlogs';
11.$srvctl start database -d test???--打開(kāi)其它實(shí)例。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/SuperXJ/p/3550290.html
總結(jié)
以上是生活随笔為你收集整理的oracle rac理解和用途扩展的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PSFTP用法
- 下一篇: 基于单片机的人体心率脉搏检测系统