Oracle體系結構

Oracle的體系結構大致上分爲兩部分:Instance(實例)Database(數據庫)java


如圖1所示:web

在這裏插入圖片描述
圖1 Oracle 數據庫體系結構
sql

咱們平時說的Oracle Server(Oracle服務器)就是由 Oracle Instance 和 Oracle Database 組成的,如圖2:
在這裏插入圖片描述
圖2 Oracle Server
數據庫

Oracle Instance
Instance中主要包含 SGA 以及一些 Backgroud Process (後臺進程)(例如:PMON、SMON、DBWR、LGWR、CKPT等)。


SGA緩存

SGA包含6 個基本組件:Shared Pool(Library Cache,Data Dictionary Cache)、Database Buffer Cache、Redo Log Buffer、Java Pool、Large Pool、stream pool。安全

下面將分別介紹這6個基本組件的功能。服務器

1) shared poolsession

  • 共享池是對 SQL、PL/SQL 程序進行語法分析、編譯、執行的內存區域。oracle

  • 共享池由 Library Cache(庫緩存)、Data Dictionary Cache(數據字典緩存)和 Server Result Cache(結果緩存)等組成。函數

它們分別都有哪些做用呢?

  • Library Cache: SQL 和 PL/SQL 的解析場所,存放着通過編譯解析後的SQL和PL/SQL語句的內容,以備全部用戶共享。

    * 若是下次再執行一樣的 SQL 語句的時候,就不須要解析了,當即從 Library Cache 獲取執行。

    * Library Cache的 SIZE 會決定着編譯解析 SQL 語句的頻度,從而決定了性能。

    * Library Cache中又包含兩部份內容:Shared SQL Area和Shared PL/SQL Area。

  • Data Dictionary Cache: 存放重要的數據字典信息,以備數據庫使用。

    * Data Dictionary是使用最頻繁的,幾乎全部的操做都須要到數據字典去查詢。爲了提升訪問Data Dictionary的速度,此時須要一個Cache,須要的時候訪問內存便可。

    * Data Dictionary Cache裏面的信息包含了Database Files、Tables、Indexes、Columns、Users、Privileges和其餘的數據庫對象。

  • Server Result Cache: 存放服務器端的 SQL 結果集及 PL/SQL 函數返回值。

看了上面的講解,或許會以爲有些抽象,下面將經過一個例子進行講解。

假設在客戶端提交一個命令,以下:

SELECT ename,sal FROM emp WHERE empno=7788;

若是數據庫是第一次被提交這條語句,則須要進行解析,解析過程分爲硬解析和軟解析。

  • 硬解析:檢查語法、語義、權限,分析綁定變量等,最終生成一個執行計劃;
  • 軟解析:依據執行計劃去具體執行它。如果select語句,執行完後還會返回結果集,如果update、delete語句則無需返回結果集。

Library Cache會把這條 sql 語句和執行計劃裝入其中。
裝入這些東西有什麼做用呢?
下次再敲一摸同樣(標點符號、大小寫、空格徹底一致)的語句時,就不須要硬解析了。
 
小問答:
若是此時客戶端再提交一條命令:

select ename,sal from emp where empno=7788;

猜想一下,這條語句須要被解析嗎?
答案:須要。
 
小說明:注意哦,語句必須徹底同樣纔不須要解析哦。標點符號、大小寫、空格等都要徹底一致哦!平時規範書寫的好處在這裏就體現啦。

前面有說到,如果 select 語句,執行完後還會返回結果集。那結果集存放在哪裏呢?

select ename,sal from emp where empno=7788;

該語句執行返回的結果集將存放在 Server Result Cache 中。

2) Database Buffer Cache

  • Database Buffer Cache用於存儲從磁盤數據文件中讀入的數據,爲全部用戶共享。
  • Server Process(服務器進程)將讀入的數據保存在數據緩衝區中,當後續的請求須要這些數據時能夠在內存中找到,則不須要再從磁盤讀取。

小說明:邏輯讀(從內存讀)的速度是物理讀(從磁盤讀)的1萬倍呦,因此仍是想辦法儘可能多從內存讀哦。
因此,數據緩衝區的大小對數據庫的讀取速度有直接的影響。

例如用戶訪問一個表裏面的記錄時,數據庫接收到這個請求後,首先會在Database Buffer Cache中查找是否存在該數據庫表的記錄,若是有所需的記錄就直接從內存中讀取該記錄返回給用戶(有效提高了訪問的速度),不然只能去磁盤上去讀取。

繼續看上面的例子:

select ename,sal from emp where empno=7788;

