1. 程式人生 > 其它 >體系架構之伺服器結構

體系架構之伺服器結構

目錄

oracle伺服器結構

oracle伺服器主要有例項、資料庫、PGA(程式全域性區)和前臺程序組成。如下面的經典圖例:

例項進一步劃分為SGA(系統全域性區)和後臺程序(PMON、SMON等)。

其中SGA使用作業系統的共享記憶體資源,而後臺程序需要使用CPU和共享記憶體資源

PGA是一個非共享的記憶體區域,用於管理使用者程序的私有資源。

資料庫中包含資料檔案、控制檔案、和重做日誌檔案,這些檔案存在硬碟中。

前臺程序可以再劃分為使用者程序和伺服器程序,他們需要使用CPU和記憶體資源

1. 系統全域性區—SGA

SGA是所有使用者共享的一塊記憶體區域,也就是說,SGA中的資料資源可以被多個使用者程序共同使用。如圖所示:SGA主要由共享池(Share Pool)、資料高速緩衝區(Database Buffer Cache)、重做日誌緩衝區(Redo Log Buffer)、java池和大型池等記憶體結構構成。SGA區域會隨例項啟動而被載入至記憶體中,也隨例項關閉消失。

SGA區中發生了什麼:

  • SQL語句在這裡被解析,生成執行計劃,執行計劃被共享。

  • 資料在這裡被訪問,被共享。

  • 重做日誌在這裡被產生。

1.1 共享池(Shared Pool)

共享池是SGA保留的記憶體區域,用於快取SQL、PL/SQL語法分析、編譯、執行資訊和資料字典、資源鎖、字符集、包等。共享池包含庫高速緩衝區(library cache)和資料字典快取(dictionary cache)和結果快取(result cache)

共享池的大小影響效能,但也並非越大越好。

共享池的記憶體大小是可以動態修改的,通過修改SHARED_POOL_SIZE值實現。

1.庫高速緩衝區

sql 和 plsql 的解析場所,存放 sql/plsql 語句程式碼,以及它們的執行計劃。以備其他使用者共享

庫高速緩衝區是共享池的一部分,主要包括共享SQL區和私有SQL區兩個部分,還有PL/SQL儲存過程和控制結構等等。庫快取儲存最近使用過的SQL語句、PL/SQL語句的文字和執行計劃。當下一次執行相同的SQL語句或PL/SQL語句時,可以直接在庫高速緩衝中找到之前已生成的執行計劃(重用執行計劃),而不需要再次解析相同的語句,從而提高執行效率。這個稱作軟解析(soft pase)或者叫做library cache hit,反之,SQL將被重新解析,這個過程稱為hard parse或者叫library cache miss.

每條被快取的SQL/PLSQL語句都被分為兩部分,分別存在共享SQL區和私有SQL區。共享SQL區儲存的是SQL/PLSQL語句解析結果和執行計劃;私有SQL區儲存語句的繫結變數、環境和會話資訊等,這些都是使用者的私有資訊,無法共享給其他使用者。

Oracle沒有提供直接修改庫快取記憶體大小的方法,只能通過修改共享池的大小來間接修改庫快取記憶體的大小。

2.資料字典快取

存放著oracle系統內部管理所需要的資料字典資訊,如要使用者、資料物件、許可權相關的等,一些資料字典資訊以備其他使用者共享使用。

3.server result cache

存放伺服器端的 SQL 結果集及 PL/SQL 函式結果

這部分記憶體中保留了SQL查詢的結果集,這樣對於後續的相同查詢,Oracle無需重新載入資料塊進行計算,直接使用現有的資料集。

由引數RESULT_CACHE_MODE設定

​ 預設值 Manual,需要使用 RESULT_CACHE hint來啟用

​ FORCE 對所有SELECT操作生效(會消耗更多shared_pool空間)

4.User Global Area (UGA):

共享伺服器連線模式下如果沒有配置 large pool,則 UGA 屬於 SGA 的 shared pool, 專用連線模式時 UGA 屬於 PGA

1.2 資料高速緩衝區(Data Buffer Cache)

資料高速緩衝區中儲存著oracle系統最近訪問的塊(資料塊在快取記憶體區中也可稱為快取塊)。當用戶像資料庫發出請求時,如果快取記憶體區中存在請求的資料,則這直接在其中取出並返回給使用者;否則從資料檔案讀取到快取記憶體區中,然後從快取記憶體區中將資料返回給使用者。

快取記憶體區儲存從磁碟資料檔案中讀入的資料,為所有使用者共享。只要資料檔案的某些資料被某個使用者請求過,就會被裝載到快取記憶體區中,其他使用者請求時就直接從快取記憶體區中取。

