官术网_书友最值得收藏!

2.4 Oracle服務器結構

Oracle服務器主要由實例、數(shù)據(jù)庫、程序全局區(qū)(PGA)和前臺進程組成,如圖2.15所示。

實例可以進一步劃分為系統(tǒng)全局區(qū)(SGA)和后臺進程(PMON、SMON等)兩部分。其中,SGA使用操作系統(tǒng)的共享內存資源,而后臺進程需要使用CPU與共享內存資源。數(shù)據(jù)庫(database)中包含數(shù)據(jù)文件(data file)、控制文件(control file)和重做日志文件(redo log file),這些數(shù)據(jù)庫文件存儲在硬盤中。PGA是一個非共享的內存區(qū)域,用于管理用戶進程的私有資源。前臺進程可以再劃分為用戶進程和服務器進程,它們需要使用CPU與內存資源。

2.3節(jié)已經(jīng)對數(shù)據(jù)庫的3種物理文件進行過詳細講解,本節(jié)主要對實例、程序全局區(qū)和前臺進程進行詳細的講解。

圖2.15 Oracle服務器結構模型

2.4.1 系統(tǒng)全局區(qū)

系統(tǒng)全局區(qū)(system global area,SGA)是所有用戶進程共享的一塊內存區(qū)域,也就是說,SGA中的數(shù)據(jù)資源可以被多個用戶進程共同使用。SGA主要由高速數(shù)據(jù)緩沖區(qū)、重做日志緩沖區(qū)、共享池、大型池和Java池等內存結構組成。SGA隨著數(shù)據(jù)庫實例的啟動被加載到內存中,當數(shù)據(jù)庫實例關閉時,SGA區(qū)域將會隨之消失。

1.高速數(shù)據(jù)緩沖區(qū)

高速數(shù)據(jù)緩沖區(qū)中存儲著Oracle系統(tǒng)最近訪問過的數(shù)據(jù)塊(數(shù)據(jù)塊在高速緩沖區(qū)中也可稱為緩存塊)。當用戶向數(shù)據(jù)庫發(fā)出請求時(如檢索某一條數(shù)據(jù)),如果在高速數(shù)據(jù)緩沖區(qū)中存在請求的數(shù)據(jù),則Oracle系統(tǒng)會直接從高速數(shù)據(jù)緩沖區(qū)中讀取數(shù)據(jù)并返回給用戶;否則,Oracle系統(tǒng)會打開數(shù)據(jù)文件讀取請求的數(shù)據(jù)。

若無法在高速數(shù)據(jù)緩沖區(qū)中找到所需要的數(shù)據(jù),則Oracle首先從數(shù)據(jù)文件中讀取指定的數(shù)據(jù)塊到高速數(shù)據(jù)緩沖區(qū)中,然后再從高速數(shù)據(jù)緩沖區(qū)中將請求的數(shù)據(jù)返回給用戶。由于高速數(shù)據(jù)緩沖區(qū)被所有的用戶所共享,只要數(shù)據(jù)文件中的某些數(shù)據(jù)塊被當前用戶或其他用戶請求過,這些數(shù)據(jù)塊就會被裝載到高速數(shù)據(jù)緩沖區(qū)中。這樣當任何用戶再次訪問相同的數(shù)據(jù)時,Oracle就不必再從數(shù)據(jù)文件中讀取數(shù)據(jù),而是可以直接將高速數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)返回給用戶。經(jīng)常或最近被訪問的數(shù)據(jù)塊會被放置到高速數(shù)據(jù)緩沖區(qū)的前端,不常被訪問的數(shù)據(jù)塊會被放置到高速數(shù)據(jù)緩沖區(qū)的后端,當高速數(shù)據(jù)緩沖區(qū)被填滿時,會自動擠掉一些不常被訪問的數(shù)據(jù)塊。

以存取速度來看,內存的讀取速度遠快于物理硬盤,所以高速數(shù)據(jù)緩沖區(qū)的存在可大大降低對物理磁盤的讀取頻率,從而達到提高數(shù)據(jù)庫服務器性能的目的。為了便于管理SGA的內存數(shù)據(jù),Oracle把高速數(shù)據(jù)緩沖區(qū)分為以下3個部分。

 臟數(shù)據(jù)區(qū)。臟數(shù)據(jù)區(qū)中存儲著已被修改過的數(shù)據(jù),這些數(shù)據(jù)等待被寫入數(shù)據(jù)文件中。當一條更新或刪除語句對某些數(shù)據(jù)塊中的數(shù)據(jù)修改后,那么這些數(shù)據(jù)塊就被標記為“臟”,然后等待提交命令并通過后臺進程DBWR將其寫入數(shù)據(jù)文件中。

 空閑區(qū)??臻e區(qū)中的數(shù)據(jù)塊不包含任何數(shù)據(jù),這些數(shù)據(jù)塊可以被寫入數(shù)據(jù),Oracle可以從數(shù)據(jù)文件中讀取數(shù)據(jù)塊,并將其存儲到該區(qū)中。

 保留區(qū)。保留區(qū)包含那些正在被用戶訪問的數(shù)據(jù)塊和明確保留以作為將來使用的數(shù)據(jù)塊(即緩存塊),這些數(shù)據(jù)塊將被保留在緩沖區(qū)中。

