書名: Oracle 11g從入門到精通(第2版) (軟件開發視頻大講堂)作者名: 明日科技本章字數: 5557字更新時間: 2020-11-28 15:54:50
2.4 Oracle 11g服務器結構
視頻講解:光盤\TM\lx\2\服務器結構.mp4
Oracle服務器主要由實例、數據庫、程序全局區和前臺進程組成,如圖2.15所示。其中,實例就是圖2.15中的Instance區域,用來提供管理數據庫的功能;數據庫就是圖2.15中的Database區域,由Oracle數據庫文件組成,用來存儲系統數據。

圖2.15 Oracle服務器結構模型
實例可以進一步劃分為系統全局區(SGA)和后臺進程(PMON、SMON等)兩部分,其中,SGA使用操作系統的內存資源,而后臺進程需要使用CPU與內存資源;數據庫(Database)中包含數據文件(Data files)、控制文件(Control files)和重做日志文件(Redo log file),數據庫文件存放在硬盤中;程序全局區(PGA)是一個非共享的內存區域,用于管理用戶進程的私有資源;前臺進程可以再劃分為用戶進程和服務器進程,它們需要使用CPU與內存資源。上節已經對數據庫的3種物理文件進行過詳細講解,本節主要對實例、程序全局區和前臺進程進行詳細的講解。
2.4.1 系統全局區(SGA)
系統全局區(System Global Area)是所有用戶進程共享的一塊內存區域,也就是說,SGA中的數據資源可以被多個用戶進程共同使用。SGA主要由高速數據緩沖區、重做日志緩存區、共享池、大型池和Java池等內存結構組成。SGA隨著數據庫實例的啟動而加載到內存中,當數據庫實例關閉時,SGA區域也就消失了。
1.高速數據緩沖區(Database buffer cache)
高速數據緩沖區中存放著Oracle系統最近訪問過的數據塊(數據塊在高速緩沖區中也可稱為緩存塊)。當用戶向數據庫發出請求時(如檢索某一條數據),如果在高速數據緩沖區中存在請求的數據,則Oracle系統會直接從高速數據緩沖區中讀取數據并返回給用戶,否則,Oracle系統會打開數據文件讀取請求的數據。
若無法在高速數據緩沖區中找到所需要的數據,則Oracle首先從數據文件中讀取指定的數據塊到緩沖區,然后再從緩沖區中將請求的數據返回給用戶。由于高速數據緩沖區被所有的用戶所共享,只要數據文件中的某些數據塊被當前用戶或其他用戶請求過,那么這些數據塊就會被裝載到高速數據緩沖區中。這樣當任何用戶再次訪問相同的數據時,Oracle就不必再從數據文件中讀取數據,而是可以直接將緩沖區中的數據返回給用戶。經常或最近被訪問的數據塊會被放置到高速數據緩沖區前端,不常被訪問的數據塊會被放置到高速數據緩沖區的后端,當高速數據緩沖區填滿時,會自動擠掉一些不常被訪問的數據塊。
以存取速度來看,內存的讀取速度遠快于物理硬盤,所以高速數據緩沖區的存在可大大降低對物理磁盤的讀取頻率,從而達到提高數據庫服務器性能的目的。為了便于管理SGA的內存數據,Oracle把高速數據緩沖區分為以下3個部分。
臟數據區
臟數據區中存放著已被修改過的數據,這些數據等待被寫入數據文件中。當一條更新或刪除語句對某些數據塊中的數據修改后,那么這些數據塊就被標記為“臟”,然后等待提交命令并通過后臺進程DBWR將其寫入數據文件中。
空閑區
空閑區中的數據塊不包含任何數據,這些數據塊可以被寫入數據,Oracle可以從數據文件中讀取數據塊,并將其存放到該區中。
保留區
保留區包含那些正在被用戶訪問的數據塊和明確保留以作為將來使用的數據塊(即緩存塊),這些數據塊將被保留在緩沖區中。
2.重做日志緩沖區(Redo log buffer cache)
重做日志緩沖區用于存放對數據庫進行修改操作時所產生的日志信息,這些日志信息在寫入重做日志文件之前,首先存放到重做日志緩沖區中,然后,在檢查點發生或重做日志緩沖區中的信息量到達一定峰值時,最后由日志寫入進程(LGWR)將此緩沖區的內容寫入到重做日志文件。
重做日志緩沖區的大小由LOG_BUFFER參數指定,該參數也可以在實例啟動后動態修改。相對于高速數據緩沖區而言,重做日志緩沖區的大小對數據庫性能的影響較小,通常較大的重做日志緩沖區能減少重做日志文件對I/O的讀寫次數,對數據庫的整體性能有一定的提高。
3.共享池(Shared Pool)
共享池是SGA保留的內存區域,用于緩存SQL語句、PL/SQL語句、數據字典、資源鎖、字符集以及其他控制結構等。共享池包含庫高速緩沖區(Library cache)和字典高速緩沖區(Dictionary cache)。
(1)庫高速緩沖區(Library cache)
庫高速緩沖區是共享池的一部分,主要包括共享SQL區和私有SQL區兩個組成部分。庫高速緩沖區中存放最近用過的SQL語句、PL/SQL語句的文本和執行計劃。當下一次執行相同的SQL語句或PL/SQL語句時,可以直接在庫高速緩沖區中找到之前已生成的執行計劃,而不需要再次解析相同的SQL語句或PL/SQL語句,從而提高系統執行效率。
每條被緩存的SQL或PL/SQL語句都被分成兩個部分,分別被存放在共享SQL區和私有SQL區中。共享SQL區存放SQL或PL/SQL語句的語法分析結果和執行計劃,如果以后要再次執行類似的語句,則可以利用共享SQL區中已緩存的語法分析結果和執行計劃。私有SQL區存放SQL語句中的綁定變量、環境和會話等信息,這些信息屬于執行該語句的用戶的私有信息,其他用戶則無法共享這些信息。
(2)字典高速緩沖區(Dictionary cache)
用于存放Oracle系統內部管理所需要的數據字典信息,如用戶名、數據對象和權限等。
共享池的內存空間大小是可以動態改變的,一般通過修改參數SHARED_POOL_SIZE的值來實現。
【例2.16】 修改Oracle共享池的內存空間大小為30MB,代碼及運行結果如下。
SQL> alter system set shared_pool_size=30m; 系統已更改。
注意
Oracle共享池的空間不是越大越好,因為系統的內存資源是有限的,而且操作系統本身也要消耗一定的內存空間。
互動練習:改變數據庫高速緩沖區的大小。
4.大型池(Large pool)
大型池在SGA區中不是必需的內存結構,只在某些特殊情況下,實例需要使用大型池來減輕共享池的訪問壓力,常用的情況有以下幾種。
當使用恢復管理器進行備份和恢復操作時,大型池將作為I/O緩沖區使用。
使用I/O Slave仿真異步I/O功能時,大型池將被當作I/O緩沖區使用。
執行具有大量排序操作的SQL語句。
當使用并行查詢時,大型池作為并行查詢進程彼此交換信息的地方。
大型池的緩存區大小是通過LARGE_POOL_SIZE參數定義的,在Oracle 11g中,用戶可以使用alter system命令動態地修改其緩存區的大小。
【例2.17】 修改Oracle大型池的緩存區大小為16MB,代碼及運行結果如下。
SQL> alter system set large_pool_size = 16m; 系統已更改。 SQL> show parameter large_pool_size; NAME TYPE VALUE ------------------------------------ ----------- ----------------------------- large_pool_size big integer 16M
注意
如果在SGA區中沒有設置大型池,則在實例需要時,Oracle系統會在共享池或PGA中分配一定的緩存空間,這樣勢必會影響到共享池或PGA的工作效率。
5.Java池
用來提供內存空間給Java虛擬機使用,目的是支持在數據庫中運行Java程序包,其大小由JAVA_POOL_SIZE參數決定。
6.流池
Oracle流池用于在數據庫與數據庫之間進行信息共享。如果沒有用到Oracle流,就不需要設置該池。流池的大小由參數STREAMS_POOL_SIZE決定。
2.4.2 程序全局區(PGA)
程序全局區(Program Global Area)也可稱作用戶進程全局區,它的內存區在進程私有區而不是共享區中。雖然PGA是一個全局區,可以把代碼、全局變量和數據結構都可以存放在其中,但區域內的資源并不像SGA一樣被所有的用戶進程所共享,而是每個Oracle服務器進程都只擁有屬于自己的那部分PGA資源。
在程序全局區中,一個服務進程只能訪問屬于它自己的那部分PGA資源區,各個服務進程的PGA的總和即為實例的PGA的大小。通常PGA由私有SQL區和會話區組成。
1.私有SQL區
私有SQL區用于存儲變量以及SQL語句運行時的內存結構信息,當每個用戶連接到實例時,都會在實例中創建一個會話。這些會話可能會在SGA區中創建一個共享SQL區,但在PGA區中可能會創建多個私有SQL區。把一個私有SQL區與對應的共享SQL區合并在一起,就可以獲得一條SQL語句的完整緩存數據。
另外,每個會話的私有SQL區可以再分為靜態區和動態區兩部分。靜態區的信息在會話過程中保持不變,只有當會話結束時,靜態區才會被釋放掉;而動態區的信息在整個會話過程中是不斷變化的,一旦SQL語句指定完畢,即使會話還沒有結束,動態區就被釋放掉。
2.會話區
會話區用于存放用戶的會話信息(如登錄用戶名)。如果數據庫處于共享服務器連接模式下,則會話區將位于SGA中,而不是PGA中,這點需要用戶特別注意。
查看程序全局區的信息可以通過顯示PGA參數的內容來實現。
【例2.18】 顯示當前用戶進程的PGA信息,代碼及運行結果如下。
SQL> show parameter pga; NAME TYPE VALUE ------------------------------------ ----------- ----------------------------- pga_aggregate_target big integer 18M
2.4.3 前臺進程
前臺進程包括用戶進程和服務器進程,它不屬于實例的一部分,但是用戶在不知不覺中經常會用到它,使用前臺進程能夠實現用戶與實例的溝通,下面對這兩種前臺進程進行講解。
1.用戶進程
用戶進程是指那些能夠產生或執行SQL語句的應用程序,無論是SQL*Plus,還是其他應用程序,只要是能生成或執行SQL語句,都被稱作用戶進程。
在用戶進程中有兩個非常重要的概念:連接和會話。連接是一個用戶進程與實例之間建立的通信渠道,這個渠道可以通過操作系統上的相關通信機制或網絡連接來實現。會話是指在用戶進程與實例之間建立連接后形成的用戶與實例之間的交互方式,一般是用戶發出請求,數據庫實例為用戶返回響應消息的方式。例如,用戶在SQL*Plus中發出connect system/1qaz2wsx的請求命令,若用戶名和密碼都正確,則數據庫實例返回“已連接”的響應消息。
2.服務器進程
服務器進程是用于處理用戶會話過程中向數據庫實例發出的SQL語句或SQL*Plus命令,它可以分為專用服務器模式和共享服務器模式。在專用服務器模式下,每個用戶進程都有一個專用的服務器進程,這個服務器進程代表用戶進程執行SQL語句,必要時還可以回傳執行結果給用戶進程。在共享服務器模式下,每個用戶進程不直接與服務器進程連接,而是連接到分派程序,每個分派程序可以同時連接多個用戶進程。
2.4.4 后臺進程
Oracle后臺進程是一組運行于Oracle服務器端的后臺程序,是Oracle實例的重要組成部分。這組后臺進程有若干個,它們分工明確—分別完成不同的系統功能,如圖2.16所示。其中SMON、PMON、DBWR、LGWR和CKPT這5個后臺進程必須正常啟動,否則將導致數據庫實例崩潰。此外,還有很多輔助進程,用于實現相關的輔助功能,如果這些輔助進程發生問題,只是某些功能受到影響,一般不會導致數據庫實例崩潰。下面對其中的主要進程進行講解。