oracle使用LRU(least recently used)演算法管理buffer cache.即清楚最早沒有使用的資料塊。經常被被訪問的資料塊會被放到快取記憶體區的前端,不經常訪問的會被放在快取記憶體區的後端,大小是有限的,所有會擠掉一些不常被訪問的資料塊。

記憶體的速度遠遠大於磁碟,資料高速緩衝區的存在大大降低了對物理磁碟的讀取頻率,從而提高了效能。

資料高速緩衝區由三種類型:

  • 髒區(Dirty Buffers):儲存這被修改過的資料,這些資料等待被寫入資料檔案中。當資料塊被修改後,這些資料庫就是髒塊,等待提交併通過後臺程序DBWR將其寫入資料檔案中。
  • 空閒區(Free Buffers):不包含任何資料,這些資料庫可以被寫入資料,oracle可以從資料檔案中讀出塊儲存到該區。
  • 保留區(Pinned Buffers):包含正在被使用者訪問的資料庫和明確保留以作將來使用的資料塊,這些資料庫將被保留在緩衝區中。

資料庫高速緩衝區由db_cache_size引數設定

1.3重做日誌緩衝區(Redo Log Buffer)

對資料庫進行修改操作時會產生日誌資訊,這些日誌資訊在寫入重做日誌檔案之前,首先寫入到重做日誌緩衝區中,當檢查點發生或資訊量到達一定峰值時,由LGWR(日誌寫入程序)將緩衝區的檔案寫入重做日誌檔案。

重做日誌緩衝區的大小由log_buffer指定,該引數例項啟動後可以動態修改。相對於高速資料緩衝區而言,重做日誌緩衝區對資料庫效能影響較小,通常較大的重做日誌緩衝區能減少重做日誌檔案滴哦I/O的讀寫次數,對資料庫的整體效能有一定提高。

1.4大型池(Large Pool)

大型池在SGA中不是必須的記憶體結構,他是可選的緩衝區。在一些特殊情況下,例項才需要大型池來減輕共享池的壓力,例如:

  • 當使用RMAN進行並行備份恢復操作時,大型池將作為I/O緩衝區使用
  • 使用I/O Slave模擬非同步I/O功能時,大型池將作為I/O緩衝區使用
  • 執行具有大量排序操作的sql語句
  • 使用並行查詢時,大型池作為並行查詢程序彼此交換資訊的地方
--大型池的緩衝區時通過large_pool_size引數定義的
alter system set large_pool_size=16m;

如果SGA中沒有設定大型池,則在例項需要時,Oracle會在共享池或者PGA中分配一定快取空間,這可能影響共享池或PGA的工作效率

1.5java池(java pool)

為了 java 虛擬機器及應用而分配的記憶體空間,包含所有 session 指定的 JAVA 程式碼和資料,目的時為了支援在資料庫中執行java程式包,大小由引數java_pool_size決定。

1.6流池(stream pool)

為了 stream process 而分配的記憶體空間。stream 技術是為了在不同資料庫之間共享資料,因此,它只針對使用了 stream 資料庫特性的系統。大小由引數streams_pool_size絕定。

2. 程式全域性區—PGA

程式全域性區(program global area)又稱為使用者程序全域性區。

PGA的作用:

①快取來自伺服器程序和後臺程序的資料和控制資訊。

②提供排序、hash 連線

③不提供 session 之間的共享,

④PGA 在程序建立時被分配,程序終止時被釋放。所有程序的 PGA 之和構成了 PGA 的大小

他的記憶體區在程序私有區中,而不是共享區中。PGA是一個全域性區,可以把程式碼、全域性變數和資料結構都儲存在其中,但是區域內的資源並不像SGA一樣可以被所有使用者共享,而每個Oracle伺服器程序都有自己的那部分PGA資源

PGA結構:

①SQL 工作區(SQL Work Area): 有幾個子區 1、Sort Area, 2、Harh Area 3、Bitmap Merge Area 作用:排序操作(order by/group by/distinct/union 等),多表 hash 連線,點陣圖連線,建立點陣圖

②會話空間(Session Memory) 作用:存放 logon 資訊等會話相關的控制資訊

③私有 SQL 區域(Private SQL Area) 作用:儲存 server process 執行 SQL 所需要的私有資料和控制結構,如繫結變數,它包括固定區域和執行時區域

④遊標區域(Cursor Area):PLSQL 遊標使用的就是這塊區域

3. 前臺程序和連線方式