2.重做日志緩沖區(qū)

重做日志緩沖區(qū)用于存儲對數(shù)據(jù)庫進行修改操作時所產(chǎn)生的日志信息,這些日志信息在寫入重做日志文件中之前,首先存儲到重做日志緩沖區(qū)中,然后當檢查點發(fā)生或重做日志緩沖區(qū)中的信息量到達一定峰值時,由日志寫入(LGWR)進程將此緩沖區(qū)的內容寫入重做日志文件中。

重做日志緩沖區(qū)的大小由log_buffer參數(shù)指定,該參數(shù)也可以在實例啟動后動態(tài)修改。相對于高速數(shù)據(jù)緩沖區(qū)而言,重做日志緩沖區(qū)的大小對數(shù)據(jù)庫性能的影響較小,通常較大的重做日志緩沖區(qū)能減少重做日志文件對I/O的讀寫次數(shù),對數(shù)據(jù)庫的整體性能有一定的提高。

3.共享池

共享池是SGA保留的內存區(qū)域,用于緩存SQL語句、PL/SQL語句、數(shù)據(jù)字典、資源鎖、字符集以及其他控制結構等。共享池包含庫高速緩沖區(qū)(library cache)和字典高速緩沖區(qū)(dictionary cache)。

1)庫高速緩沖區(qū)

庫高速緩沖區(qū)是共享池的一部分,主要包括共享SQL區(qū)和私有SQL區(qū)兩個組成部分。庫高速緩沖區(qū)中存儲最近用過的SQL語句、PL/SQL語句的文本和執(zhí)行計劃。當下一次執(zhí)行相同的SQL語句或PL/SQL語句時,可以直接在庫高速緩沖區(qū)中找到之前已生成的執(zhí)行計劃,而不需要再次解析相同的SQL語句或PL/SQL語句,從而提高系統(tǒng)執(zhí)行效率。

每條被緩存的SQL或PL/SQL語句都被分成兩部分,分別被存儲在共享SQL區(qū)和私有SQL區(qū)中。共享SQL區(qū)存儲SQL或PL/SQL語句的語法分析結果和執(zhí)行計劃,如果以后要再次執(zhí)行類似的語句,可以利用共享SQL區(qū)中已緩存的語法分析結果和執(zhí)行計劃;私有SQL區(qū)存儲SQL語句中的綁定變量、環(huán)境和會話等信息,這些信息屬于執(zhí)行該語句的用戶的私有信息,其他用戶則無法共享這些信息。

2)字典高速緩沖區(qū)

字典高速緩沖區(qū)用于存儲Oracle系統(tǒng)內部管理所需要的數(shù)據(jù)字典信息,如用戶名、數(shù)據(jù)對象和權限等。

共享池的內存空間大小是可以被動態(tài)改變的,一般通過修改參數(shù)SHARED_POOL_SIZE的值來實現(xiàn)。

【例2.16】修改Oracle共享池的內存空間大小為30 MB,代碼及其運行結果如下。

     SQL> alter system set shared_pool_size=30m;
     系統(tǒng)已更改。

注意

Oracle共享池的空間并非越大越好,因為系統(tǒng)的內存資源是有限的,而且操作系統(tǒng)本身也要消耗一定的內存空間。

互動練習:改變數(shù)據(jù)庫高速緩沖區(qū)的大小。

4.大型池

大型池在SGA區(qū)中不是必需的內存結構,只有在某些特殊情況下,實例才需要使用大型池來減輕共享池的訪問壓力,常用的情況有以下幾種。

 當使用恢復管理器進行備份和恢復操作時,大型池將作為I/O緩沖區(qū)使用。

 當使用I/O Slave仿真異步I/O功能時,大型池將被當作I/O緩沖區(qū)使用。

 執(zhí)行具有大量排序操作的SQL語句。

 當使用并行查詢時,大型池將作為并行查詢進程彼此交換信息的地方。

