概述Oracle有很多相關(guān)的后臺(tái)進(jìn)程,如LGWR、DBWn、CKPT、SMON、PMON、ARCn、RECO等,那么這些進(jìn)程主要是做什么呢?什么時(shí)候又會(huì)觸發(fā)這些進(jìn)程呢? Oracle進(jìn)程● 系統(tǒng)監(jiān)控進(jìn)程(SMON) ,主要任務(wù)是實(shí)例啟動(dòng)時(shí)執(zhí)行恢復(fù)性工作,對(duì)有故障數(shù)據(jù)庫(kù)實(shí)例進(jìn)行恢復(fù)。 ● 進(jìn)程監(jiān)控進(jìn)程(PMON) ,主要任務(wù)用于恢復(fù)失敗的用戶(hù)進(jìn)程。 ● 數(shù)據(jù)庫(kù)寫(xiě)入進(jìn)程(DBWn) ,將修改后的數(shù)據(jù)塊內(nèi)容寫(xiě)回?cái)?shù)據(jù)文件。 ● 日志寫(xiě)入進(jìn)程(LGWR) ,將內(nèi)存中的日志內(nèi)容寫(xiě)入日志文件。 ● 檢查點(diǎn)進(jìn)程(CKPT) ,啟動(dòng)檢查點(diǎn),用于減少數(shù)據(jù)庫(kù)實(shí)例恢復(fù)所需要的時(shí)間。 ● 歸檔進(jìn)程(ARCn) ,當(dāng)數(shù)據(jù)庫(kù)服務(wù)器以歸檔方式運(yùn)行時(shí)調(diào)用該進(jìn)程完成日志歸檔。 ● 恢復(fù)進(jìn)程(RECO) ,用于分布式數(shù)據(jù)庫(kù)中的失敗處理。 ● 鎖進(jìn)程(LCKn) ,在并行服務(wù)器模式下確保數(shù)據(jù)的一致性。 ● 調(diào)度進(jìn)程(Dnnn) ,負(fù)責(zé)把用戶(hù)進(jìn)程分配到可用的服務(wù)進(jìn)程進(jìn)行處理。 LGWR(重做日志緩沖區(qū)--》日志文件)當(dāng)運(yùn)行 DML 或 DDL 語(yǔ)句時(shí),服務(wù)器進(jìn)程首先要將事務(wù)的變化記載到重做日志緩沖區(qū),然后才會(huì)寫(xiě)入數(shù)據(jù)高速緩沖區(qū),并且重做日志緩沖區(qū)的內(nèi)容將會(huì)被寫(xiě)入聯(lián)機(jī)重做日志文件,以避免系統(tǒng)出現(xiàn)意外帶來(lái)的數(shù)據(jù)損失(如果操作系統(tǒng)斷電,內(nèi)存中的重做日志緩沖區(qū)的內(nèi)容會(huì)丟失,而存在磁盤(pán)上的聯(lián)機(jī)日志文件則不會(huì)丟失) ,這項(xiàng)任務(wù)由 LGWR 來(lái)完成。 在出現(xiàn)以下情況時(shí) LGWR 會(huì)開(kāi)始工作: ● 在 DWBR 進(jìn)程將臟緩沖區(qū)寫(xiě)入數(shù)據(jù)文件之前。
//預(yù)寫(xiě)協(xié)議
● 在重做日志記錄達(dá)到緩沖區(qū)的三分之一。
● 日志緩沖區(qū)記錄的日志多于 1M。
● 每隔 3 秒鐘。
//重做日志緩沖區(qū)是循環(huán)使用的,要騰出足夠的空間給新的記錄使用
● 提交事務(wù)(執(zhí)行 Commit) 。
//提交事務(wù)相當(dāng)于確定保存修改,不存入日志文件就有丟失的可能
Oracle 總是先記載數(shù)據(jù)變化到重做日志緩沖區(qū),然后才修改數(shù)據(jù)高速緩存。與之類(lèi)似,在后臺(tái)進(jìn)程 DBWn 將臟緩沖區(qū)寫(xiě)入到數(shù)據(jù)文件之前, 首先要由后臺(tái)進(jìn)程 LGWR 將重做日志緩沖區(qū)寫(xiě)入到重做日志中。與數(shù)據(jù)高速緩存相比,重做日志緩沖區(qū)相對(duì)要小得多,但寫(xiě)入頻率高的多,Oracle 必須要確保重做日志緩沖區(qū)總有足夠的空間容納新事務(wù),因此每隔 3 秒鐘或重做日志緩沖區(qū)已有三分之一填滿(mǎn)時(shí) LGWR 會(huì)自動(dòng)工作。 另外,Oracle 采用了快速提交機(jī)制,當(dāng)執(zhí)行 COMMIT 操作時(shí),并不是將“臟緩沖區(qū)”數(shù)據(jù)寫(xiě)入到數(shù)據(jù)文件中,而是將重做日志緩沖區(qū)的內(nèi)容寫(xiě)入到重做日志文件中,以確保數(shù)據(jù)庫(kù)完整性。此時(shí)即使系統(tǒng)出現(xiàn)意外情況(如掉電、系統(tǒng)崩潰等) ,因?yàn)楸惶峤皇聞?wù)已經(jīng)記載到了存放在磁盤(pán)上的聯(lián)機(jī)重做日志文件中,將來(lái)在重新啟動(dòng)數(shù)據(jù)庫(kù)時(shí)系統(tǒng)會(huì)自動(dòng)進(jìn)行實(shí)例恢復(fù),并將事務(wù)所修改數(shù)據(jù)寫(xiě)入到數(shù)據(jù)文件中,從而避免了數(shù)據(jù)丟失。 DBWn(數(shù)據(jù)庫(kù)高速緩沖區(qū)--》數(shù)據(jù)文件)一個(gè)數(shù)據(jù)庫(kù)寫(xiě)進(jìn)程( DBW0 )適用于大多數(shù)系統(tǒng),但數(shù)據(jù)庫(kù)管理員可以配置額外的進(jìn)程(DBW0-DBW9,最多 10 個(gè)進(jìn)程) ,以提高寫(xiě)入性能,通過(guò)設(shè)置初始化參數(shù)DB_WRITER_PROCESSES 來(lái)完成。 當(dāng)數(shù)據(jù)庫(kù)高速緩沖區(qū)的塊被修改,它被標(biāo)記為臟緩沖區(qū)并添加到以 SCN(System Change Number,系統(tǒng)更改號(hào),這里可以看做“時(shí)間”)為順序的 LRUW(LRUWriter)列表。 在出現(xiàn)以下情況時(shí) DBWn 進(jìn)程會(huì)開(kāi)始工作: ● 系統(tǒng)發(fā)出檢查點(diǎn)指令。 //同步數(shù)據(jù),詳見(jiàn)檢查點(diǎn)進(jìn)程(CKPT) 。 ● 臟緩沖區(qū)個(gè)數(shù)達(dá)到指定閥值。 ● 服務(wù)進(jìn)程搜索一定數(shù)目的數(shù)據(jù)塊后,不能找到自由緩沖區(qū)。 ● 數(shù)據(jù)寫(xiě)入計(jì)時(shí)時(shí)間到。 //客戶(hù)端執(zhí)行 SELECT\INSERT\UPDATE\DELETE 語(yǔ)句時(shí),都需要訪問(wèn)數(shù)據(jù)庫(kù)高速緩沖區(qū)。如果是第一次訪問(wèn),必須要將數(shù)據(jù)由數(shù)據(jù)文件讀取到數(shù)據(jù)庫(kù)高速緩沖區(qū),所以 Oracle 必須要確保數(shù)據(jù)高速緩存總是存在足夠的“自由緩沖區(qū)”以容納新數(shù)據(jù)。當(dāng) DBWn 進(jìn)程將臟緩沖區(qū)的數(shù)據(jù)塊寫(xiě)入到數(shù)據(jù)文件后,Oracle 將把“臟緩沖區(qū)”標(biāo)記為“自由緩沖區(qū)” 。 因此,為了保證有足夠“自由緩沖區(qū)”來(lái)存放新的數(shù)據(jù)塊,需要 DBWn 進(jìn)程工作。 ● 表空間脫機(jī)或進(jìn)入只讀狀態(tài)。 ● 執(zhí)行刪除或截?cái)啾聿僮鳌?● 執(zhí)行 ALTER TABLESPACE … BEGIN BACKUP 命令 //需要同步數(shù)據(jù),原理同檢查點(diǎn) CKPT(識(shí)別SCN,同步所有數(shù)據(jù)文件、控制文件和重做日志文件)Oracle 數(shù)據(jù)庫(kù)在執(zhí)行涉及數(shù)據(jù)變化的語(yǔ)句時(shí),會(huì)針對(duì)任何修改生成一個(gè)順序遞增 SCN值,并且會(huì)將 SCN 值連同事務(wù)的變化一起記載到重做日志緩沖區(qū)。在數(shù)據(jù)文件、控制文件頭部以及重做日志文件中都記載有該值。Oracle 通過(guò)比較各種文件的 SCN 值,確定文件是否損壞、系統(tǒng)是否異常,最終確定系統(tǒng)是需要進(jìn)行實(shí)例恢復(fù)還是介質(zhì)恢復(fù)。在發(fā)出檢查點(diǎn)時(shí),數(shù)據(jù)文件、控制文件和重做日志的 SCN 值完全一致。 進(jìn)程 CKPT 在以下情況下會(huì)開(kāi)始工作: ● 發(fā)生日志切換。
● 關(guān)閉實(shí)例(SHUTDOWN ABORT 除外)。
● 手工執(zhí)行檢查點(diǎn)操作。
● 由初始化參數(shù) LOG_CHECKPOINT_INTERVAL 和LOG_CHECKPOINT_TIMEOUT 強(qiáng)制發(fā)出。
假設(shè)現(xiàn)在有一張員工工資表, 員工號(hào) 7899 的員工張三工資為 8000, 由于工作表現(xiàn)良好,現(xiàn)在為其加薪到 10000。 1> 此時(shí),第一次讀取,需要將數(shù)據(jù)從數(shù)據(jù)文件讀入數(shù)據(jù)庫(kù)高速緩沖區(qū)。 2> 數(shù)據(jù)讀入數(shù)據(jù)庫(kù)高速緩沖區(qū)后,我們修改數(shù)據(jù)的條目先記錄入重做日志緩沖區(qū): 3> 接著新數(shù)據(jù)被寫(xiě)入數(shù)據(jù)庫(kù)高速緩沖區(qū) 4> 提交,LGWR 進(jìn)程將條目從重做日志緩沖區(qū)寫(xiě)入聯(lián)機(jī)重做日志文件 5> 執(zhí)行檢查點(diǎn) CKPT,同步數(shù)據(jù)庫(kù) 發(fā)現(xiàn)聯(lián)機(jī)日志文件為最新,同步更新數(shù)據(jù)文件、控制文件,觸發(fā)了 DBWn 進(jìn)程。 SMON(重做日志文件--》數(shù)據(jù)庫(kù)高速緩沖區(qū))在實(shí)例啟動(dòng)時(shí),如果上一次數(shù)據(jù)庫(kù)是非正常關(guān)閉,并且重做日志文件和控制文件的 SCN 值是不同的,Oracle 將自動(dòng)在重新打開(kāi)數(shù)據(jù)庫(kù)之前,通過(guò)執(zhí)行重做日志文件的記錄,來(lái)同步所有數(shù)據(jù)文件、控制文件和重做日志文件,確保所有數(shù)據(jù)庫(kù)文件的一致性,然后才打開(kāi)數(shù)據(jù)庫(kù)。 系統(tǒng)掉電,導(dǎo)致內(nèi)存中的數(shù)據(jù)(數(shù)據(jù)庫(kù)高速緩沖區(qū))的數(shù)據(jù)丟失。那么自然上例中的第五步無(wú)法完成(無(wú)法從數(shù)據(jù)庫(kù)高速緩沖區(qū)寫(xiě)入數(shù)據(jù)文件) ,但是由于此時(shí)已寫(xiě)入聯(lián)機(jī)日志文件。因此,此時(shí)數(shù)據(jù)將從聯(lián)機(jī)日志文件中更新,而更新的數(shù)據(jù)量是多少,自然就是由 SCN 決定。 這一過(guò)程我們成為“實(shí)例恢復(fù)” 。該過(guò)程不需要數(shù)據(jù)庫(kù)管理員手工干預(yù),由 SMON 進(jìn)程自動(dòng)完成。 該進(jìn)程還負(fù)責(zé)在啟動(dòng)實(shí)例時(shí)清理臨時(shí)段和合并區(qū)(Extent)碎片等工作。所以 SMON進(jìn)程的工作歸納如下: ● 進(jìn)行實(shí)例恢復(fù) ● 合并數(shù)據(jù)文件的自由空間 ● 釋放數(shù)據(jù)文件的臨時(shí)段 PMON(對(duì)失敗的用戶(hù)進(jìn)程或服務(wù)進(jìn)程進(jìn)行恢復(fù),回收內(nèi)存,回滾沒(méi)有完成的事務(wù))當(dāng) PMON 檢測(cè)到用戶(hù)進(jìn)程失敗時(shí),進(jìn)行的工作歸納如下: ● 回滾當(dāng)前用戶(hù)的事務(wù)
● 釋放當(dāng)前用戶(hù)加的表或行級(jí)鎖
● 釋放用戶(hù)的其他資源
● 重新啟動(dòng)死掉的調(diào)度進(jìn)程
ARCn(重做日志文件--》歸檔文件)日志文件是循環(huán)使用的,當(dāng)一個(gè)日志寫(xiě)滿(mǎn)后,自動(dòng)切換到另一個(gè)日志文件。ARCn 進(jìn)程在重做日志文件進(jìn)行切換時(shí)開(kāi)始工作,將寫(xiě)滿(mǎn)的重做日志文件寫(xiě)入歸檔日志文件。根據(jù)歸檔任務(wù)量的大小,通過(guò)設(shè)置初始化參數(shù),可以同時(shí)啟動(dòng)多個(gè) ARCn 進(jìn)程。Oracle 服務(wù)器默認(rèn)的是非歸檔模式,通過(guò)修改初始化參數(shù)文件中的參數(shù)可以改變歸檔模式。生產(chǎn)數(shù)據(jù)庫(kù)通常都 會(huì)設(shè)置為歸檔模式。 RECO恢復(fù)進(jìn)程RECO 恢復(fù)進(jìn)程負(fù)責(zé)在分布式數(shù)據(jù)庫(kù)(Distributed Database)環(huán)境下,自動(dòng)恢復(fù)失敗的分布式事務(wù)。當(dāng)某個(gè)分布式事務(wù)由于網(wǎng)絡(luò)連接故障或者其他原因失敗時(shí),RECO 進(jìn)程將會(huì)嘗試與該事物相關(guān)的所有數(shù)據(jù)庫(kù)進(jìn)行聯(lián)系,已完成對(duì)失敗事物的處理工作。 Dnnnn 調(diào)度進(jìn)程Dnnnn 調(diào)度進(jìn)程是多線(xiàn)程服務(wù)器體系結(jié)構(gòu)的一部分,調(diào)度進(jìn)程接受用戶(hù)進(jìn)程的請(qǐng)求,將他們放入到請(qǐng)求隊(duì)列中,然后為請(qǐng)求隊(duì)列中的用戶(hù)進(jìn)程分配一個(gè)服務(wù)進(jìn)程 |
|
來(lái)自: 東西二王 > 《數(shù)據(jù)技術(shù)》