前臺程序包括使用者程序和伺服器程序,他不屬於例項的一部分,用於使用者與例項的溝通。

3.1使用者程序

使用者程序指的是那些能夠產生或執行SQL語句的應用程式,無論是SQL*PLUS還是還是其他應用程式。

使用者程序有兩個重要概念,連線和會話。連線是一個使用者程序與例項之間建立的連線渠道,這個渠道通過作業系統的相關通訊機制和網路連線實現;會話是指使用者程序和例項建立連線之後形成的使用者與例項之間的互動方式,一般是使用者發出的請求,資料庫例項為使用者返回響應訊息的方式。例如SQL*PLUS中發出connect system/123456的請求命令,正確連線例項後返回已連線的相應訊息。

3.2伺服器程序

伺服器程序用於處理使用者會話過程中向例項發出的SQL語句或者SQL/SQL*PLUS命令,他可以分為專用伺服器模式和共有伺服器模式。

#伺服器端的程序,user process 不能直接訪問 Oracle,必須通過相應的 server process 訪問例項,進而訪問資料庫。
[oracle@db1 ~]$ ps -ef |grep LOCAL
#在 linux 下看到的 server process, (LOCAL=YES)是本地連線,(LOCAL=NO)是遠端連線。

#可以在 oracle 檢視 V$process 檢視,它包括了當前所有的後臺程序和伺服器程序。
SQL> select pid,program,background from v$process;
#background 欄位為 1 是 background process,其餘都是 server process

3.3專用連線和共享連線

專用伺服器模式下,每個使用者都有一個專用的伺服器程序,這個伺服器程序代表使用者程序執行SQL語句,必要時回傳結果給使用者程序;

在共享伺服器模式下,每個程序不直接與伺服器連線,而是連線到分派程式,每個分派程式可以同時連線多個使用者。

專用連線模式(dedicated)

對於客戶端的每個 user process,伺服器端都會出現一個 server process,會話與專用伺服器之間存在一對一的對映(一根繩上的兩個螞蚱)。

專用連線的 PGA 的管理方式是私有的。Oracle 預設採用專用連線模式。

共享連線模式(shared)

多個 user process 共享一個 server process。

①,共享伺服器實際上就是一種連線池機制(connectionpooling),連線池可以重用已有的超時連線,服務於其它活動會話。但容易產生鎖等待。此種連線方式現在已經很少見了(具體配置方法見第十四章 Oracle 網路)。

②所有排程程序(dispatcher)共享一個公共的請求佇列(resquest queue),但是每個排程程序都有與自己響應的佇列(response queue)。

③在共享伺服器中會話的(UGA)儲存資訊是在 SGA 中的,而不像專用連線那樣在 PGA 中儲存資訊,這時的 PGA 的儲存結構為堆疊空間。

駐留連線池模式(database resident connection pooling,簡稱 DRCP):

適用於必須維持資料庫的永久連線。結合了專用伺服器模式和共享伺服器模式的特點。它使用連線代理(而不是專用伺服器)連線客戶機到資料庫,優點是可以用很少的記憶體處理大量併發連線(11g 新特性,特別適用於 Apache 的 PHP 應用環境)。

4. 後臺程序

oracle後臺程序是一組運行於oracle伺服器端的後臺程式,是oracle例項的重要組成部分,它們是一組分工明確、分別完成不同功能的程序。例如SMON、PMON、DBWn、LGWR、CKPT等程序必須正常啟動,否則例項崩潰。包括其他一些輔助程序,輔助實現相關功能。

--後臺程序檢視,也可以在作業系統中過濾檢視程序
--background 欄位為 1 是 background process,其餘都是 server process
SQL> select pid,program,background from v$process;

       PID PROGRAM                                          BACKGROUND
---------- ------------------------------------------------ ----------
         1 PSEUDO                                           
         2 oracle@db1 (PMON)                                1
         3 oracle@db1 (CLMN)                                1
         4 oracle@db1 (PSP0)                                1
         5 oracle@db1 (VKTM)                                1
         6 oracle@db1 (GEN0)                                1
。。。。。。。。。。。。。。
79 rows selected

--v$bgprocess資料字典值檢視當前例項的程序資訊
SQL> select name description from v$bgprocess;

DBWn

資料寫入程序(DBWn,也叫DBWR)的任務是將修改後的(在記憶體)的資料塊寫回到資料檔案中,可以修改spfile的db_writer_processes引數來設定多個程序,這樣對應的程序名就位DBW0,DBW1,DBW2...等,作業系統中對應的程序名為ora_dbw0_。但是DBWR程序數量不應超過處理器的數量。