大型池的緩存區(qū)大小是通過LARGE_POOL_SIZE參數(shù)定義的,在Oracle中,用戶可以使用ALTER SYSTEM命令動態(tài)地修改其緩存區(qū)的大小。

【例2.17】修改Oracle大型池的緩存區(qū)大小為16 MB,代碼及其運行結果如下。

     SQL> alter system set large_pool_size = 16m;
     系統(tǒng)已更改。
     SQL> show parameter large_pool_size;
     NAME                                 TYPE        VALUE
     --------------------                ---------  ------------------------------
     large_pool_size                         big integer    16M

注意

如果在SGA區(qū)沒有設置大型池,則在實例需要時,Oracle系統(tǒng)會在共享池或PGA中分配一定的緩存空間,這樣勢必會影響共享池或PGA的工作效率。

5.Java池

Java池用來提供內存空間給Java虛擬機使用,目的是支持在數(shù)據(jù)庫中運行Java程序包,其大小由java_pool_size參數(shù)決定。

6.Oracle流池

Oracle流池用于在數(shù)據(jù)庫與數(shù)據(jù)庫之間進行信息共享。如果沒有用到Oracle流,就不需要設置該池。Oracle流池的大小由參數(shù)streams_pool_size決定。

2.4.2 程序全局區(qū)

程序全局區(qū)(program global area,PGA)又稱作用戶進程全局區(qū),它的內存區(qū)在進程私有區(qū)中,而不是在共享區(qū)中。PGA是一個全局區(qū),可以把代碼、全局變量和數(shù)據(jù)結構都存儲在其中,但區(qū)域內的資源并不像SGA一樣可被所有的用戶進程所共享,而是每個Oracle服務器進程都只擁有屬于自己的那部分PGA資源。

在程序全局區(qū)中,一個服務進程只能訪問屬于它自己的那部分PGA資源區(qū),各個服務進程的PGA的總和即為實例的PGA的大小。通常PGA由私有SQL區(qū)和會話區(qū)組成。

1.私有SQL區(qū)

私有SQL區(qū)用于存儲變量以及SQL語句運行時的內存結構信息,每個用戶連接到實例時,都會在實例中創(chuàng)建一個會話。這些會話可能會在SGA區(qū)中創(chuàng)建一個共享SQL區(qū),但在PGA區(qū)中可能會創(chuàng)建多個私有SQL區(qū)。把一個私有SQL區(qū)與對應的共享SQL區(qū)合并在一起,就可以獲得一條SQL語句的完整緩存數(shù)據(jù)。

另外,每個會話的私有SQL區(qū)都可以再分為靜態(tài)區(qū)和動態(tài)區(qū)兩部分。靜態(tài)區(qū)的信息在會話過程中保持不變,只有當會話結束時,靜態(tài)區(qū)才會被釋放;而動態(tài)區(qū)的信息在整個會話過程中是不斷變化的,一旦SQL語句執(zhí)行完畢,即使會話還沒有結束,動態(tài)區(qū)也會被釋放。

2.會話區(qū)

會話區(qū)用于存儲用戶的會話信息(如登錄用戶名)。如果數(shù)據(jù)庫處于共享服務器連接模式下,則會話區(qū)將位于SGA中,而不是PGA中,用戶特別需要注意這一點。

查看程序全局區(qū)的信息可以通過顯示PGA參數(shù)的內容來實現(xiàn)。

【例2.18】顯示當前用戶進程的PGA信息,代碼及其運行結果如下。

     SQL> show parameter pga;
     NAME                                 TYPE        VALUE
     ---------------------               ---------  ------------------------------
     pga_aggregate_target                   big integer    18M

2.4.3 前臺進程

前臺進程包括用戶進程和服務器進程,它不屬于實例的一部分,但是用戶在不知不覺中經(jīng)常會用到它。使用前臺進程能夠實現(xiàn)用戶與實例的溝通,下面對這兩種前臺進程進行講解。

1.用戶進程

用戶進程是指那些能夠產(chǎn)生或執(zhí)行SQL語句的應用程序,無論是SQL*Plus,還是其他應用程序,只要是能生成或執(zhí)行SQL語句,都被稱作用戶進程。

在用戶進程中有兩個非常重要的概念,即連接和會話。連接是一個用戶進程與實例之間建立的通信渠道,這個渠道可以通過操作系統(tǒng)上的相關通信機制或網(wǎng)絡連接來實現(xiàn);會話是指在用戶進程與實例之間建立連接后形成的用戶與實例之間的交互方式,一般是用戶發(fā)出請求,數(shù)據(jù)庫實例為用戶返回響應消息的方式。例如,用戶在SQL*Plus中發(fā)出connect system/1qaz2wsx的請求命令,若用戶名和密碼都正確,則數(shù)據(jù)庫實例將返回“已連接”的響應消息。