圖2.16 主要后臺進程
1.數據寫入進程(DBWR)
數據寫入進程的主要任務是負責將內存中的“臟”數據塊回寫到數據文件中。所謂的“臟”數據塊是指高速數據緩沖區中被修改過的數據塊,這些數據塊的內容與數據文件的數據塊內容不一致。但DBWR并不是隨時將所有的“臟”數據塊都寫入數據文件,只有滿足一定的條件時,DBWR進程才開始成批量地將“臟”數據塊寫入數據文件,Oracle這樣做的目的是盡量減少I/O操作,提高Oracle服務器性能。通常在以下幾種情況發生時,DBWR進程會將“臟”數據塊寫入數據文件。
當用戶進程執行插入或修改等操作時,需要將“新數據”寫入到高速數據緩沖區,如果在高速數據緩沖區中沒有找到足夠用的空閑數據塊來存放這些“新數據”,這時,Oracle系統將啟動DBWR進程并將“臟”數據塊寫入到數據文件,以獲得空閑數據塊來存儲這些“新數據”。
檢查點進程啟動后,它會強制要求DBWR將某些“臟”數據塊寫入數據文件。
當“臟”數據塊在高速數據緩沖區中存放超過3秒鐘,DBWR進程會自行啟動并將某些“臟”數據塊寫入數據文件。
在某些比較繁忙的應用系統中,可以修改服務器參數文件SPFILE的DB_WRITER_PROCESSES參數,以允許使用多個DBWR進程。但是DBWR進程的數量不應當超過系統處理器的數量,否則多余的DBWR不但無法發揮作用,反而會耗費系統資源。
2.檢查點進程(CKPT)
檢查點進程可以看作是一個事件,當檢查點事件發生時,CKPT會要求DBWR將某些“臟”數據塊回寫到數據文件。當用戶進程發出數據請求時,Oracle系統從數據文件中讀取需要的數據并存放到高速數據緩沖區中,用戶對數據的操作是在緩沖區中進行的。當用戶操作數據時,就會產生大量的日志信息并存儲在重做日志緩沖區,當Oracle系統滿足一定條件時,日志寫入進程(LGWR)會將日志信息寫入重做日志文件組中,當發生日志切換時(寫入操作正要從一個日志文件組切換到另一組時),就會啟動檢查點進程。
另外,數據庫管理員(DBA)還可以通過修改初始化參數文件SPFILE中的CHECKPOINT_PROCESS參數為TRUE來啟動檢查點進程。
3.日志寫入進程(LGWR)
日志寫入進程用于將重做日志緩沖區中的數據寫入重做日志文件。Oracle系統首先將用戶所做的修改日志信息寫入日志文件,然后再將修改結果寫入數據文件。
Oracle實例在運行中會產生大量日志信息,這些日志信息首先被記錄在SGA的重做日志緩沖區中,當發生提交命令,或者重做日志緩沖區的信息滿1/3,或者日志信息存放超過3秒鐘時,LGWR進程就將日志信息從重做日志緩沖區中讀出并寫入日志文件組中序號較小的文件中,一個日志組寫滿后接著寫另外一組。當LGWR進程將所有的日志文件都寫過一遍之后,它將再次轉向第一個日志文件組重新覆蓋,如圖2.17所示。當LGWR進程寫滿一個日志文件組而轉向寫另外一組時,稱之為日志切換。

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