作用:將buffer cache中髒資料(修改過的資料)寫入資料檔案中,釋放資料緩衝區空間。由於資料塊在磁碟上

的位置不連續,這個過程會比LGWR比較耗時。

觸發條件:

①ckpt 發生

②髒塊太多時(閾值)

③db_buffer 自由空間不夠時

④3 秒

⑤表空間 read only/offline/backup 模式等

以上 5 個狀況之一發生時,dbwn 都會被觸發

LGWR

日誌寫入程序(LGWR)

作用:

  1. 將重做日誌緩衝區的日誌條目寫入日誌檔案中
  2. 不像 DBWR 可以有多個程序並行工作,LGWR 只有一個工作程序

觸發條件:

  1. 使用者提交
  2. 重做日誌緩衝區滿1/3時
  3. 有大於1M的重做日誌緩衝區未被寫入磁碟(不同版本可能不同,隱含引數_LOG_IO_SIZE控制)
  4. 每隔3 秒鐘
  5. DBWR 需要寫入的資料的SCN大於LGWR記錄的SCN,DBWR 觸發LGWR寫入。

CKPT

檢查點程序也被稱為檢查點事件,當發生檢查點事件時,CKPT會要求DBWR將某些髒資料塊回寫到資料檔案,當用戶程序發出資料請求時,oracle系統會從資料檔案中讀取需要的資料並存儲在高速資料快取區中,使用者對資料的操作是在緩衝區中進行的。當滿足一定條件時,LGWR程序會將日誌資訊寫入重做日誌檔案組中,當發生日誌切換時(寫入操作正要從一個日誌組切換到另一個日誌組時),就會啟動檢查點程序。

作用:通知或督促 dbwr 寫髒塊和維護資料庫一致性。CKPT程序通知DBWn程序開始將記憶體(buffer cache)中的髒資料寫到磁碟的檔案上。CKPT負責更新檔案頭和控制檔案的資訊。

1、完全檢查點:保證資料庫的一致性。

2、增量檢查點:不斷更新控制檔案中的檢查點位置,當發生例項崩潰時,可以儘量縮短例項恢復的時間。

3、區域性檢查點:特定的操作下,針對某個表空間。

目的:

  • 減少資料庫例項恢復的時間

  • 讓記憶體中的髒資料及時的寫到磁碟上。

  • 在安全關閉資料庫時,保證所有提交的資料被寫到磁碟上。

ARCH

歸檔程序(ARCH、ARCn)

歸檔模式下,發生日誌切換時,把當前日誌組中的內容寫入歸檔日誌,作為歷史日誌提供資料庫的 recovery

可修改log_archive_max_processes引數來啟動多個歸檔程序

ARCn程序在data guard下,負責將日誌向standby 伺服器傳送

SMON

smon:系統監控程序

主要作用:

  • 資料庫啟動時的例項恢復,在RAC環境下,一個節點的SMON可以對另外一個節點做例項恢復
  • 清理和釋放臨時段上的資料(排序,臨時表...)
  • 對於DMT(字典管理表空間),SMON可以合併連續空閒的extent.
  • 維護回滾段的online,offline以及空間的回收。

PMON

pmon:程序監控程序,用於監控其他程序的狀態。例如有程序啟動失敗時,pmon會清除失敗的使用者程序,釋放資源。

pmon處理的一些情況:

  • 程序異常終止
  • 會話被kill
  • 監控空閒會話是否到達閾值(如事務超過空閒時間)
  • 動態註冊監聽

Pmon程序的清理工作:

– 回滾未提交的事務,釋放事務相關的資源

​ 重置undo資料塊上的事務表的狀態為inactive。

​ 釋放事務產生的鎖。

​ 從v$session中清除異常終止的會話ID。

其他程序

ASMB--ASM例項的核心後臺程序,負責管理ASM的儲存。

RBAL--ASM的rebalance程序,負責ASM資料的rebalance操作。

SNPN--快照程序,處理資料庫快照相關任務

CJQ0--job任務協調程序,負責資料庫中JOB的自動執行

Jnnn--job具體執行程序,接受CJQ0分發的job任務

MMAN--記憶體管理程序,負責記憶體的動態管理,分配和收回。

Pnnn--並行執行子程序,接受並行協調程序分配的任務並執行。

Snnn--MTS下共享程序。

RECO--分散式事務的恢復程序,用於資料不一致時的恢復工作。

LOCN--鎖程序,並行伺服器模式下使用多個鎖程序。

DNNN--排程程序,共享伺服器模式下使用,可以啟動多個排程

...........