2.服務器進程

服務器進程是用于處理用戶會話過程中向數(shù)據(jù)庫實例發(fā)出的SQL語句或SQL*Plus命令,它可以分為專用服務器模式和共享服務器模式。在專用服務器模式下,每個用戶進程都有一個專用的服務器進程,這個服務器進程代表用戶進程執(zhí)行SQL語句,必要時還可以回傳執(zhí)行結果給用戶進程;在共享服務器模式下,每個用戶進程不直接與服務器進程連接,而是連接到分派程序,每個分派程序可以同時連接多個用戶進程。

2.4.4 后臺進程

Oracle后臺進程是一組運行于Oracle服務器端的后臺程序,是Oracle實例的重要組成部分。這組后臺進程有若干個,如圖2.16所示。其中SMON、PMON、DBWR、LGWR和CKPT這5個后臺進程必須正常啟動,否則將導致數(shù)據(jù)庫實例崩潰。此外,還有很多輔助進程,用于實現(xiàn)相關的輔助功能,如果這些輔助進程發(fā)生問題,僅使某些功能受到影響,一般不會導致數(shù)據(jù)庫實例崩潰。下面對其中的主要進程進行講解。

圖2.16 主要后臺進程

1.數(shù)據(jù)寫入進程

數(shù)據(jù)寫入(DBWR)進程的主要任務是將內存中的“臟”數(shù)據(jù)塊回寫到數(shù)據(jù)文件中。所謂的“臟”數(shù)據(jù)塊是指高速數(shù)據(jù)緩沖區(qū)中被修改過的數(shù)據(jù)塊,這些數(shù)據(jù)塊的內容與數(shù)據(jù)文件的數(shù)據(jù)塊內容不一致。但DBWR并不是隨時將所有的“臟”數(shù)據(jù)塊都寫入數(shù)據(jù)文件中,只有滿足一定的條件時,DBWR進程才開始成批量地將“臟”數(shù)據(jù)塊寫入數(shù)據(jù)文件中,Oracle這樣做的目的是盡量減少I/O操作,提高Oracle服務器性能。通常當發(fā)生以下幾種情況時,DBWR進程會將“臟”數(shù)據(jù)塊寫入數(shù)據(jù)文件中。

 當用戶進程執(zhí)行插入或修改等操作時,需要將“新數(shù)據(jù)”寫入高速數(shù)據(jù)緩沖區(qū)中,如果在高速數(shù)據(jù)緩沖區(qū)中沒有找到空閑數(shù)據(jù)塊來存儲這些“新數(shù)據(jù)”,那么Oracle系統(tǒng)將啟動DBWR進程并將“臟”數(shù)據(jù)塊寫入數(shù)據(jù)文件中,以獲得空閑數(shù)據(jù)塊來存儲這些“新數(shù)據(jù)”。

 檢查點進程啟動后,它會強制要求DBWR將某些“臟”數(shù)據(jù)塊寫入數(shù)據(jù)文件中。

 當“臟”數(shù)據(jù)塊在高速數(shù)據(jù)緩沖區(qū)中存儲超過3 s時,DBWR進程將會自行啟動并將某些“臟”數(shù)據(jù)塊寫入數(shù)據(jù)文件中。

在某些比較繁忙的應用系統(tǒng)中,可以修改服務器參數(shù)文件SPFILE的DB_WRITER_PROCESSES參數(shù),以允許使用多個DBWR進程。但是DBWR進程的數(shù)量不應當超過系統(tǒng)處理器的數(shù)量,否則多余的DBWR不但無法發(fā)揮作用,反而會耗費系統(tǒng)資源。

2.檢查點進程

檢查點(CKPT)進程可以被看作一個事件,當檢查點事件發(fā)生時,CKPT會要求DBWR將某些“臟”數(shù)據(jù)塊回寫到數(shù)據(jù)文件中。當用戶進程發(fā)出數(shù)據(jù)請求時,Oracle系統(tǒng)從數(shù)據(jù)文件中讀取需要的數(shù)據(jù)并存儲到高速數(shù)據(jù)緩沖區(qū)中,用戶對數(shù)據(jù)的操作是在緩沖區(qū)中進行的。當用戶操作數(shù)據(jù)時,就會產(chǎn)生大量的日志信息并存儲在重做日志緩沖區(qū),當Oracle系統(tǒng)滿足一定條件時,日志寫入(LGWR)進程會將日志信息寫入重做日志文件組中,當發(fā)生日志切換時(寫入操作正要從一個日志文件組切換到另一組時),就會啟動檢查點進程。

