9、進(jìn)程結(jié)構(gòu)
這一章論述了Oracle數(shù)據(jù)庫系統(tǒng)的進(jìn)程和Oracle系統(tǒng)的可用的不同配置。
這一章包含下列主題:
u 進(jìn)程介紹
u 用戶進(jìn)程概述
u Oracle進(jìn)程概述
u 共享服務(wù)器架構(gòu)
u 專用服務(wù)器配置
u 程序接口
所有連接Oracle的用戶都運(yùn)行兩個模塊的代碼來訪問一個Oracle數(shù)據(jù)庫實(shí)例:
u 應(yīng)用程序或Oracle工具:數(shù)據(jù)庫用戶可以使用數(shù)據(jù)庫應(yīng)用程序(例如預(yù)編譯程序)或者Oracle工具(如SQL Plus),這些工具將SQL發(fā)布給Oracle數(shù)據(jù)庫。
u Oracle數(shù)據(jù)庫服務(wù)代碼:每個用戶后面都有Oracle數(shù)據(jù)庫代碼執(zhí)行,它負(fù)責(zé)解析和處理應(yīng)用程序的SQL語句。
這些代碼模塊通過進(jìn)程運(yùn)行。一個進(jìn)程是“線程控制器”或者操作系統(tǒng)中的可以運(yùn)行一系列步驟的機(jī)制。(某些操作系統(tǒng)使用job或者task這種概念)一個進(jìn)程通常在它自己的私有內(nèi)存空間運(yùn)行。
多進(jìn)程Oracle(也叫做多用戶Oracle)使用服務(wù)器進(jìn)程來運(yùn)行Oracle代碼的不同部分,使用額外的進(jìn)程為用戶服務(wù)(每個連接用戶對應(yīng)一個進(jìn)程或者多個用戶共享一個或多個進(jìn)程)。大多數(shù)數(shù)據(jù)庫系統(tǒng)都是多用戶的,因?yàn)橐粋€數(shù)據(jù)庫的一個主要優(yōu)點(diǎn)就是同時為多個用戶管理數(shù)據(jù)。
Oracle實(shí)例的每個進(jìn)程執(zhí)行特定的工作。通過將Oracle和數(shù)據(jù)庫應(yīng)用程序的工作分成多個進(jìn)程,多用戶或者多個應(yīng)用程序可以同時連接一個數(shù)據(jù)庫實(shí)例,而系統(tǒng)保持優(yōu)秀的性能。
一個Oracle系統(tǒng)的進(jìn)程可以分為兩個主要的組:
u 用戶進(jìn)程運(yùn)行應(yīng)用程序或者Oracle工具代碼
u Oracle進(jìn)程運(yùn)行Oracle數(shù)據(jù)庫服務(wù)代碼。它們包括服務(wù)器進(jìn)程和后臺進(jìn)程。
進(jìn)程結(jié)構(gòu)針對不同的Oracle配置、不同的操作系統(tǒng)和Oracle附件的選擇都會有所不同。連接用戶的代碼可以配置為共享服務(wù)器或者專用服務(wù)器。
在專用服務(wù)器情況下,對每個用戶來說,數(shù)據(jù)庫應(yīng)用程序運(yùn)行的進(jìn)程(用戶進(jìn)程)和Oracle數(shù)據(jù)庫服務(wù)器代碼運(yùn)行的進(jìn)程(專用服務(wù)器進(jìn)程)不同。
在共享服務(wù)器下,數(shù)據(jù)庫應(yīng)用程序運(yùn)行在和Oracle數(shù)據(jù)庫代碼不同的進(jìn)程上(用戶進(jìn)程)。每個運(yùn)行Oracle服務(wù)器代碼的服務(wù)器進(jìn)程(共享服務(wù)器進(jìn)程)可以對多個用戶進(jìn)程服務(wù)。
圖9-1顯示了一個專用服務(wù)器配置。每個連接用戶都有一個單獨(dú)的用戶進(jìn)程,多個進(jìn)程運(yùn)行在Oracle后臺。
圖9-1 一個Oracle實(shí)例
圖9-1可以描述多個并發(fā)用戶在同一個計(jì)算機(jī)上運(yùn)行一個應(yīng)用程序(Oracle)。這個特定的配置通常在大型機(jī)或微型機(jī)上出現(xiàn)。
當(dāng)一個用戶運(yùn)行一個應(yīng)用程序(例如Pro*C程序)或者一個Oracle工具(比如企業(yè)管理器或者SQL *Plus),Oracle創(chuàng)建一個用戶進(jìn)程來運(yùn)行用戶的應(yīng)用程序。
連接和會話跟用戶進(jìn)程緊密聯(lián)系,但含義上也有不同。
連接是用戶進(jìn)程和Oracle實(shí)例之間的連接通道。一個連接通道使用進(jìn)程間通訊機(jī)制(在一臺計(jì)算機(jī)上同時運(yùn)行用戶進(jìn)程和Oracle)或者網(wǎng)絡(luò)軟件(當(dāng)數(shù)據(jù)庫應(yīng)用程序和Oracle運(yùn)行在不同的機(jī)器上通過網(wǎng)絡(luò)連接)。
一個會話是一個用戶通過用戶進(jìn)程到Oracle實(shí)例的特定連接。例如,當(dāng)用戶啟動SQL *Plus,用戶必須提供一個有效用戶名和密碼,然后會為那個用戶創(chuàng)建一個會話。一個會話從用戶連接時開始,用戶中斷連接或者退出數(shù)據(jù)庫應(yīng)用程序時終止。
多個會話可以通過使用同一個用戶名密碼的用戶創(chuàng)建和并發(fā)存在。例如,一個用戶使用SCOTT/TIGER的用戶名密碼來可以多次連接同一個Oracle實(shí)例。
不使用共享服務(wù)器的情況下,Oracle為每個用戶會話創(chuàng)建一個服務(wù)器進(jìn)程。但是,在共享服務(wù)器下,多個用戶會話可以共享一個服務(wù)器進(jìn)程。
這部分描述了運(yùn)行Oracle數(shù)據(jù)庫服務(wù)器代碼的兩類進(jìn)程(服務(wù)器進(jìn)程和后臺進(jìn)程)。它還描述了跟蹤文件和警告文件,這些文件記錄了Oracle進(jìn)程的數(shù)據(jù)庫事件。
Oracle創(chuàng)建服務(wù)器進(jìn)程來處理連接到這個實(shí)例的用戶進(jìn)程的請求。在應(yīng)用程序和Oracle運(yùn)行在一臺機(jī)器的情況下,可以將用戶進(jìn)程和對應(yīng)的服務(wù)器進(jìn)程合并來降低系統(tǒng)開銷。但是,當(dāng)應(yīng)用程序和Oracle在不同的計(jì)算機(jī)上運(yùn)行時,用戶進(jìn)程總是通過不同的服務(wù)器進(jìn)程連接Oracle。
為每個用戶應(yīng)用程序創(chuàng)建的服務(wù)器進(jìn)程(或者合并的用戶/服務(wù)器進(jìn)程的服務(wù)器部分)可以執(zhí)行下列任務(wù):
u 解析和運(yùn)行應(yīng)用程序發(fā)布的SQL語句
u 如果SGA中不存在一些數(shù)據(jù)塊的數(shù)據(jù),服務(wù)器進(jìn)程會從磁盤上的數(shù)據(jù)文件讀取必要的數(shù)據(jù)塊到SGA的共享服務(wù)器緩存中。
u 以應(yīng)用程序可以處理的信息方式返回結(jié)果。
為獲得最高的性能和適應(yīng)多用戶,一個多進(jìn)程Oracle系統(tǒng)使用一些叫做后臺進(jìn)程的額外Oracle進(jìn)程。
一個Oracle實(shí)例可以有很多后臺進(jìn)程;但不是所有的都必須存在。后臺進(jìn)程數(shù)量很多。查看視圖V$BGPROCESS可以得到關(guān)于后臺進(jìn)程的信息。一個Oracle實(shí)例中的后臺進(jìn)程可以包含下列進(jìn)程:
u 數(shù)據(jù)庫寫入進(jìn)程(Database Writer Process,DBWn)
u 日志寫入進(jìn)程(Log Writer Process,LGWR)
u 檢查點(diǎn)進(jìn)程(Checkpoint Process,CKPT)
u 系統(tǒng)監(jiān)視進(jìn)程(System Monitor Process,SMON)
u 進(jìn)程監(jiān)視進(jìn)程(Process Monitor Process,PMON)
u 恢復(fù)進(jìn)程(Recoverer Process,RECO)
u 任務(wù)隊(duì)列進(jìn)程(Job Queue Processes)
u 歸檔進(jìn)程(ARCn)
u 隊(duì)列監(jiān)控進(jìn)程(Queue Monitor Processes,QMNn)
u 其他后臺進(jìn)程
在許多操作系統(tǒng)上,后臺進(jìn)程在實(shí)例啟動時自動創(chuàng)建。
圖9-2顯示了每個后臺進(jìn)程如何和Oracle數(shù)據(jù)庫的不同部分交互,下一部分會描述每個進(jìn)程。
圖9-2 多進(jìn)程Oracle實(shí)例的后臺進(jìn)程
數(shù)據(jù)庫寫入進(jìn)程(DBWn)將緩存中的條目寫入數(shù)據(jù)文件。DBWn進(jìn)程的責(zé)任是將數(shù)據(jù)庫高速緩存中修改的(臟)緩存寫入磁盤。雖然一個數(shù)據(jù)庫寫入進(jìn)程(DBW0)對于大多數(shù)系統(tǒng)都足夠了,但是如果你的系統(tǒng)數(shù)據(jù)修改的壓力很大,你可以配置額外的進(jìn)程(DBW1到DBW9和DBWa到DBWj)來提供寫入性能。這些額外的DBWn進(jìn)程對于單處理器系統(tǒng)來說沒什么用處。
當(dāng)數(shù)據(jù)庫高速緩存的一段緩存修改時,它就被標(biāo)識為“臟”的。一個“冷”緩存是根據(jù)LRU(最近最少使用)機(jī)制最近沒有使用的一段緩存。DBWn進(jìn)程將冷的、臟的緩存寫入磁盤,所以用戶進(jìn)程能夠找到可以使用的冷的、清理的緩存來讀取新的塊到高速緩存中。隨著用戶進(jìn)程不停的弄“臟”緩存,空閑緩存的數(shù)量會減少。如果空閑緩存的數(shù)量下降的太多,用戶進(jìn)程就不能找到新的空閑緩存來從磁盤上讀取塊到高速緩存中。DBWn管理高速緩存,所以用戶進(jìn)程總能找到空閑的緩存。
通過寫入“冷”、“臟”緩存到磁盤,DBWn提高了查找空閑緩存的性能,并在內(nèi)存中保持了最近使用的緩存。例如,經(jīng)常訪問的小表或索引的一部分塊都保存在高速緩存中,所以它們不需要從磁盤重新讀入。LRU機(jī)制確保了最常訪問的塊保存在高速緩存中,所以當(dāng)一個緩存寫入磁盤,它一般不包括最近經(jīng)常使用的數(shù)據(jù)。
初始化參數(shù)DB_WRITER_PROCESSES指定了DBWn進(jìn)程的數(shù)量。最大的DBWn進(jìn)程數(shù)量為20。如果用戶在啟動時沒有指定這個參數(shù),Oracle根據(jù)CPU和處理器組的數(shù)量來設(shè)置DB_WRITER_PROCESSES參數(shù)。
DBWn進(jìn)程在下列情況下將“臟”緩存寫入磁盤:
u 當(dāng)一個服務(wù)器進(jìn)程搜索了極限數(shù)量的緩存也沒有找到干凈可用的緩存之后,它發(fā)信號給DBWn來寫入。DBWn異步的將臟緩存寫入磁盤,同時不影響其他進(jìn)程執(zhí)行。
u DBWn定期寫入緩存來推進(jìn)檢查點(diǎn)(checkpoint),檢查點(diǎn)是實(shí)例恢復(fù)時重做日志的開始位置。這個日志位置由高速緩存中的最舊的“臟”緩存決定。
在所有的情況下,DBWn執(zhí)行批量(多塊)寫入來提供效率。多塊寫入的塊數(shù)量因操作系統(tǒng)而異。
日志寫入進(jìn)程(LGWR)的職責(zé)是重做日志緩存管理:將重做日志緩存寫入到磁盤的重做日志文件中。LGWR將上次寫入以來已經(jīng)拷貝到緩存中的所有重做條目寫入重做日志文件。
重做日志緩存是一個循環(huán)緩存。當(dāng)LGWR將重做日志緩存的重做條目寫入重做日志時,服務(wù)器進(jìn)程可以在已經(jīng)寫入到磁盤的重做日志緩存的條目上拷貝新的條目。LGWR通常寫入速度很快,即使在重做日志訪問很繁忙的情況,也可以確保總有新的緩存空間來容納新的條目。
LGWR將緩存中的一段連續(xù)部分寫入磁盤。LGWR在下列情況下寫入磁盤:
u 當(dāng)用戶進(jìn)程提交一個事務(wù)產(chǎn)生了提交記錄
u 重做日志緩存
² 每3秒鐘
² 當(dāng)重做日志緩存1/3滿時
² 當(dāng)一個DBWn進(jìn)程在需要時將修改的緩存寫入磁盤時
注意:在DBWn寫入修改的緩存到磁盤之前,所有緩存修改的相關(guān)重做日志必須寫入到磁盤(先寫入?yún)f(xié)議)。如果DBWn發(fā)現(xiàn)某些重做記錄沒有寫入磁盤,它會給LGWR發(fā)信號要求LGWR將重做記錄寫入磁盤,并且等待LGWR將重做日志緩存完全寫入磁盤之后,DBWn才將數(shù)據(jù)緩存寫入到磁盤。
LGWR同時寫入鏡像組的重做日志文件。如果組中的一個文件損壞或者不可用,LGWR繼續(xù)寫入到組的其他文件中,并在LGWR跟蹤文件和系統(tǒng)警告文件中記錄一個錯誤日志。如果組內(nèi)的所有文件都損壞了,或者因?yàn)榻M還沒有被歸檔導(dǎo)致組不可用,LGWR就不能繼續(xù)發(fā)揮作用。
當(dāng)用戶發(fā)布一個COMMIT語句,LGWR在重做日志緩存中放入一個提交記錄,并立即將它和事務(wù)重做條目寫入到磁盤中。數(shù)據(jù)塊的對應(yīng)的改變會在以后寫入效率較高的時候再寫入。這叫做快速提交機(jī)制。將包含事務(wù)提交記錄的重做條目寫入磁盤是個原子操作,它代表著事務(wù)已經(jīng)提交。Oracle會返回一個事務(wù)成功提交的代碼,雖然緩存的數(shù)據(jù)還沒有寫入到磁盤。
注意:有時候,如果需要更多緩存空間,LGWR會在一個事務(wù)提交之前寫入重做日志條目。這些條目只有在事務(wù)以后提交的時候才是持久性的。
當(dāng)一個用戶提交一個事務(wù),事務(wù)會被分配一個系統(tǒng)修改號(system change number,SCN),SCN和事務(wù)重做條目一起寫入到重做日志中。SCN記錄在重做日志中,所以恢復(fù)操作可以在真正應(yīng)用集群(RAC)和分布式數(shù)據(jù)庫中同步。
在系統(tǒng)非?;钴S時,LGWR可以使用組提交的方式寫入重做日志文件。例如,假設(shè)一個用戶提交一個事務(wù)。LGWR必須將事務(wù)重做條目寫入到磁盤,但同時,另一個用戶也發(fā)布COMMIT語句。但是,LGWR必須先完成前面的寫操作才可以在重做日志中寫入來提交這個事務(wù)。在第一個事務(wù)條目寫入到重做日志文件之后,整個的等待寫入的重做日志條目(還沒有提交的)可以在一個操作中寫入到磁盤,這樣比單獨(dú)寫入整個事務(wù)條目要節(jié)省磁盤I/O。因而,Oracle最小化了磁盤I/O,最大化LGWR的性能。如果提交請求頻率很高,然后LGWR從重做日志緩存的每個寫入都可以包含多個提交記錄。
當(dāng)檢查點(diǎn)發(fā)生時,Oracle必須更新所有數(shù)據(jù)文件的首部來記錄檢查點(diǎn)的詳細(xì)信息。這個是CKPT進(jìn)程做的。CKPT進(jìn)程不負(fù)責(zé)寫入塊到磁盤,DBWn完成這項(xiàng)工作。
DBWR 檢查點(diǎn)統(tǒng)計(jì)在企業(yè)管理器的System_Statistics中顯示了需要完成的檢查點(diǎn)數(shù)量。
系統(tǒng)監(jiān)控進(jìn)程(SMON)在實(shí)例開始時執(zhí)行必要的恢復(fù)。SMON還負(fù)責(zé)清理不再使用的臨時段和在字典管理的表空間中合并臨近的空閑區(qū)段。如果在實(shí)例恢復(fù)中因?yàn)槲募x或者離線錯誤導(dǎo)致跳過一些結(jié)束的事務(wù),在表空間或文件重新在線時SMON會恢復(fù)它們。SMON通常自己檢查是否需要啟動。其他的進(jìn)程也可以在它們認(rèn)為需要的時候調(diào)用SMON。
在真正應(yīng)用集群中,一個實(shí)例的SMON進(jìn)程可以針對CPU失敗或者實(shí)例失敗執(zhí)行實(shí)例恢復(fù)。
進(jìn)程監(jiān)控進(jìn)程(PMON)在用戶進(jìn)程失敗時執(zhí)行進(jìn)程恢復(fù)。PMON負(fù)責(zé)清理這個用戶正在使用的數(shù)據(jù)庫高速緩存和釋放這個用戶進(jìn)程正在使用的資源。例如,它重置了活動事務(wù)表的狀態(tài),釋放了鎖,從活動進(jìn)程列表中移除進(jìn)程ID。
PMON定期檢查調(diào)度器和服務(wù)器進(jìn)程的狀態(tài),重啟任意停止運(yùn)行的進(jìn)程(Oracle有意中斷的除外)。PMON還對網(wǎng)絡(luò)監(jiān)聽器注冊實(shí)例信息和調(diào)度器進(jìn)程。
和SMON一樣,PMON通常查看是否需要它,如果其他進(jìn)程發(fā)現(xiàn)需要它可以調(diào)用PMON。
恢復(fù)進(jìn)程(RECO)是用于分布式數(shù)據(jù)庫配置的一個后臺進(jìn)程,自動解決失效的分布式式事務(wù)。一個節(jié)點(diǎn)的RECO進(jìn)程自動連接一個存疑的分布式事務(wù)涉及的另外一個數(shù)據(jù)庫。當(dāng)RECO進(jìn)程在相關(guān)數(shù)據(jù)庫服務(wù)器之間重建連接時,它自動解決所有存疑事務(wù),從每個數(shù)據(jù)庫未決事務(wù)表中移除對應(yīng)的存疑事務(wù)的行。
如果RECO進(jìn)程無法連接遠(yuǎn)程服務(wù)器,RECO自動在一個時間間隔之后重新連接。但是,RECO在重新連接之前等待的時間間隔以指數(shù)級增長。RECO進(jìn)程只有在實(shí)例允許分布式事務(wù)才存在。當(dāng)前并發(fā)的分布式事務(wù)數(shù)目并沒有限制。
任務(wù)隊(duì)列進(jìn)程用來批量處理。它們運(yùn)行用戶任務(wù)。它們在一個Oracle實(shí)例中顯示為一個調(diào)度服務(wù),可以將PL/SQL語句或者過程來作為調(diào)度任務(wù)。給定一個開始時間和間隔,任務(wù)隊(duì)列進(jìn)程會在下一個時間間隔到達(dá)時運(yùn)行一個任務(wù)。
任務(wù)隊(duì)列進(jìn)程是動態(tài)管理的。它允許任務(wù)隊(duì)列客戶端在需要時使用更多的任務(wù)隊(duì)列進(jìn)程。新進(jìn)程使用的資源在它們空閑時會被釋放。
動態(tài)任務(wù)隊(duì)列進(jìn)程可以運(yùn)行在給定的時間間隔內(nèi)并發(fā)運(yùn)行大量的任務(wù)。任務(wù)隊(duì)列進(jìn)程按照CJG進(jìn)程分配它們的樣子運(yùn)行用戶任務(wù)。這就是發(fā)生的事情:
1、協(xié)調(diào)進(jìn)程(名稱為CJQ0)定期從系統(tǒng)表JOB$中查找需要運(yùn)行的任務(wù)。新任務(wù)的選擇按照時間來排序。
2、CJQ0進(jìn)程動態(tài)產(chǎn)生任務(wù)隊(duì)列子進(jìn)程(J000.....J999)來運(yùn)行任務(wù)。
3、任務(wù)隊(duì)列進(jìn)程運(yùn)行CJQ進(jìn)程選擇的任務(wù)中的一個來運(yùn)行。進(jìn)程一次運(yùn)行一個任務(wù)。
4、進(jìn)程完成完成執(zhí)行一個任務(wù)之后,它輪詢更多的任務(wù)。如果沒有任務(wù)需要調(diào)度執(zhí)行,那么它進(jìn)入休眠狀態(tài),然后它定期醒來,輪詢更多的任務(wù)。如果進(jìn)程沒有找到更多的新任務(wù),那么在預(yù)先設(shè)定的間隔后退出。
初始化參數(shù)JOB_QUEUE_PROCESSES代表了一個實(shí)例中可以并發(fā)運(yùn)行的最大數(shù)據(jù)的任務(wù)隊(duì)列進(jìn)程。因而,客戶端不應(yīng)該假定所有的任務(wù)隊(duì)列都可以作為任務(wù)執(zhí)行。
注意:協(xié)調(diào)器進(jìn)程在初始化參數(shù)JOB_QUEUE_PROCESSES設(shè)置為0時不啟動。
歸檔進(jìn)程(ARCn)在日志切換后將重做日志文件拷貝到不同的存儲設(shè)備上。ARCn進(jìn)程只有在數(shù)據(jù)庫處于歸檔日志模式(ARCHIVELOG)時存在,這時候啟動了自動歸檔。
一個Oracle實(shí)例可以用10個ARCn進(jìn)程(ARC0和ARC9)。LGWR進(jìn)程在當(dāng)前數(shù)量的ARCn進(jìn)程無法處理當(dāng)前負(fù)載時會啟動一個新的ARCn進(jìn)程。LGWR啟動一個新的ARCn進(jìn)程會在警告日志中保存一個記錄。
如果你預(yù)料到歸檔負(fù)載會很重,比如批量裝載數(shù)據(jù),你可以使用初始化參數(shù)LOG_ARCHIVE_MAX_PROCESSES來指定多個歸檔進(jìn)程。通過ALTER SYSTEM語句修改這個參數(shù)值可以動態(tài)的增加和減少ARCn的數(shù)量。但是,你不必要修改這個參數(shù)的默認(rèn)值(為1),因?yàn)橄到y(tǒng)會根據(jù)需要確定ARCn進(jìn)程的數(shù)量,LGWR在數(shù)據(jù)庫負(fù)載需要時會自動啟動更多ARCn進(jìn)程。
隊(duì)列監(jiān)控進(jìn)程(QMNn)是Oracle流高級隊(duì)列的一個可選后臺進(jìn)程,它負(fù)責(zé)監(jiān)控消息隊(duì)列。你可以配置達(dá)10個的隊(duì)列監(jiān)控進(jìn)程。這些進(jìn)程和任務(wù)隊(duì)列進(jìn)程類似,和其他Oracle后臺進(jìn)程的不同點(diǎn)在于QMNn和任務(wù)隊(duì)列進(jìn)程的失敗不會造成實(shí)例失敗。
還有一些可能運(yùn)行的其他后臺進(jìn)程。它們包括下列:
MMON執(zhí)行不同的后臺任務(wù)的相關(guān)管理工作,例如:
u 當(dāng)給定的規(guī)格違背了閥值發(fā)布警告
u 通過產(chǎn)生額外的進(jìn)程(MMON子進(jìn)程)來產(chǎn)生快照
u 捕捉最近修改的SQL對象的統(tǒng)計(jì)值。
MMNL執(zhí)行經(jīng)常性和輕量級的相關(guān)任務(wù)管理,例如會話歷史捕捉和規(guī)格計(jì)算。
MMAN用來內(nèi)部數(shù)據(jù)庫任務(wù)。
RBAL在自動存儲管理實(shí)例中協(xié)調(diào)重新平衡工作。它在一個自動存儲管理磁盤上執(zhí)行全面打開。ORBn在自動存儲管理實(shí)例中執(zhí)行實(shí)際的重新均衡數(shù)據(jù)區(qū)段移動??赡芡瑫r有很多這個進(jìn)程,ORB0,ORB1或者更多。
OSMB在使用自動存儲管理磁盤組的數(shù)據(jù)庫實(shí)例中出現(xiàn)。它負(fù)責(zé)連接自動存儲管理實(shí)例。
每個服務(wù)器和后臺進(jìn)程可以寫入相關(guān)的跟蹤文件。當(dāng)一個進(jìn)程檢測到一個內(nèi)部錯誤,它將錯誤信息寫入到跟蹤文件中。如果發(fā)生一個內(nèi)部錯誤,錯誤信息寫入了跟蹤文件,管理員應(yīng)該聯(lián)系Oracle支持服務(wù)。
一個后臺進(jìn)程關(guān)聯(lián)的所有跟蹤文件名稱都包含產(chǎn)生這個跟蹤文件的進(jìn)程名稱。一個例外是有任務(wù)隊(duì)列進(jìn)程(Jnnn)產(chǎn)生的跟蹤文件。
跟蹤文件的額外信息可以對調(diào)整應(yīng)用程序或者實(shí)例提供指導(dǎo)。后臺進(jìn)程總是在適當(dāng)?shù)臅r候?qū)⑿畔懭氲礁櫸募?/span>
每個數(shù)據(jù)庫都有一個altet.log文件。數(shù)據(jù)庫的警告日志是一個消息和錯誤的按時間排列的日志,包括下列信息:
u 發(fā)生的所有內(nèi)部錯誤(ORA-600),塊訛誤錯誤(ORA-1578)和死鎖信息(ORA-60)
u 后勤操作,例如SQL語句CREATE/ALTER/DROP DATABASE/TABLESPACE和企業(yè)管理器或者SQL *Plus語句STARTUP,SHUTDOWN,ARCHIVE LOG和RECOVER。
u 共享服務(wù)器和調(diào)度器進(jìn)程的功能相關(guān)的信息和錯誤
u 實(shí)體化視圖自動刷新的錯誤。
Oracle使用警告日志來保存這些事件,作為在操作員終端顯示信息的替代方案。(某些系統(tǒng)還在終端顯示這些信息)如果一個管理員操作成功了,警告日志中會寫入這個消息,包括時間戳和“completed”。
共享服務(wù)器進(jìn)程減少了針對每個連接創(chuàng)建一個專用服務(wù)器進(jìn)程的必要性。一個調(diào)度器將多個到達(dá)的網(wǎng)絡(luò)會話指向一個共享服務(wù)器進(jìn)程的池。服務(wù)器進(jìn)程共享池中的一個空閑共享服務(wù)器進(jìn)程從一個通用隊(duì)列中獲取一個請求,這意味著很少的共享服務(wù)器可以像更多專用服務(wù)器那樣處理相同數(shù)目的進(jìn)程。而且,因?yàn)槊總€用戶需要的內(nèi)存量是相對較少的,所以需要更少的內(nèi)存和進(jìn)程管理,可以支持更多的用戶。
共享服務(wù)器系統(tǒng)需要大量不同的進(jìn)程:
u 一個網(wǎng)絡(luò)監(jiān)聽器將用戶進(jìn)程連接到調(diào)度器或者專用服務(wù)器(監(jiān)聽器進(jìn)程是Oracle網(wǎng)絡(luò)服務(wù)的一部分,不是Oracle的一部分)
u 一個或多個調(diào)度器進(jìn)程
u 一個或多個共享服務(wù)器進(jìn)程
共享服務(wù)器進(jìn)程需要Oracle網(wǎng)絡(luò)服務(wù)或者SQL *Net版本2。
注意:為使用共享服務(wù)器,一個用戶進(jìn)程必須通過Oracle網(wǎng)絡(luò)服務(wù)或SQL *Net版本2連接,即使進(jìn)程和Oracle實(shí)例運(yùn)行在同一臺機(jī)器上。
當(dāng)一個實(shí)例啟動時,網(wǎng)絡(luò)監(jiān)聽器進(jìn)程打開并建議一個用戶連接Oracle的通訊通道。那么,每個調(diào)度器進(jìn)程給監(jiān)聽器進(jìn)程一個地址,在這個地址上,調(diào)度器監(jiān)聽連接的請求。至少需要配置和啟動至少一個針對數(shù)據(jù)庫客戶端使用的每個網(wǎng)絡(luò)協(xié)議的調(diào)度器進(jìn)程。
當(dāng)一個用戶進(jìn)程創(chuàng)建一個連接請求,監(jiān)聽器檢查這個請求,確定是否這個用戶進(jìn)程可以使用共享服務(wù)器進(jìn)程。如果可以,監(jiān)聽器返回負(fù)載較輕的調(diào)度器進(jìn)程地址,用戶進(jìn)程直接和調(diào)度器連接。
某些用戶進(jìn)程不能連接調(diào)度器,所以網(wǎng)絡(luò)監(jiān)聽器進(jìn)程不能將它們和調(diào)度器連接。在這種情況下,或者用戶進(jìn)程請求一個專用服務(wù)器,監(jiān)聽器會創(chuàng)建一個專用服務(wù)器并建立一個合適的連接。
Oracle共享服務(wù)器架構(gòu)提高了應(yīng)用程序的伸縮性和同時連接數(shù)據(jù)庫的客戶端數(shù)量。它可以在不修改應(yīng)用程序本身的情況下提高現(xiàn)有應(yīng)用程序的性能。
用戶的一個請求是一個單獨(dú)的程序接口調(diào)用,是用戶SQL語句的一部分。當(dāng)一個用戶創(chuàng)建一個調(diào)用,它的調(diào)度器將這個請求放入到請求隊(duì)列中,下一個共享服務(wù)器進(jìn)程從這里拾起這個請求。
請求隊(duì)列在SGA中,對于實(shí)例中的所有調(diào)度器進(jìn)程是公用的。共享服務(wù)器進(jìn)程搜索公用的請求隊(duì)列來尋找新的請求。撿起請求是按照先進(jìn)先出規(guī)則的。一個共享服務(wù)器從隊(duì)列中撿起一個請求,然后執(zhí)行所有需要的數(shù)據(jù)庫調(diào)用來完成這個請求。
當(dāng)服務(wù)器完整這個請求時,它將回應(yīng)放入正在調(diào)用的調(diào)度器的回應(yīng)隊(duì)列中。每個調(diào)度器都在SGA中有它自己的回應(yīng)隊(duì)列。調(diào)度器然后返回完整的回應(yīng)給適當(dāng)?shù)挠脩暨M(jìn)程。
例如,在一個訂單系統(tǒng)中,每個店員的用戶進(jìn)程連接到調(diào)度器,每個店員的請求被發(fā)送到一個調(diào)度器,它將請求放到請求隊(duì)列中。下一個可用的共享服務(wù)器進(jìn)程撿起請求、處理它、將回應(yīng)放回到回應(yīng)隊(duì)列中。當(dāng)一個店員的請求完成,店員和調(diào)度器保持連接,但是處理請求的共享服務(wù)器進(jìn)程被釋放,可以處理其他請求。當(dāng)一個店員和顧客說話時,另外的店員可以使用同一個共享服務(wù)器進(jìn)程。
圖9-3 顯示了用戶進(jìn)程如何通過程序接口連接調(diào)度器和調(diào)度器如何將用戶的請求和共享服務(wù)器進(jìn)程通訊。
圖9-3 共享服務(wù)器進(jìn)程配置和處理
調(diào)度器進(jìn)程通過允許用戶進(jìn)程共享有限數(shù)目的服務(wù)器進(jìn)程來支持共享服務(wù)器配置。在共享服務(wù)器情況下,相同數(shù)目的用戶只需要更少的共享服務(wù)器進(jìn)程。因而,共享服務(wù)器可以支持大量數(shù)目的用戶,特別是客戶端/服務(wù)器環(huán)境下,這里客戶端應(yīng)用程序和服務(wù)器在不同的計(jì)算機(jī)上操作。
你可以對單個數(shù)據(jù)庫實(shí)例創(chuàng)建多個調(diào)度器進(jìn)程。至少對Oracle使用的每個網(wǎng)絡(luò)協(xié)議要創(chuàng)建一個調(diào)度器。數(shù)據(jù)庫管理員啟動的調(diào)度器進(jìn)程的最優(yōu)數(shù)量依賴于操作系統(tǒng)限制和每個進(jìn)程的連接數(shù)量,可以在實(shí)例運(yùn)行時增加和移除調(diào)度器進(jìn)程。
注意:最終用戶進(jìn)程必須通過Oracle網(wǎng)絡(luò)服務(wù)或者SQL *Net版本2連接調(diào)度器。即使兩個進(jìn)程都運(yùn)行在一臺機(jī)器上。
在共享服務(wù)器配置下,一個網(wǎng)絡(luò)監(jiān)聽器進(jìn)程從客戶端應(yīng)用程序接受連接請求并將每個請求路由給一個調(diào)度器進(jìn)程。如果它不能將客戶端應(yīng)用程序連接到調(diào)度器上,監(jiān)聽器進(jìn)程會啟動一個專用服務(wù)器進(jìn)程,然后將客戶端應(yīng)用程序和專用服務(wù)器連接。監(jiān)聽器進(jìn)程不是Oracle實(shí)例的一部分,是網(wǎng)絡(luò)服務(wù)的一部分,只是和Oracle協(xié)同工作而已。
共享服務(wù)器進(jìn)程(Shared Server Processes,Snnn)
在共享服務(wù)器配置下,每個共享服務(wù)器進(jìn)程對多個客戶端請求服務(wù)。共享服務(wù)器進(jìn)程和專用服務(wù)器進(jìn)程提供相同的功能,除了共享服務(wù)器進(jìn)程不和特定的用戶進(jìn)程關(guān)聯(lián)。相反,在共享服務(wù)器配置下,一個共享服務(wù)器進(jìn)程對可以任何客戶端請求服務(wù)。
共享服務(wù)器進(jìn)程的PGA不包括用戶關(guān)聯(lián)數(shù)據(jù)(所有共享服務(wù)器進(jìn)程都可以訪問這些數(shù)據(jù))。共享服務(wù)器進(jìn)程的PGA只包含堆??臻g和進(jìn)程特定變量。
所有會話相關(guān)信息都在SGA中。每個共享服務(wù)器需要能夠訪問所有會話的數(shù)據(jù)空間,這樣任何服務(wù)器可以處理任何會話的請求。每個會話的數(shù)據(jù)空間在SGA中分配。你可以通過在用戶概要文件中設(shè)置資源限制PRIVATE_SGA(可用的空間數(shù)量)來限制會話可以分配的空間數(shù)量。
Oracle根據(jù)請求隊(duì)列的長度來動態(tài)調(diào)整共享服務(wù)器的數(shù)量。共享服務(wù)器的可創(chuàng)建數(shù)量范圍在初始化參數(shù)SHARED_SERVERS和MAX_SHARED_SERVERS。
特定的管理操作不能在連接調(diào)度器進(jìn)程時執(zhí)行,包括關(guān)閉或啟動一個實(shí)例和媒體恢復(fù)。在連接調(diào)度器進(jìn)程時想執(zhí)行上述操作會發(fā)布一個錯誤。
這些動作都是在管理員權(quán)限連接才能執(zhí)行。當(dāng)你想在共享服務(wù)器配置下以管理員權(quán)限連接系統(tǒng),你必須在你的連接字符串中定義你想使用專用服務(wù)器進(jìn)程(SERVER=DEDICATED)而不是調(diào)度器進(jìn)程。
圖9-4 描述了Oracle使用專用服務(wù)器架構(gòu)在兩臺計(jì)算機(jī)上運(yùn)行的情況。在這種配置下,一個用戶進(jìn)程在一臺服務(wù)器上運(yùn)行數(shù)據(jù)庫應(yīng)用程序,一個服務(wù)器進(jìn)程在另一臺計(jì)算機(jī)上運(yùn)行相關(guān)的Oracle數(shù)據(jù)庫服務(wù)器。
圖 9 -4 使用專用服務(wù)器進(jìn)程的Oracle
用戶進(jìn)程和服務(wù)器進(jìn)程是獨(dú)立的、不同的進(jìn)程。對應(yīng)每個用戶進(jìn)程的獨(dú)立的服務(wù)器進(jìn)程叫做專用服務(wù)器進(jìn)程(也叫影子進(jìn)程),因?yàn)榉?wù)器進(jìn)程只為相關(guān)用戶進(jìn)程服務(wù)。
這種配置維持了用戶進(jìn)程和服務(wù)器進(jìn)程1比1的比例。甚至在用戶不再活動的對服務(wù)器發(fā)送請求時,服務(wù)器進(jìn)程仍然保持(雖然它是不活動的,可以在某些操作系統(tǒng)上被換出內(nèi)存)。
圖9-4 顯示了用戶和服務(wù)器進(jìn)程在不同的計(jì)算機(jī)上運(yùn)行,通過網(wǎng)絡(luò)連接。但是,專用服務(wù)器架構(gòu)也可以在同一臺機(jī)器上同時運(yùn)行客戶端應(yīng)用程序和Oracle服務(wù)器代碼,但是如果他們在一個進(jìn)程里運(yùn)行,操作系統(tǒng)主機(jī)不能保持兩個程序的獨(dú)立。Unix就是這樣的操作系統(tǒng)的常用例子。
在專用服務(wù)器配置中,用戶和服務(wù)器進(jìn)程使用不同的機(jī)制通訊:
u 如果系統(tǒng)被配置為用戶進(jìn)程和專用服務(wù)器運(yùn)行在同一臺計(jì)算機(jī)上,程序接口使用操作系統(tǒng)主機(jī)的進(jìn)程間通訊機(jī)制來執(zhí)行任務(wù)。
u 如果用戶進(jìn)程和專用服務(wù)器進(jìn)程運(yùn)行在不同的計(jì)算機(jī)上,程序接口在程序之間提供了通訊機(jī)制(比如網(wǎng)絡(luò)軟件和Oracle網(wǎng)絡(luò)服務(wù))。
u 專用服務(wù)器某些情況下會效率不高??紤]一個使用專用服務(wù)器進(jìn)程的訂單系統(tǒng)。一個顧客下一個訂單而店員將訂單錄入數(shù)據(jù)庫。對大部分事務(wù)來說,店員和顧客通話而針對店員用戶進(jìn)程的專用服務(wù)器進(jìn)程保持空閑。服務(wù)器進(jìn)程在大部分事務(wù)中不需要,在其他店員錄入訂單時系統(tǒng)會變慢。對類似的應(yīng)用程序,共享服務(wù)器架構(gòu)更適合一些。
程序接口是數(shù)據(jù)庫應(yīng)用程序和Oracle之間的一個軟件層。程序接口:
u 提供一個安全柵欄,阻止客戶端用戶進(jìn)程破壞性的訪問SGA
u 作為一個通訊機(jī)制,格式化請求信息、傳輸數(shù)據(jù)和陷阱信息以及返回錯誤。
u 轉(zhuǎn)換和翻譯數(shù)據(jù),特別在不同類型的計(jì)算機(jī)或者擴(kuò)展的用戶程序數(shù)據(jù)類型之間
Oracle代碼作為一個服務(wù)器,針對應(yīng)用程序(客戶端)執(zhí)行數(shù)據(jù)庫任務(wù),例如從數(shù)據(jù)塊上獲取數(shù)據(jù)。它由多個部分組成,通過Oracle軟件和操作系統(tǒng)特定的軟件提供。
程序接口由以下幾部分組成:
u Oracle調(diào)用接口(OCI)或者Oracle運(yùn)行時庫(SQLLIB)
u 程序接口的客戶端或者用戶端(也叫做UPI)
u 不同的Oracle網(wǎng)絡(luò)服務(wù)驅(qū)動(特定協(xié)議的通訊軟件)
u 操作系統(tǒng)通訊軟件
u 程序接口的服務(wù)器端或者Oracle段(也叫做OPI)
程序接口的用戶和Oracle端都運(yùn)行Oracle軟件,驅(qū)動也是如此。
Oracle網(wǎng)絡(luò)服務(wù)是程序接口的一部分,允許客戶端應(yīng)用程序和Oracle數(shù)據(jù)庫服務(wù)器位于你的通訊網(wǎng)絡(luò)的不同計(jì)算機(jī)上。
驅(qū)動是傳輸數(shù)據(jù)的軟件的一部分,通常是跨網(wǎng)絡(luò)的。他們執(zhí)行例如連接、斷開連接、提示錯誤或鑒定錯誤的操作。驅(qū)動僅限于一個通訊協(xié)議,而且總是有默認(rèn)的驅(qū)動程序。
你可以安裝多個驅(qū)動程序(例如異步或者DECnet驅(qū)動),并選擇一個作為默認(rèn)驅(qū)動,但是允許一個單獨(dú)客戶在連接時指定希望的驅(qū)動來使用另外一種驅(qū)動程序。不同的進(jìn)程可以使用不同的驅(qū)動。單個進(jìn)程可以使用Oracle網(wǎng)絡(luò)服務(wù)驅(qū)動并發(fā)的連接單個或者多個數(shù)據(jù)庫(可以本地也可以遠(yuǎn)程)。
連接用戶端到Oracle端的程序接口的底層軟件是通訊軟件,一般由操作系統(tǒng)主機(jī)提供。DECnet、TCP/IP、LU6.2和ASYNC就是一些例子。通訊軟件可以由Oracle提供,但是通常要從硬件供應(yīng)商和第三方軟件提供商手中單獨(dú)購買。