Oracle的體系結構大致上分爲兩部分:Instance(實例)和Database(數據庫)。java
如圖1所示:web
圖1 Oracle 數據庫體系結構
sql
咱們平時說的Oracle Server(Oracle服務器)就是由 Oracle Instance 和 Oracle Database 組成的,如圖2:
圖2 Oracle Server
數據庫
Oracle Instance |
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;
若是數據庫是第一次被提交這條語句,則須要進行解析,解析過程分爲硬解析和軟解析。
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
小說明:邏輯讀(從內存讀)的速度是物理讀(從磁盤讀)的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
4)Large Pool(可選)
5)Java Pool(可選)
6)Stream Pool(可選)
Background process
在正式介紹 Background Process 以前,先簡單介紹 Oracle 的 Process 類型。
Oracle Process 有三種類型:
小補充:
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的主要做用以下:
2)SMON(System Monitor)
SMON的主要做用以下:
3)DBWR(Database Writer)
DBWn是Oracle中工做最繁重的進程。主要做用以下:
小說明:
若是數據庫的負荷比較大,來自於客戶端的請求比較多,存在大量的IO操做,須要頻繁的將緩衝區的內容寫到磁盤文件上,那麼這時就能夠配置多個DBWn(一共Oracle支持20個DBWn,DBW0-DBW9,DBWa-DBWg)。一般一箇中小型的Oracle只須要一個DBW0 Process就能夠了。
注意:如下幾種狀況發生時,都會觸發DBWR Process將 Database Buffer Cache 的內容寫到Data Files :
小補充:
服務器進程對數據文件執行讀操做,而 DBWR 負責對數據文件執行寫操做。
小問答:
Commit 時 DBWR 有何動做?
答:什麼也不作!
4)LGWR((LOG Writer))
Oracle Instance中只有一個LGWR Process,這個Process的工做和DBWR Process相似。主要做用以下:
注意:如下幾種狀況發生時,都會觸發LGWR Process將 Redo Log Buffer 中的內容寫到 Redo Log Files :
怎麼保證提交的事務永久保留呢?
答:已執行update操做爲例 。
1. 當寫提交語句的時候,修改已經寫到 Redo Log Buffer 裏了;
2. 當看到返回提交成功時,說明修改已經寫到磁盤 Redo Logfile 裏了;
3. 因此提交成功後,改動已經同步到磁盤了,不會丟了。
5)CKPT(Checkpoint)
CKPT的主要做用以下:
6)ARCn(Archiver)
ARCn的主要做用以下:
當Oracle運行在歸檔模式時
經過上面的學習,先把圖1更新以下:
圖6 Oracle 數據庫體系結構
Database |
Database 其實就是由一堆物理文件組成的,主要是用於存儲數據,Database 中主要包含三種類型的文件:Data Files、Control Files、Redo Log Files。
另外還有Parameter File、Password File、Achieved Log Files等。
1)Data Files(數據文件)
2)Control Files(控制文件)
3)Redo Log Files(重作日誌文件)
4)Parameter File(參數文件)
5)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系統全局區)
PGA(Program Global Area程序全局區)