首頁  >  文章  >  資料庫  >  淺析Oracle體系結構

淺析Oracle體系結構

WBOY
WBOY轉載
2022-07-22 16:51:371699瀏覽

這篇文章為大家帶來了關於Oracle的相關知識,其中主要整理了體系結構的相關問題,Oracle的體系結構大體上分為兩部分:Instance(實例)和Database (資料庫),下面一起來看一下,希望對大家有幫助。

淺析Oracle體系結構

推薦教學:《Oracle影片教學

Oracle的體系結構大體上分為兩部分:Instance (實例)Database(資料庫)

如圖1所示:

圖1 Oracle 資料庫體系結構

我們平常說的Oracle Server(Oracle伺服器)就是由Oracle Instance 和Oracle Database 組成的,如圖2:

圖2 Oracle Server

Oracle InstanceInstance中主要包含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 pool

  • 共享池是對 SQL、PL/SQL 程式進行語法分析、編譯、執行的記憶體區域。
  • 共享池由 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 是獨立的,非共享。是分配給一個進程並歸該進程私有的記憶體區域。

推薦教學:《Oracle影片教學

以上是淺析Oracle體系結構的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除