標籤:
原文地址:http://www.2cto.com/database/201505/399285.html
1 Oracle資料庫結構
關於這個話題,網上一搜絕對一大把,更別提書籍上出現的了,還有很多大師們的講稿。但是我們不去管那些,按照我們自己節奏記出特性、記出精彩來。
首先插入本系列第一張圖片,圖一(絕對來自官網),看蛤蟆對於圖片使用是多麼小心的,如果大夥對這個圖已有自己獨到的理解,那麼可直接跳過本篇筆記吧,當然溫故而知新也未嘗不可,知恥而後勇….額,而來知恥?
1.1 總體結構
這個圖1從總體上描述了Oracle資料庫的大概了,包含有記憶體結構,資料庫檔案,進程及用戶端。雖然不是非常詳細但是蛤蟆覺得該圖是在是理解ORACLE資料庫入門的好圖。
那麼我們一起圍觀下該圖到底說了些什麼。
服務進程,這裡展開就是服務進程是專用服務進程還是共用,後續會慢慢道來。
記憶體結構,記憶體結構中主要包含PGA和SGA,PGA是為用戶端接入時候服務,SGA是資料庫運行服務的,這些在機器下電後就消失了。
還有主要的6個進程PMON,SMON,DBWR,LGWR,CHPT,Arcn,在啟動資料庫的時候才會有這些進程。
最下面就是存放在持久化介質上檔案了,有歸檔日誌,資料檔案,參數檔案,密碼檔案等,不隨機器下電而消失的。
途中有2個在Oracle中非常重要的概念,執行個體和資料庫:
1.1.1 執行個體
執行個體是oracle 建立的進程和記憶體結構的組合。
1.1.2 資料庫
資料庫是由一組檔案組成的,對資料庫的所有操作都是需要通過執行個體來完成了。通常資料庫和執行個體是一一對應的。例外就是RAC了,RAC下一個資料庫就對應了多個執行個體。
執行個體和資料庫關係打個比方就是發動機和汽車的關係。汽車就是資料庫,就在那裡,但是動不了,只有發動機發動了,汽車才能動起來。一般情況下一個汽車一個單缸發動機;但是也可以是多缸的嘛,如6缸發動機什麼的。
接下去看邏輯資料庫結構。
1.2 邏輯資料庫結構
放入第二章圖,如下圖2,如來自互連網
這裡需要提一些概念了,都是ORACLE資料庫中最基本而且需要一直掌握的概念,是一直,死都不能忘了,如果擔心自己忘記就記下來把。這裡提到的概念是一通百通的,很多可以適用到其他資料庫中的,記住後我們後續學習必將事半功倍。
我們從最下面開始介紹吧,枯燥但不乏味的哈~
1.2.1 資料區塊
資料區塊,data block,是oracle資料區塊的儲存基礎,有若干位元組組成。又是若干,到底是多少個位元組呢?一般常用的是8KB,4KB的了,在建立資料庫的時候可以 指定。一旦指定就不能改變了,不過即使在4KB的資料庫中,我們也可以指定建立8KB的資料表空間的,只要我們記憶體結構中存在8KB的緩衝。
資料區塊類似作業系統中的塊大小,通常ORACLE資料庫塊大小會是作業系統塊大小的整數倍,其中好處就無需多說了。
蛤蟆自身工作經驗來看,在OLTP模型上,4KB、8KB及16KB下效能相差不是特別明顯。
不過原則是塊尺寸是處理Oracle的更新、選擇或者插入資料事務的最小單位,且訪問很隨機,則選擇塊較小的塊尺寸;如果行比較小且訪問主要是連續,或者如果有較大的行,則用較大的塊尺寸。
1.2.2 資料區間
區,extent,是兩個或者多個相鄰的ORACLE資料區塊,他是空間分配的單元。概念總是如此的明了,3點關鍵。
a) 2個或2個以上
b) 相鄰的資料區塊
c) 空間配置單位
資料區塊是儲存單元,區是配置單位。看著概念重不重要的,從概念我們就知道,ORACKE分配空間的時候至少2個資料區塊起步的。要是申請一個資料區塊,那麼不好意思啦,就是不給。
就像小時候向爸爸媽媽要零花錢,
我們:“媽,給我5分錢,買個蘿蔔絲吃”
老媽:“!@#¥%……,沒有5分”
我們:“一毛也行”
老媽:“好吧,又買兩包蘿蔔絲?,給你1毛”
1.2.3 資料區段
段是分配給某個邏輯結構的一組區。
2個關鍵點
a) 分配給某個邏輯結構
b) 一組區
1.2.4 對象
ORACLE資料庫物件,主要就是如下10個了。
1) 表
2) 約束條件:保證資料完整性。
3) 視圖:虛表,命名的查詢語句。
4) 索引:加速查詢(加快查詢的速度)。
5) 序列:一串聯續遞增或遞減的數字,步長相同,(代理鍵) 。
6) 同義字:一個對象的另外一個叫法(對象的別名)。
7) 預存程序:用於操作
8) 函數:用作複雜運算的。用於計算。
9) 觸發器:由事件觸發的預存程序。
10) 包
對資料庫的操作可以基本歸結為對資料對象的操作,這個對象蛤蟆也不知道如何去定義它。對象也是一個邏輯結構,是建立於段之上的,有頭有臉的結構。
1.2.5 資料表空間
資料表空間是一組資料檔案,通常由相關的段組成。資料表空間是包含物理資料檔案的邏輯實體。資料表空間儲存資料庫的所有可用資料。
下節中就能看到資料表空間和物理資料檔案的對應關係。資料表空間也是一個邏輯結構是,資料庫下最大的邏輯結構了。
資料庫建立完後會有如下資料表空間
a) System資料表空間
b) Sysaux 資料表空間
c) 撤銷Undo資料表空間
d) 臨時temporary資料表空間
1.3 物理資料庫結構
上節介紹了oracle資料庫的邏輯結構,那麼接下去必須得看下,邏輯結構和實體儲存體結構是如何對應的。
首先在通常情況下我們可以這樣理解,ORAC LE資料庫由資料表空間組成;所以和物理資料庫結構相關的從資料表空間開始了。
先看如下圖3:
從可以看出,邏輯結構比物理結構複雜了些許。
物理結構上就兩個東西 作業系統塊和檔案。上節中提到資料庫塊是作業系統塊的整數倍,也能反映一二。
這裡蛤蟆重點解釋下ORACLE資料庫中的檔案。
1.4 資料檔案
資料檔案一般是資料庫最大的實體儲存體部分,一個資料檔案只能屬於一個資料庫。一個或者多個資料檔案構成成為資料表空間的實體。
我們建立一個資料表空間時候,讓他擁有一個2G大小的資料檔案,那麼該資料表空間就能存放2G大小的資料量,有一天耗盡了這2G,那麼再增加一個資料檔案給這個資料表空間,當然也可以擴大原先資料檔案的大小。
注意:上篇提到了對象如索引、表等,雖然也是存在資料表空間所屬的資料檔案中,但是這些對象本身不會指定要存放在那個資料檔案上,資料檔案只與資料表空間關聯。
資料庫中執行如下查看資料檔案所在
SQL>selectname from v$datafile;
1.5 控制檔案
一看這個檔案,蛤蟆就不禁感歎:如此之小,確如此重要啊。小身材,大作用。
這個控制檔案,管理了資料庫的狀態,非常重要,一般管理員都會進行至少3份備份。
控制檔案包含了資料檔案和重做記錄檔的名字、位置、日誌序號、備份等詳細資料,以及所有重要的SCN(系統更改號)。資料庫在操作過程中進程不斷的更新控制檔案。
控制檔案中的檢查點資訊使ORACLE能確定從聯機重做記錄檔中需要返回多少以便恢複資料。此外,在啟動oracle執行個體時,通過控制檔案,確定資料庫操作必須開啟的所有資料檔案和重做記錄檔。
你看,重要不?
查看控制檔案所在
SQL>selectname from v$controlfile
1.6 記錄檔
記錄檔其實準確的是重做記錄檔,記錄了對資料庫做的全部更改,有助於恢複資料庫。如果記錄檔寫滿後就會進行歸檔,歸檔的記錄檔叫做歸檔重做日誌,正在記錄的記錄檔叫做聯機重做記錄檔。
Oracle要求資料庫至少兩個重做日誌組,每個至少一個單獨的記錄檔。在歸檔的時候當前日誌組就不能用了,所以需要有第二個日誌組來接上。這樣迴圈,生生不息。
考慮到記錄檔恢複資料庫的作用,一般建議多工重做日誌,把日誌副本存放到不同的磁碟上,保證不會輕易丟失。
查看重做記錄檔所在
SQL>select member from v$logfile;
1.7 其他檔案
還有一些檔案,蛤蟆先簡單帶過一下吧,後續咱們再深入之。
SPFILE,PFILE,密碼檔案,警示記錄檔,追蹤檔案,備份檔案等。
SPFILE是oracle執行個體的初始化參數,這個檔案是二進位檔案無法手動編輯,我們可以通過命令從SPFILE來產生PFILE,PFILE可以支援手動編輯。下節中記憶體結構中的組件大小都可以在SPFILE或者PFILE中進行設定。
密碼檔案是授予SYSDBA或SYSOPER系統管理權限的資料庫使用者名稱字,和資料庫安全相關,後續蛤蟆會和大夥一起搗鼓搗鼓。
警示記錄檔,蛤蟆喜歡叫他alert日誌。捕捉了oracle執行個體運行期間的主要更改和事件。包含日誌切換、錯誤、警示和其他資訊,也是資料庫錯問題時候,蛤蟆第一時間查看地方,大夥沒事可以進去看看也。Alert記錄檔路徑:
$ORACLE_BASE/diag/rdbms/[SID]/trace/alert_[SID].log。
追蹤檔案,Oracle各類內部結構中所包含的資訊轉儲(dump)到追蹤檔案中,以便使用者能根據檔案內容來解決各種故障。
備份檔案,顧名思義,因為備份資料操作得到的檔案。
2 記憶體結構
記憶體結構也是ORACLE資料庫執行個體的組成部分。這個記憶體結構可以讓使用者之間共用可執行代碼,可以將資料庫更改寫入記憶體地區等,讓資料庫效能提升好幾個數量級。
我們看圖4
一圖勝過千言萬語啊,一看就明白了資料庫記憶體結構包括PGA和SGA,那麼問題來了,具體呢?
2.1 SGA
SGA是執行個體中最重要的記憶體組件了,特別是在OLTP資料庫系統中,比PGA要大很多。在資料倉儲環境下,PGA可能就是更重要的ORACLE記憶體地區。
2.1.1 資料庫緩衝區
儲存從檔案中讀取的資料區塊副本,提高讀取效能。
當然資料庫緩衝區本身還可以細化成:可用緩衝區,髒緩衝區,釘住緩衝區。
緩衝區的主要目的是最小資料未命中率和磁碟IO操作。
可以將一個緩衝區分成多個緩衝區提供給不同的對象使用,也可以設定多個資料庫塊尺寸的緩衝區(如4KB,8KB,16KB的)。
2.1.2 共用池
共用池是保持可執行PL/SQL代碼和SQL語句,以及資料字典表的資訊。其可以分為庫快取和字典快取。
註:資料字典是ORACLE維護的一組關鍵表,包含了又關資料表、使用者、許可權等重要的中繼資料。
該池可以減少相同代碼的編譯,減少硬解析從而減少記憶體和CPU資源。
蛤蟆就知道了資料字典和庫快取的低命中率的解決方案是相同的,即增加共用池的尺寸。
2.1.3 重做日誌緩衝區
我們待會回將日誌寫入進程,因為日誌寫入進程的重新整理頻率,該區大小不必太大,基本幾M就搞定了。
2.1.4 Java池
為JVM何基於JAVA的應用保留。
2.1.5 大池
在使用並行查詢時候才需要使用大池。此外使用RMAN和共用伺服器配置也需要建議配置大池。
2.1.6 流池
實現在不同資料庫之間和不同環境之間共用資料。
2.2 PGA
使用者啟動會話時為每個使用者建立一個程式全域區。PGA儲存ORACLE為使用者建立的專用伺服器處理序的資料和控制資訊。PGA是獨佔的不能共用,除非使用一個共用的伺服器配置。
PGA可以存放使用者的遊標,不與其他使用者共用,此外還會涉及一些排序類的記憶體密集型操作。
概念介紹大夥看看樂一樂好了,當前不需要太較真。
3 進程
進程是Oracle資料庫執行個體的一部分,我們說過oracle資料庫執行個體由記憶體結構和進程組成。
Oracle進程其實可以分為兩種,一種是使用者進程,用於串連使用者和資料庫;另一種是oracle進程,用於執行資料庫的所有實際操作(讀寫資料檔案,寫日誌等)。這裡蛤蟆來聊聊最主要的幾個後台進程,其他的進程咱有機會再說。
進程是什麼呢?這個蛤蟆就不說了哈
咱們直接進入正題,如下進程都可以在安裝ORACLE資料的系統中執行
#ps –ef | grep ora_
來查看。
3.1 資料寫進程 (DBWR)
這個進程的作用是將在記憶體中的資料寫入到磁碟中,使得對資料庫的修改持久化。因為考慮到效能問題,並不是對資料庫的所有修改多會直接寫磁碟,而是保留在記憶體中,等時機成熟才進行批量刷入到磁碟中,這對效能提升還是大大的。
這個時機就是如下三種情況:
a) 資料庫發布檢查點
b) 記憶體緩衝區沒有可用空間
c) 3秒
以上3點,任何一點滿足即可。
考慮到有些系統每次刷入的資料量較大,ORACLE就支援多個進程一起寫。通過在DB_WIRTER_PROCESSES參數在PFILE中設定,前提是系統支援非同步IO,不然不如只用一個寫進程。
3.2 日誌寫進程 (LGWR)
類似資料寫進程,將重做日誌在記憶體中的緩衝寫入到磁碟中。這個寫特點是100%順序寫。如果記錄檔不能被寫入,那麼資料庫就會停止工作了,當然這種情況極小發生。畢竟好端端的怎麼會突然不能被寫入了呢。
日誌寫也是有時機的類似資料寫進程,這進程有四個機會點了
a) 3秒
b) 緩衝區到三分之一
c) 資料寫進程觸發(先完成日誌寫進程,方進行資料寫進程,針對這個有個寫前協議)
d) 事務提交,將提交記錄寫到重做日誌
注意:重做記錄檔可能包含提交以及未提交的事務記錄。
3.3 系統監控進程 (SMON)
這是系統監控進程了,並非一直工作,周期性巡檢。主要處理
a) 執行個體崩潰重啟後,是否一致
b) 合并可用性區域(我們說過區是相鄰的資料區塊嘛)
c) 清除不必要的臨時段
3.4 進程監控進程 (PMON)
這個進程用於清除失敗的使用者進程,保證資料庫釋放死進程佔用的資源。這個進程和SMON一樣,一般是處於不活動的,但是會周期性的進行巡檢,類似魔獸世界中豬頭監工,不幹活,周期性的走走,看看誰在偷懶,偷懶的它就動手。
如果可以蛤蟆也希望變成PMON,SMON,他們兩兄弟幹活真實輕鬆啊,一看就是領導。
3.5 檢查點進程 (CKPT)
通知數據庫寫進程,這個還會觸發日誌寫進程的。該進程的作用是同步緩衝區快取資訊與資料庫磁碟上的資訊。
該進程具體是做了如下4個事情:
a) 日誌緩衝寫到記錄檔
b) 檢查點記錄寫入記錄檔
c) 刷資料緩衝到磁碟中
d) 更新資料檔案和控制檔案的頭
3.6 歸檔進程 (ARCn)
這個進程在系統以歸檔方式運行時才有,負責將填滿的記錄檔歸檔。就是將聯機記錄檔的內容產生一個歸檔日誌文檔。如果需要,可以同時設定多個進行進行歸檔操作。
這個進程在切換日誌的時候開始幹活。
如果我們在非歸檔模式運行,那麼壓根就沒有這個進程了,不過生產系統必須以歸檔模式運行,不然後果不堪設想,蛤蟆自己玩的系統崩潰也沒事的哈哈。
其他進程在此就不囉嗦了,後續自然會涉及。這篇到此結束~如果大夥感興趣就看下回筆記。
[轉]oracle學習入門系列之五記憶體結構、資料庫結構、進程