Oracle體系架構

孤竹星發表於2015-01-22

1、Oracle 體系結構圖



由有上圖我們可以清楚的看到Oracle的各個元件的組成部分,下面對上圖進行介紹及說明

2、Oracle 體系結構

  1)oracle server :database + instance
  2)database:data file 、control file 、redolog file
  3)instance: an instance access a database
  4)oracle memory: sga + pga
  5)instance : sga + backgroud process
  6)sga:database buffer cache+ shared pool + redo log buffer +( large pool + java pool  + stream pool)可選

3、SGA

3.1 SGA的6個基本元件
1)database buffer cache:Oracle用了執行SQL的工作區域,儲存從磁碟讀入的資料塊,為所有的使用者共享。伺服器程式將資料儲存在儲存在緩衝區中,使用者程式提交sql語句,會話的伺服器程式將掃描緩衝區的塊,如果找到,則發生一次緩衝區快取命中;不需要從磁碟讀取,提高效率。資料緩衝區中被修改的資料塊(髒塊)由後臺程式DBWR將其寫入磁碟。資料緩衝區的大小對資料庫的讀取速度有直接的影響。
1.1)Database buffer cache中的chache
 Buffer pool=(default pool)+(nodefault pool)
其中:
default pool(db_cache_size)   //是標準塊存放的記憶體空間大小,SGA自動管理時此引數不用設定。使用LRU演算法清理空間

nodefault pool:
       db_nk_cache_size //指定非標準塊大小記憶體空間,比如2k、4k、16k、32k。
       db_keep_cache_size       //keep  存放經常訪問的小表或索引等。
       db_recycle_cache_size   //與keep相反,存放偶爾做全表掃描的大表的資料。

SQL> create table scott.emp1 as select * from scott.emp;             
Table created.

SQL> select segment_name,buffer_pool from dba_segments where segment_name='EMP1';
SEGMENT_NAME              BUFFER_
------------------------- -------
EMP1                      DEFAULT

SQL> alter table scott.emp1 storage(buffer_pool keep);
Table altered.

SQL> select segment_name,buffer_pool from dba_segments where segment_name='EMP1';
SEGMENT_NAME              BUFFER_
------------------------- -------
EMP1                      KEEP

1.2)default pool對應的引數是db_cache_size與標準塊default block是配套的,如果default block是8k, db_cache_size這個引數將代替db_8k_cache_size。

如果要建立非標準塊的表空間,先前要設定db buffer中的與之對應的db_nk_cache_size引數。

SQL> alter system set db_16k_cache_size=8m;

System altered.

SQL> create tablespace tbs_16k datafile '/u01/app/oracle/oradata/rman1/tbs16k01.dbf' size 10m blocksize 16k;

SQL> select TABLESPACE_NAME,block_size from dba_tablespaces;


TABLESPACE_NAME                BLOCK_SIZE
------------------------------            ----------
SYSTEM                               8192
SYSAUX                               8192
UNDOTBS1                           8192
TEMP                                   8192
USERS                                  8192
TBS_CATALOG                      8192
TBS_TEST                            8192
TBS_16K                              16384

1.3)檢視buffer cache命中率
SQL> select (1-(sum(decode(name, 'physical reads',value,0))/(sum(decode(name, 'db block gets',value,0))+
  2  sum(decode (name,'consistent gets',value,0))))) * 100 "Hit Ratio" from v$sysstat;

 Hit Ratio
----------
92.0081258 

2) shared pool

共享池是對SQL、PL/SQL程式進行語法分析、編譯、執行的記憶體區域。
共享池由庫快取(library cache),和資料字典快取(data dictionary cache)以及結果快取(result cache)等組成。
共享池的大小直接影響資料庫的效能。

關於shared pool中的幾個概念

library cache: sql和plsql的解析場所,存放著所有編譯過的sql語句程式碼,以備所有使用者共享。
data dictionary cache:  存放重要的資料字典資訊,以備資料庫使用
server result cache: 存放伺服器端的SQL結果集及PL/SQL函式返回值
User Global Area (UGA)   與共享伺服器模式有關

3)redo log buffer

日誌條目(redo entries )記錄了資料庫的所有修改資訊(包括DML和DDL), 為的是資料庫恢復,日誌條目首先產生於日誌緩衝區。 日誌緩衝區較小,它是以位元組為單位的,它極其重要。

SQL>  show parameter log_buffer

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_buffer                           integer     7057408

如果想讓它是一個最小值,這樣可以做:

SQL> alter system set log_buffer =1 scope=spfile; //修改動態引數檔案,下次啟動有效。
SQL> startup force  
SQL> show parameter log_buffer;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_buffer                           integer     2927616 //這就是最小值了


4)large pool(可選)
為了進行大的後臺程式操作而分配的記憶體空間,與shared pool管理不同,主要用於共享伺服器的session memory,RMAN備份恢復以及並行查詢等。

5)java pool(可選)
為了java虛擬機器及應用而分配的記憶體空間,包含所有session指定的JAVA程式碼和資料。

6) stream pool(可選)
為了stream process而分配的記憶體空間。stream技術是為了在不同資料庫之間共享資料,因此,它只對使用了stream資料庫特性的系統是重要的。

sga的granules(顆粒):組成oracle記憶體的最小單位


SGA_MAX_SIZE     Granule Size
----------------------    ------------------------
<=1 GB               4 MB
1GB -- 8GB           16 MB
8GB --16GB          32 MB
16GB--32GB         64 MB
32GB--64GB         128 MB
64GB--128GB       256 MB
>128GB              512 MB