另外,數(shù)據(jù)庫管理員(DBA)還可以通過修改初始化參數(shù)文件SPFILE中的CHECKPOINT_PROCESS參數(shù)為TRUE來啟動檢查點進程。

3.日志寫入進程

日志寫入(LGWR)進程用于將重做日志緩沖區(qū)中的數(shù)據(jù)寫入日志文件中。Oracle系統(tǒng)首先將用戶所做的修改日志信息寫入日志文件中,然后再將修改結果寫入數(shù)據(jù)文件中。

Oracle實例在運行中會產(chǎn)生大量日志信息,這些日志信息首先被記錄在SGA的重做日志緩沖區(qū)中,當發(fā)生提交命令,或者重做日志緩沖區(qū)的信息滿1/3,或者日志信息存儲超過3 s時,LGWR進程就將日志信息從重做日志緩沖區(qū)中讀出并將其寫入日志文件組中序號較小的文件中,在一個日志文件組中被寫滿后接著寫入另外一組中。當LGWR進程將所有的日志文件都寫過一遍之后,它將再次轉向第一個日志文件組重新覆蓋,如圖2.17所示。當LGWR進程寫滿一個日志文件組而轉向寫另外一組時,稱之為日志切換。

4.歸檔進程

歸檔(ARCH)進程是一個可選擇的進程,只有當Oracle數(shù)據(jù)庫處于歸檔模式時,該進程才可能起到作用。若Oracle數(shù)據(jù)庫處于歸檔模式,當各個日志文件組都被寫滿,在即將被覆蓋之前,先由ARCH把即將被覆蓋的日志文件中的日志信息讀出,然后再把這些“讀出的日志信息”寫入歸檔日志文件中,如圖2.18所示。

圖2.17 通過LGWR寫日志文件

圖2.18 通過ARCH寫歸檔文件

當系統(tǒng)比較繁忙而導致LGWR進程處于等待ARCH進程時,可通過修改LOG_ARCHIVE_MAX_PROCESSES參數(shù)啟動多個歸檔進程,進而提高歸檔寫磁盤的速度。

5.系統(tǒng)監(jiān)控進程

系統(tǒng)監(jiān)控(SMON)進程是在數(shù)據(jù)庫系統(tǒng)啟動時執(zhí)行回復工作的強制性進程。例如,在并行服務器模式下,SMON可以回復另一條處于失敗的數(shù)據(jù)庫,使系統(tǒng)切換到另一臺正常的服務器上。

6.進程監(jiān)控進程

進程監(jiān)控(PMON)進程用于監(jiān)控其他進程的狀態(tài),當有進程啟動失敗時,PMON會清除失敗的用戶進程,釋放用戶進程所用的資源。

7.鎖進程

鎖(LCKN)進程是一個可選進程,在并行服務器模式下可以出現(xiàn)多個鎖定進程以利于數(shù)據(jù)庫通信。

8.恢復進程

恢復(RECO)進程是在分布式數(shù)據(jù)庫模式下使用的一個可選進程,用于數(shù)據(jù)不一致時的恢復工作。

9.調度進程

調度(DNNN)進程是一個可選進程,在共享服務器模式下使用,可以啟動多個調度進程。

10.快照進程

快照(SNPN)進程用于處理數(shù)據(jù)庫快照的自動刷新,并通過DBMS_JOB包運行預定的數(shù)據(jù)庫存儲過程。

以上講解了Oracle中的若干個典型進程。Oracle的版本不同,其后臺進程也不同,默認情況下Oracle會啟動200多個后臺進程。

【例2.19】從v$bgprocess數(shù)據(jù)字典中查詢當前實例的進程信息,代碼如下。(實例位置:資源包\TM\sl\2\9)

     SQL> set pagesize 50;
     SQL> select name,description from v$bgprocess;

本例運行結果如圖2.19所示。

圖2.19 當前實例進程信息

互動練習:回顧Oracle執(zhí)行SQL查詢語句的步驟。

主站蜘蛛池模板: 南丹县| 贵南县| 云南省| 康乐县| 泰兴市| 大洼县| 中卫市| 沂源县| 武汉市| 定结县| 绥中县| 普洱| 宣恩县| 武义县| 霍邱县| 郑州市| 惠水县| 图们市| 东辽县| 天台县| 广昌县| 武平县| 兰坪| 纳雍县| 河池市| 屏南县| 禄丰县| 宁都县| 商都县| 合阳县| 钟祥市| 永德县| 尤溪县| 米脂县| 北票市| 上高县| 仲巴县| 西宁市| 双江| 甘泉县| 镇安县|