作者: 何致億
美商甲骨文公司台灣分公司特約顧問
上一期我為大家介紹了Oracle
i服務器架構
並探討Oracle
i 執行個體之組成要素與其運作原理
本期將把重點放在Oracle
i數據庫實體結構
Oracle
i數據庫結構
談及Oracle數據庫結構時
我們應該從兩個角度來探討
分別是數據庫的「邏輯層面」與「實體組成」
簡單的說
「邏輯層面」是由
數據庫內部
觀看其組成要素
包括
資料表空間(tablespaces)
區段(segments)
延伸區塊(extents)
資料區塊(data block)
以及綱要對象(Schema objects)(注[
])
而「實體組成」則是從
操作系統
角度來看 Oracle
i 數據庫的實體構成項目
包括
數據文件(Data files)
重置日志文件(redo log files)
控制文件(control files)
密碼文件(password)
起始參數檔(initialization parameter files)…等等
如果您有心成為一個頂尖的 Oracle DBA
那麼不僅要對以上各項如數家珍般熟悉
還要了解其內部運作與相互關系才行
首先我們就先從「邏輯層面」探訪Oracle
i數據庫!
數據庫之邏輯組成
無論是任何規模的企業
在管理數據庫系統時
DBA都應該依據實際系統需求或是未來可能的管理方式
規劃出一個或多個資料儲存區域
重點是希望將資料分門別類地妥善存放
譬如
您可能會希望將公司內會計系統的帳務資料與產品銷售紀錄分開存放
Oracle
i數據庫允許DBA自行規劃各種用途的資料表空間(Tablespace)
以便存放不同型態的資料與數據庫對象
舉例來說
存放Oracle系統信息的「資料辭典」(data dictionary)可放在 SYSTEM 資料表空間
應用系統資料可存放在 USER 資料表空間
而所有數據表的索引(Index)則可單獨存放在INDX 數據表空間內(注[
])
一般來說
Oracle
i數據庫至少應規劃出五個以上的資料表空間
如下圖一所示
圖一
Oracle
i數據庫之資料表空間
那麼
先從資料的最小儲存單位 — 「資料區塊」談起
何謂「資料區塊」?
許多初次接觸數據庫的讀者最好奇的一點是
資料究竟是如何存放在數據庫呢?
其實
Oracle
i 數據庫有幾種資料儲存體
其中最小的儲存單元就稱為「數據區塊」(data block)
資料區塊大小是由起始參數檔的 DB_BLOCK_SIZE 參數所決定
且在新建Oracle
i數據庫之前就必須明確地定義
實際上
資料區塊大小與
操作系統的磁盤讀寫區塊
(O
S
blocks)也有關系
所以您必須將 DB_BLOCK_SIZE 設定為 O
S
blocks的整數倍
附帶一提
Oracle
i在存取資料時是以data block為最小讀取單位
而不是以OS block為單位
從 Oracle
i 開始
數據庫內可以設定多種資料區塊大小
換句話說
Oracle
i數據庫內分為「標准資料區塊」與「非標准資料區塊」
預設情況下 SYSTEM 資料表空間就是以「標准資料區塊」建立而成
何謂「延伸區塊」?
除了資料區塊之外
Oracle
i數據庫還有所謂的「延伸區塊」(extents)
雖然資料區塊是Oracle
i最小的資料讀寫單位
但值得注意的是
Oracle
i 在
配置
儲存空間時
並不是以資料區塊為單位
而是改采「延伸區塊」的方式來配置空間
那麼
使用「延伸區塊」究竟有何好處呢?當您執行DDL指令建立數據庫對象時(例如CREATE TABLE 指令)
Oracle
i會先配置出一連串的資料區塊
直到這些資料區塊全部存滿資料後
下次再配置一連串的資料區塊
這些連續的資料區塊就統稱為「延伸區塊」
舉例來說
假定您准備在Oracle
i數據庫內存放
KB的資料
Oracle
i可以先配置一個「延伸區塊」
其大小可為資料區塊(
KB)的
倍
然後視實際需要再配置第二個「延伸區塊」(大小還是
KB)
如此一來
只要兩次的空間配置動作就可以存放
KB的資料了!試想
如果Oracle
i每次只配置
KB的「資料區塊」讓您存放資料
總共需要
次空間配置動作才能放滿
KB的資料
是不是比較沒有效率呢?由此可見
「延伸區塊」的確有其存在的必要性
何謂「區段」?
依照不同的數據處理性質
您可能需要在資料表空間內劃分出不同區域
以存放不同資料
我們將這些區域稱之為「區段」(segment)
例如
存放數據的稱為「數據區段」
存放數據的稱為「索引區段」
而「區段」其實就是由許多「延伸區塊」組合而成
除了上述兩種「區段」以外
Oracle
i數據庫內還有另外兩種區段結構
分別是
「暫時性區段」(temporary segment)與「退回區段」(rollback segment)
下圖二說明了Oracle
i數據庫內各邏輯組成要件之間的階層關系
圖二
Tablespace
Segment
Extent
Block之間的關系
所以
從Oracle
i數據庫的「邏輯層面」來看
我們知道
n 資料是存放在每個「資料區塊」內
資料讀寫動作也將以「資料區塊」為單位
n 空間配置的動作則是引用「延伸區塊」的概念
一個「延伸區塊」由一連串的「資料區塊」所構成
n 依實際資料量多寡
資料(或數據庫對象)由多個「延伸區塊」所組成
n 「資料表空間」內可劃分不同的「區段」
而每個「區段」內又包含許多「延伸區塊」
n 在每個Oracle
i數據庫內可規劃不同的「資料表空間」
用以存放不同型態的資料
截至目前為止
無論是資料區塊
延伸區塊
區段
甚至數據表空間
都只是邏輯上的數據儲存概念
實際上
Oracle
i數據庫是藉由數個操作系統內實體檔案來維系數據庫系統之正常運作
接下來我們將從操作系統角度來探討Oracle
i的實體組成要素
數據庫之實體組成
還記得上一期文章中我們曾經綜覽Oracle
i 服務器基本架構嗎?如果從操作系統的觀點來看
Oracle
i 數據庫的實體組成要素就是操作系統內各式檔案
最重要的有
數據文件
重置日志文件
控制文件
起始參數檔…等
下圖三描述了Oracle
i 數據庫的基本架構
圖三
Oracle
i 數據庫基本架構
數據文件
每個 Oracle
i 數據庫都包含為數不等的實體「數據文件」
數據庫內所有邏輯數據庫對象都是存放在數據文件內
如
數據表
索引…
等
一但數據文件被建立後
系統就會在磁盤上配置出適當空間給數據文件
但尚未存放任何使用者資料
等到未來使用者將資料存入數據庫時
Oracle
i 才會在數據文件內配置出「數據區段」
以存放數據
而這些動作都是由 Oracle
i 自動完成的
當然了
如果數據文件剩余空間不足
您就必須調整數據文件大小
或增加新的數據文件
所以在 Oracle
i 數據庫內
一個數據庫對象有可能橫跨多個數據文件 (數據文件相關的管理與維護動作將在未來專欄內容中詳細探討)
如前所述
Oracle
i 數據庫內可規劃一個以上的「資料表空間」
但如果由操作系統角度來看
「資料表空間」其實是由一個或數個實體「數據文件」所組成
換句話說
數據庫的所有資料就是位於操作系統的各「數據文件」內
所以
n 一個「數據文件」只能對應的一個「資料表空間」
n 一個「資料表空間」可包含多個「數據文件」
如下圖四所示
SYSTEM 「資料表空間」對應到操作系統的 system
ora 「數據文件」(注[
])
USER 「資料表空間」則是包含 user
ora 與 user
ora 兩個「數據文件」
圖四
資料表空間與數據文件之對應
重置日志文件
除了「數據文件」外
最重要的Oracle
i數據庫實體檔案就是「重置日志文件」(redo log files)
也就是大家俗稱的「交易日志」(transaction log)
雖然它與「數據文件」不同
但是彼此間卻有密不可分的關系!簡單的說
Oracle
i 重置日志文件會負責紀錄數據庫內任何數據處理情況(注[
])
當資料被異動時
所有異動紀錄會先保留在內存的重置紀錄緩沖區
並在適當時機由LGWR背景處理程序負責寫入至硬盤上重置日志文件(注[
])
如此一來
所有資料異動情況都會完整地保留下來
萬一您的 Oracle
i 數據庫不小心當機或是遭遇毀損
Oracle
i 將憑借重置日志文件內相關紀錄將資料復原至最完整的狀態—這個動作我們又稱為『Roll Forward』
重置日志文件的配置方式
請注意
Oracle
i數據庫正常運作的先決條件是至少配置兩個(組)重置日志文件!
假定目前Oracle
i數據庫擁有兩個重置日志文件
分別是redo
ora與redo
ora
因為重置日志文件是以循環方式使用
所以當redo
ora寫滿後就會輪到redo
ora — 這個動作稱為「日志切換」(log switch)
理論上
當redo
ora寫滿後應該會立刻從redo
ora重新開始寫入動作
但實際上並非如此 — Oracle
i 會等到redo
ora內紀錄的資料異動情況真正反應在數據文件之後(記得我們曾經提過的CKPT處理程序嗎?)
才會覆寫redo
ora的資料
在一個大型線上交易(OLTP)系統下
如果資料交易量十分頻繁
建議您不妨配置五個以上重置日志文件
以免Oracle
i進行「日志切換」時
From:http://tw.wingwit.com/Article/program/Oracle/201311/17695.html