該條語句以及它的執行計劃被放在Library Cache裏,但語句涉及到的數據,會放在 Database Buffer Cache 裏。

小問答:
Database Buffer Cache是怎麼工做的呢?
 
這就要說一說Database Buffer Cache的設計思想了。
磁盤上存儲的是塊(block),文件都有文件號,塊也有塊號。
若要訪問磁盤上的塊,並非CPU拿到指令後直接訪問磁盤,而是先把塊讀到內存中的Database Buffer cache裏,生成副本,查詢或增刪改都是對內存中的副本進行操做。如圖3所示。
另外,若是是增刪操做,操做後會造成髒塊,髒塊會在恰當時機再寫回磁盤原位置,注意哦,可不是馬上寫回呦。
 
也許你會問,爲何不馬上寫回呢?
由於:
(1)減小物理IO;
(2)可共享,若後面又有對該塊的訪問,可直接在內存中進行邏輯讀。

在這裏插入圖片描述
圖3 訪問數據塊

小問答:
爲何要經過內存訪問數據塊,而不是CPU直接訪問磁盤呢?
答:由於相較於CPU,IO的速度實在是太慢了,CPU的速度是IO 的100萬倍呢?若是CPU直接訪問磁盤的話,會形成大量的IO等待,CPU的利用率會很低。因此,利用速度至關的內存(CPU速度爲內存的100倍)作中間緩存,能夠有效減小物理IO,提升CPU利用率。

可是,這裏會有一個問題。前面說到查詢或增刪改都是對內存中的副本進行操做,當增刪改操做產生髒塊時不會馬上寫回磁盤。

小問答:
咱們設想一下,若是在 Database Buffer Cache 中存放大量將來得及寫回磁盤的髒塊時,忽然出現系統故障(好比斷電),致使內存中的數據丟失。而此時磁盤中的塊存放的依然是修改前的舊數據,這樣豈不是致使前面的修改無效?
要怎樣保持事務的一致性呢?
答:若是咱們可以保存住提交的記錄,在 Database Buffer Cache 中一旦有數據更改,立刻寫入一個地方記錄下來,不就能夠保證事務一致性了嘛。

小說明:Instance在斷電時會消失,Instance在內存中存放的數據將丟失。這就須要 Redo Log Buffer 發揮它的做用啦。

3)Redo Log Buffer

  • 日誌條目(Redo Entries )記錄了數據庫的全部修改信息(包括 DML 和 DDL),一條Redo Entries記錄一次對數據庫的改變 ,爲的是數據庫恢復。日誌條目首先產生於日誌緩衝區。
  • 日誌緩衝區較小,它是以字節爲單位的,它極其重要。
  • 在Database Buffer Cache中一旦有數據更改,立刻寫入Redo Log Buffer,Redo Log Buffer在內存中保留一段時間後,會寫入磁盤,而後歸檔(3級結構)。

4)Large Pool(可選)

  • 爲了進行大的後臺進程操做而分配的內存空間,與 shared pool 管理不一樣,主要用於共享服
    務器的 session memory,RMAN 備份恢復以及並行查詢等。

5)Java Pool(可選)

  • 爲了 java 虛擬機及應用而分配的內存空間,包含全部 session 指定的 JAVA 代碼和數據。

6)Stream Pool(可選)

  • 爲了 stream process 而分配的內存空間。stream 技術是爲了在不一樣數據庫之間共享數據,
    所以,它只對使用了 stream 數據庫特性的系統是重要的。

Background process

在正式介紹 Background Process 以前,先簡單介紹 Oracle 的 Process 類型。

Oracle Process 有三種類型:

  • User Proces
    客戶端要與服務器鏈接,在客戶端啓動起來的進程就是 User Process,通常分爲三種形式(sql*plus, 應用程序,web 方式(OEM))。
  • Server Process
    User Process 不能直接訪問 Oracle,必須經過相應的 Server Process 訪問實例,進而訪問數據庫。
    用戶登陸到 Oracle Server 就是 User Process 和 Server Process 創建Connection。
  • background process
    Oracle Instance的重要組成部分。接下來會對其作詳細講解。

小補充:
Connection & Session
Connection是指一個Oracle的客戶端和後臺和後臺的進程(Server Process)創建的TCP鏈接。如圖4所示:

在這裏插入圖片描述
圖4 Connection

Connection 創建過程可簡單描述以下:

1.首先創建 TCP 鏈接,Oracle 對用戶的身份進行認證、進行安全審計等等;
2.當這些都經過後, Oracle 的 Server Process 纔會容許客戶端使用Oracle提供的服務;
3.當 Oracle 的鏈接創建起來之後,就意味着開始了一個 Session (會話),當鏈接斷開的時候這個會話就消失了。