圖2.18 通過ARCH寫歸檔文件
當系統比較繁忙而導致LGWR進程處于等待ARCH進程時,可通過修改LOG_ARCHIVE_MAX_PROCESSES參數啟動多個歸檔進程,從而提高歸檔寫磁盤的速度。
5.系統監控進程(SMON)
系統監控進程是在數據庫系統啟動時執行回復工作的強制性進程。比如,在并行服務器模式下,SMON可以回復另一條處于失敗的數據庫,使系統切換到另外一臺正常的服務器上。
6.進程監控進程(PMON)
進程監控進程用于監控其他進程的狀態,當有進程啟動失敗時,PMON會清除失敗的用戶進程,釋放用戶進程所用的資源。
7.鎖進程(LCKN)
鎖進程是一個可選進程,并行服務器模式下可以出現多個鎖定進程以利于數據庫通信。
8.恢復進程(RECO)
這是在分布式數據庫模式下使用的一個可選進程,用于數據不一致時進行恢復工作。
9.調度進程(DNNN)
調度進程是一個可選進程,在共享服務器模式下使用,可以啟動多個調度進程。
10.快照進程(SNPN)
快照進程用于處理數據庫快照的自動刷新,并通過DBMS_JOB包運行預定的數據庫存儲過程。
以上講解了Oracle 11g中的若干個典型進程,不同版本Oracle的后臺進程也不同,默認情況下,Oracle 11g會啟動200多個后臺進程。
【例2.19】 從V$BGPROCESS數據字典中查詢當前實例進程信息,代碼如下(實例位置:光盤\TM\sl\2\9)。
SQL> set pagesize 50; SQL> select name, description from v$bgprocess;
本例運行結果如圖2.19所示。

圖2.19 當前實例進程信息
互動練習:Oracle執行SQL查詢語句的步驟。
- 深入理解Android(卷I)
- 摩登創客:與智能手機和平板電腦共舞
- PHP網絡編程學習筆記
- YARN Essentials
- Mastering Ext JS
- Linux Device Drivers Development
- 運用后端技術處理業務邏輯(藍橋杯軟件大賽培訓教材-Java方向)
- Multithreading in C# 5.0 Cookbook
- Building Wireless Sensor Networks Using Arduino
- Statistical Application Development with R and Python(Second Edition)
- 區塊鏈項目開發指南
- PyQt編程快速上手
- Machine Learning for OpenCV
- Puppet 5 Beginner's Guide(Third Edition)
- LabVIEW入門與實戰開發100例(第4版)