--檢視SGA分配情況
SQL> select name ,bytes/1024/1024 "Size(M)" from v$sgainfo;

NAME                                Size(M)
-------------------------------- ----------
Fixed SGA Size                   2.14937592
Redo Buffers                       6.765625
Buffer Cache Size                       656
Shared Pool Size                        224
Large Pool Size                          32
Java Pool Size                           16
Streams Pool Size                         0
Shared IO Pool Size                       0
Granule Size                             16
Maximum SGA Size                 1576.91797
Startup overhead in Shared Pool  81.7750549
Free SGA Memory Available               640

4、 Oracle的程式


三種process: 1)user process、 2)server process 、3)background process

user process:使用者程式可以使連線Oracle伺服器程式的任何客戶端process,一般分為三種形式,1)sql*plus, 2)應用程式,3)web方式(EM)

客戶端請求,sqlplus是客戶端命令。

windows作為客戶端:可以透過檢視工作管理員看到sqlplus使用者程式:
linux作為客戶端時可以使用ps看到sqlplus關鍵字: 
[oracle@rman1 rman1]$ ps -ef|grep sqlplus
oracle    9353  9322  0 07:32 pts/3    00:00:00 rlwrap sqlplus / as sysdba
oracle    9354  9353  0 07:32 pts/4    00:00:00 sqlplus   as sysdba

server process:用來處理連線到例項的使用者程式提交的請求,user process不能直接訪問Oracle,必須透過相應的server process訪問例項,進而訪問資料庫。

可以在oracle檢視V$process檢視,它包括了當前所有的oracle程式,即後臺程式和伺服器程式。

SQL> select pid,program,background from v$process;

background欄位為1是background process,其餘都是server process

background process:實現為多使用者提供服務且保證系統效能,在一個多程式Oracle系統中,粗壯你多個被稱為後臺程式的Oracle程式。

基本的後臺程式

smon(System Monitor):系統監控程式
   在例項崩潰之後,Oracle會自動恢復例項。另一個作用是釋放不再使用的臨時段。

pmon(process monitor):程式監控程式
   1、當user process失敗時,清理出現故障的程式。 釋放所有當前掛起的鎖定。釋放伺服器端使用的資源
   2、監控空閒會話是否到達閥值
   3、動態註冊監聽

dbwn: 資料寫入程式
 將髒緩衝區從資料庫緩衝區快取寫入資料檔案中,釋放data buffer空間

以下幾種情況dbwn執行寫操作
  1、沒有可用的緩衝區
 2、髒緩衝區過多(閥值)
 3、超過3秒
 4、遇到檢查點
SQL> select kvittag,kvitval,kvitdsc from x$kvit where kvittag in('kcbldq','kcbfsp');


KVITTAG    KVITVAL KVITDSC
---------- ------- ----------------------------------------------------------------------
kcbldq          25 large dirty queue if kcbclw reaches this
kcbfsp          40 Max percentage of LRU list foreground can scan for free

kcbldq的kvitval=25 表示DRITY_list佇列中dirty_buffer達到25%閥值時,DBWN被觸發
kcbfsp的kvitval=40 表示LRU_list中free block低於40%時,DBWR被觸發

LGWR
lgwr:寫日誌條目,從redo log buffer到redo logfile (必須在dbwr寫髒塊之前寫入日誌)
   負責將日誌緩衝區中的日誌條目寫入日誌檔案。 有多個日誌檔案,該程式以迴圈的方式將資料寫入檔案。

 以下4個狀況發生時, lgwr都會寫

   1)commit, 2)三分之一滿,3)先於dbwr寫(先記後寫,先記日誌後寫髒塊,保證未提交資料都能回滾),4)3秒(由DBWR的3秒傳導而來)

ckpt:生成檢查點, 通知或督促dbwr寫髒塊

   完全檢查點:保證資料一致性。增量檢查點:不斷更新控制檔案中的檢查點位置,當發生例項崩潰時,可以儘量縮短例項恢復的時間。

arcn:歸檔模式下,發生日誌切換時,把當前日誌組中的內容寫入歸檔日誌,作為備份歷史日誌。

確定哪些程式正在執行,以及每個程式的數量
SQL> select program from v$session order by program;
SQL> select program from v$process order by program;

5、pga

pga(program global area)提供服務程式儲存資料及控制資訊的記憶體區域。服務程式啟動時由Oracle建立的非共享的記憶體去。只有服務程式才能訪問屬於自己的PGA,
特點:屬於oracle記憶體結構,存放使用者遊標、變數、控制、資料排序、存放hash值。與SGA不同,PGA是獨立的,非共享。

6、使用者與Oracle伺服器的連線方式

6.1 專用連線模式(dedicated server process)

對於客戶端的每個user process,伺服器端都會出現一個server process,會話與專用伺服器之間存在一對一的對映。

對專用連線來說,使用者在客戶端啟動了一個應用程式,例如sql*plus,就是在客戶端啟動一個使用者程式;與oracle伺服器端連線成功後,會在伺服器端生成一個伺服器程式,該伺服器程式作為使用者程式的代理程式,代替客戶端執行各種命令並把結果返回給客戶端。使用者程式一旦中止,與之對應的伺服器程式立刻中止。

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

6.2 共享連線模式(shared server process)

多個user process共享一個server process。它透過排程程式(dispatcher)與共享伺服器連線,共享伺服器實際上就是一種連線池機制(connectionpooling),連線池可以重用已有的超時連線,服務於其它活動會話。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28282660/viewspace-1411523/,如需轉載,請註明出處,否則將追究法律責任。

相關文章