Session 是和 Connection 相輔相成的。Session信息會存儲在 Oracle 的 Data Dictionary 中。
可經過圖5直觀看出 Connection 和 Session 的區別。

在這裏插入圖片描述
圖5 Connection & Session

Background Process(後臺進程)主要包括:SMON(系統監控器進程 )、PMON(進程監控器進程)、DBWR( 數據庫寫入程序進程)、LGWR(日誌寫入程序進程)、CKPT(檢查點進程)。

1)PMON(Process Monitor)

PMON的主要做用以下:

  • 監控各個Oracle後臺進程是否正常,發現異常的進程將其清除掉,從新生成該進程。
    (說明:當用戶進程斷掉時,Server Process 留着就沒用了,可是還佔着空間,PMON 會定時檢查 Server Process ,若是和 User Process 鏈接不上了,PMON 會把 Server Process 收回,把 PGA 空間收回,裏面的鎖也收回。)
  • 監控空閒會話是否到達閥值。
  • 動態註冊監聽。

2)SMON(System Monitor)

SMON的主要做用以下:

  • 當Oracle運行時忽然宕機,下次啓動須要實例恢復(Instance Recovery),SMON負責實例恢復的全程監控;
  • 當Oracle運行時忽然宕機,在下一次啓動Oracle Instance的時候,它裏面一些沒有釋放的資源會由SMON進行清理;
  • 一些事務失敗的時候也由SMON進行清理;
  • 內存空間很分散(不連續)時須要SMON將這個分散的空間整合起來;
  • 釋放再也不使用的臨時段(Segment)。

3)DBWR(Database Writer)

DBWn是Oracle中工做最繁重的進程。主要做用以下:

  • 將 Database Buffer Cache 中的髒塊(Dirty Buffer)寫到 Data File 中。
  • 釋放Data Buffer Cache空間。

小說明:
若是數據庫的負荷比較大,來自於客戶端的請求比較多,存在大量的IO操做,須要頻繁的將緩衝區的內容寫到磁盤文件上,那麼這時就能夠配置多個DBWn(一共Oracle支持20個DBWn,DBW0-DBW9,DBWa-DBWg)。一般一箇中小型的Oracle只須要一個DBW0 Process就能夠了。

注意:如下幾種狀況發生時,都會觸發DBWR Process將 Database Buffer Cache 的內容寫到Data Files :

  • Checkpoint Occurs
  • Dirty Buffer reach threshold
  • There are no free Buffers
  • Timeout occurs
  • RAC ping request is made
  • Tablespace OFFLINE
  • Tablespace READ ONLY
  • Table DROP or TRUNCATE
  • Tablespace BEGIN
  • BACKUP

小補充:
服務器進程對數據文件執行讀操做,而 DBWR 負責對數據文件執行寫操做。

小問答:
Commit 時 DBWR 有何動做?
答:什麼也不作!

4)LGWR((LOG Writer))

Oracle Instance中只有一個LGWR Process,這個Process的工做和DBWR Process相似。主要做用以下:

  • 將 Redo Log Buffer 中的內容寫入到 Redo Log Files 中(必須在 DBWR 寫髒塊以前寫入日誌)。
    (Redo Log Buffer 是一個循環的Buffer,對應的 Redo Log Files 也是一個循環的文件組,從文件頭開始寫,當文件寫滿了,又會從文件頭開始寫,會把前面的內容覆蓋掉,爲了不將 Redo Log Files 覆蓋掉能夠選擇將其寫入到 Archived Redo Log Files 中。)

注意:如下幾種狀況發生時,都會觸發LGWR Process將 Redo Log Buffer 中的內容寫到 Redo Log Files :

  • At Commit
  • When one-third full
  • When there is 1 MB of redo
  • Every three seconds
  • Before DBWn writes

怎麼保證提交的事務永久保留呢?
答:已執行update操做爲例 。
1. 當寫提交語句的時候,修改已經寫到 Redo Log Buffer 裏了;
2. 當看到返回提交成功時,說明修改已經寫到磁盤 Redo Logfile 裏了;
3. 因此提交成功後,改動已經同步到磁盤了,不會丟了。

5)CKPT(Checkpoint)

CKPT的主要做用以下:

  • 生成檢查點, 通知或督促 DBWR 寫髒塊;
    *徹底檢查點:保證數據一致性。
    *增量檢查點:不斷更新控制文件中的檢查點位置,當發生實例崩潰時,能夠儘可能縮短實例恢復的時間。
  • 在Data File的在文件頭更新檢查點信息;
  • 在Control File中更新檢查點的信息。

6)ARCn(Archiver)

  • ARCn是一個可選的後臺進程(幾乎可看做必選進程)。
  • Oracle能夠運行在兩種模式下:ARCHIVELOG MODE(歸檔模式)、NOARCHIVELOG MODE(非歸檔模式)。DBA 必須作出的一個重要決策是,配置數據庫在ARCHIVELOG模式下運行,仍是在NOARCHIVELOG模式下運行。
  • 聯機重作日誌文件填滿後,oracle實例開始寫入下一個聯機重作日誌文件。從一個聯機重作日誌文件切換到另外一個聯機重作日誌文件的過程稱爲日誌切換。

ARCn的主要做用以下:

當Oracle運行在歸檔模式時

  • ARCn進程在每次進行日誌切換時都會開始對已填滿的日誌組進行備份或歸檔。
  • ARCn進程會在能夠從新使用日誌以前自動歸檔重作日誌文件,所以會保留對數據庫所作的全部更改。這樣,即便磁盤驅動器損壞,也能夠將數據庫恢復到故障點。

經過上面的學習,先把圖1更新以下:

在這裏插入圖片描述
圖6 Oracle 數據庫體系結構

Database

Database 其實就是由一堆物理文件組成的,主要是用於存儲數據,Database 中主要包含三種類型的文件:Data Files、Control Files、Redo Log Files。
另外還有Parameter File、Password File、Achieved Log Files等。

1)Data Files(數據文件)

  • Data Files 就是用於存儲數據的,Table 中的數據都是保存在 Data Files 中的。

2)Control Files(控制文件)

  • Oracle爲了操做Data File,提供了一些 Control Files,這些 Control Files 主要是記錄數據庫的一些控制信息。

3)Redo Log Files(重作日誌文件)

  • Redo Log Files 記錄着數據庫的改變,若是向數據庫中放入數據或者是修改裏面的數據,只要對數據庫做了修改,那麼就要將修改以前的狀態、修改以後的狀態都記錄在 Redo Log Files 中,其做用就是恢復Data File。
    * 例如:數據庫有一個事務須要提交,可是提交失敗了,事務就要回滾,那麼事務回滾的依據就來自於這個 Redo Log Files。Redo Log Files 中記錄着數據庫的改變,關於這個事務的改變,若是須要回滾就須要把Redo Log Files中的數據取出來,依照 Redo Log Files 中的數據把 Data Files 恢復到修改以前的狀態。

4)Parameter File(參數文件)

  • 任何一個數據庫都必需要有參數文件,這個參數文件規定了Oracle中的一些基本的參數、初始化的參數的值。

5)Archived Log Files(歸檔日誌文件)

  • Archived Log Files 和 Redo Log Files 是相輔相成的,Redo Log Files 實際上是一個反覆利用的過程,會有幾個(通常爲3個)固定的文件,這些固定文件會被依次使用,用滿了之後,Oracle就會再次寫這個文件頭,就把之前的東西衝掉了。爲了進一步增強數據庫的備份恢復能力,在覆蓋以前把這些修改的信息都歸檔到 Archived Log Files 中。

6)Password File(密碼文件)

  • 用戶客戶端鏈接到後臺數據庫系統時候存儲口令的。

小問答:
Instance 和 Database 的對應關係是怎樣的呢?

答:Instance :Database = n :1
1個 Instance 只能屬於1個數據庫,能夠多個 Instance 同時訪問1個數據庫。


小補充:
Oracle 的內存結構(Memory Structure)

Oracle 的 Memory Structure 實際上包含兩部份內容:SGA和PGA

SGA(System Global Area系統全局區)

  • 一個 Oracle Instance 對應一個SGA,SGA 在Oracle Instance啓動的時候被分配,SGA 是Oracle Instance 的基本組成部分。
  • 一個 Oracle Instance 僅有一個 SGA,SGA是一個很是大的內存空間,甚至能夠佔據物理內存的80%。

PGA(Program Global Area程序全局區)

  • 一個 Server Process 啓動的時候就會分配一個 PGA。在 Oracle Instance 中 PGA 可能會不少。例如啓動10個Server Process就會有10個PGA。
  • PGA 存放用戶遊標、變量、控制、數據排序、存放 hash 值。
  • 與 SGA 不一樣,PGA 是獨立的,非共享。是分配給一個進程並歸該進程私有的內存區域。
相關文章
相關標籤/搜索