You are on page 1of 13

資料庫管理實務講座 四

(原文刊登於 2002 年 02 月 Linuxer 雜誌) 圖文: 何致億 Rich Ho

Oracle9i 本文內容索引

■ 資料庫之邏輯組成
資料庫實體結構
■ 啟動 Oracle9i 資料庫的
方式

上一期我為大家介紹了 O r a c l e 9 i 伺服器架構,並探討
Oracle9i 執行個體之組成要素與其運作原理,本期將把重點
放在 Oracle9i 資料庫實體結構。

Oracle9i 資料庫結構

談及Oracle資料庫結構時,我們應該從兩個角度來探討:分別是資料
庫的「邏輯層面」與「實體組成」。簡單的說,「邏輯層面」是由 ” 資料
庫內部 ” 觀看其組成要素,包括:資料表空間(tablespaces)、區段
(segments)、延伸區塊(extents)、資料區塊(data block)、以及綱要物
件(Schema objects)(註 1)。而「實體組成」則是從 ” 作業系統 ” 角度來
看 Oracle9i 資料庫的實體構成項目,包括:資料檔(Data files)、重
置日誌檔(redo log files)、控制檔(control files)、密碼檔
(password)、起始參數檔(initialization parameter files)…等等。
如果您有心成為一個頂尖的 Oracle DBA ,那麼不僅要對以上各項如數
家珍般熟悉,還要瞭解其內部運作與相互關係才行。首先我們就先從
「邏輯層面」探訪 Oracle9i 資料庫!

資料庫之邏輯組成

無論是任何規模的企業,在管理資料庫系統時,DBA都應該依據實際系
統需求或是未來可能的管理方式,規劃出一個或多個資料儲存區域。重
點是希望將資料分門別類地妥善存放。譬如,您可能會希望將公司內會
計系統的帳務資料與產品銷售紀錄分開存放。

O r a c l e 9 i 資料庫允許 D B A 自行規劃各種用途的資料表空間
(Tablespace),以便存放不同型態的資料與資料庫物件。舉例來說,存
放 Oracle 系統資訊的「資料辭典」(data dictionary)可放在 SYSTEM 資
料表空間;應用系統資料可存放在 USER 資料表空間;而所有資料表的 註 1:
索引(Index)則可單獨存放在 INDX 資料表空間內(註 2)。 Oracle9i 的綱要物件即為俗稱的 ”
資料庫物件 ” 。

Oracle 9i
資料庫管理實務講座(四) 1
一般來說,Oracle9i資料庫至少應規劃出五個以上的資料表空間,如 註 2:
下圖一所示: SYSTEM為Oracle資料庫預設的資料
表空間;USER 與 INDX 則是由 DBA 自
行規劃建置的。

圖一:Oracle9i 資料庫之資料表空間。

那麼,先從資料的最小儲存單位 — 「資料區塊」談起。

何謂
何謂「「資料區塊」?

許多初次接觸資料庫的讀者最好奇的一點是:” 資料究竟是如何存放在
資料庫呢?”。其實,Oracle9i 資料庫有幾種資料儲存體,其中最小的
儲存單元就稱為 「資料區塊」(data block)。資料區塊大小是由起始參數
檔的 DB_BLOCK_SIZE 參數所決定,且在新建 Oracle9i 資料庫之前就必
須明確地定義。實際上,資料區塊大小與 ” 作業系統的磁碟讀寫區塊 ”(
O.S. blocks)也有關係,所以您必須將 DB_BLOCK_SIZE 設定為 O.S.
blocks的整數倍。附帶一提:Oracle9i在存取資料時是以data block為
最小讀取單位,而不是以 O.S. block 為單位。

從 Oracle9i 開始,資料庫內可以設定多種資料區塊大小。換句話說,
Oracle9i 資料庫內分為「標準資料區塊」與「非標準資料區塊」;預設
情況下 SYSTEM 資料表空間就是以「標準資料區塊」建立而成。

何謂「延伸區塊」?
何謂「

除了資料區塊之外, O r a c l e 9 i 資料庫還有所謂的「延伸區塊」
(extents)。雖然資料區塊是Oracle9i最小的資料讀寫單位,但值得注意
的是:Oracle9i 在 ” 配置 ” 儲存空間時,並不是以資料區塊為單位,而
是改採「延伸區塊」的方式來配置空間。那麼,使用「延伸區塊」究竟
有何好處呢?當您執行DDL指令建立資料庫物件時(例如CREATE TABLE 指
令),Oracle9i會先配置出一連串的資料區塊;直到這些資料區塊全部存
滿資料後,下次再配置一連串的資料區塊。這些連續的資料區塊就統稱
為「延伸區塊」。

舉例來說,假定您準備在 O r a c l e 9 i 資料庫內存放 8 0 K B 的資料,

Oracle 9i
2 資料庫管理實務講座(四)
Oracle9i 可以先配置一個「延伸區塊」,其大小可為資料區塊(8KB)的 5
倍;然後視實際需要再配置第二個「延伸區塊」(大小還是40KB)。如此一
來,只要兩次的空間配置動作就可以存放 80KB 的資料了!試想,如果
Oracle9i 每次只配置 8KB 的「資料區塊」讓您存放資料,總共需要 10 次
空間配置動作才能放滿 80 KB 的資料,是不是比較沒有效率呢?由此可
見,「延伸區塊」的確有其存在的必要性。

何謂
何謂「「區段」?

依照不同的資料處理性質,您可能需要在資料表空間內劃分出不同區
域,以存放不同資料;我們將這些區域稱之為 「區段」 (segment)。例如,
存放資料的稱為「資料區段」、存放資料的稱為「索引區段」。而「區
段」其實就是由許多「延伸區塊」組合而成。除了上述兩種「區段」以
外,Oracle9i資料庫內還有另外兩種區段結構,分別是:「暫時性區段」
(temporary segment)與「退回區段」(rollback segment)。下圖二說明
了 Oracle9i 資料庫內各邏輯組成要件之間的階層關係:

圖二:Tablespace 、 Segment 、 Extent 、 Block 之間的關係。

所以,從 Oracle9i 資料庫的「邏輯層面」來看,我們知道:


■ 資料是存放在每個「資料區塊」內,資料讀寫動作也將以「資料區
塊」為單位。
■ 空間配置的動作則是引用「延伸區塊」的概念。一個「延伸區塊」
由一連串的「資料區塊」所構成。
■ 依實際資料量多寡,資料(或資料庫物件)由多個「延伸區塊」所組
成。
■ 「資料表空間」內可劃分不同的「區段」;而每個「區段」內又包
含許多「延伸區塊」。
■ 在每個 Oracle9i 資料庫內可規劃不同的「資料表空間」,用以存
放不同型態的資料。

Oracle 9i
資料庫管理實務講座(四) 3
截至目前為止,無論是資料區塊、延伸區塊、區段、甚至資料表空
間,都只是邏輯上的資料儲存概念。實際上,Oracle9i資料庫是藉由數
個作業系統內實體檔案來維繫資料庫系統之正常運作。接下來我們將從
作業系統角度來探討 Oracle9i 的實體組成要素。

資料庫之實體組成

還記得上一期文章中我們曾經綜覽Oracle9i 伺服器基本架構嗎?如果
從作業系統的觀點來看,Oracle9i 資料庫的實體組成要素就是作業系統
內各式檔案,最重要的有:資料檔案、重置日誌檔、控制檔、起始參數
檔 … 等。下圖三描述了 Oracle9i 資料庫的基本架構。

圖三:Oracle9i 資料庫基本架構。

資料檔案

每個 Oracle9i 資料庫都包含為數不等的實體「資料檔案」。資料庫
內所有邏輯資料庫物件都是存放在資料檔案內,如:資料表、索引 ….
等。

一但資料檔案被建立後,系統就會在磁碟上配置出適當空間給資料檔
案;但尚未存放任何使用者資料。等到未來使用者將資料存入資料庫
時,Oracle9i 才會在資料檔案內配置出「資料區段」,以存放資料。而
這些動作都是由 Oracle9i 自動完成的。

當然了,如果資料檔案剩餘空間不足,您就必須調整資料檔案大小;
或增加新的資料檔案。所以在 Oracle9i 資料庫內,一個資料庫物件有
可能橫跨多個資料檔案 (資料檔案相關的管理與維護動作將在未來專欄
內容中詳細探討) 。

如前所述,Oracle9i 資料庫內可規劃一個以上的「資料表空間」。但

Oracle 9i
4 資料庫管理實務講座(四)
如果由作業系統角度來看,「資料表空間」其實是由一個或數個實體「資
料檔案」所組成。換句話說,資料庫的所有資料就是位於作業系統的各
「資料檔案」內。
所以:
■ 一個「資料檔案」只能對應的一個「資料表空間」。
■ 一個「資料表空間」可包含多個「資料檔案」。
如下圖四所示:SYSTEM 「資料表空間」對應到作業系統的 system01.
ora 「資料檔案」(註 3);USER 「資料表空間」則是包含 user01.ora 與
註 3:
user02.ora 兩個「資料檔案」。
任何 Oracle9i 資料庫都必須要有
一個 SYSTEM 資料表空間,所以
Oracle9i 會在建立資料庫時自動將
第一個資料檔案配置給 SYSTEM 資
料表空間。

圖四:資料表空間與資料檔案之對應。

重置日誌檔

除了「資料檔案」外,最重要的 Oracle9i 資料庫實體檔案就是「重置


日誌檔」 (redo log files),也就是大家俗稱的
「交易日誌」
(transaction
註 4:
log)。雖然它與「資料檔案」不同,但是彼此間卻有密不可分的關係!簡
這裡的資料處理動作泛指新增、修
單的說, Oracle9i 重置日誌檔會負責紀錄資料庫內任何資料處理情況 改、刪除;但查詢動作除外。
(註4)。當資料被異動時,所有異動紀錄會先保留在記憶體的重置紀錄緩
衝區,並在適當時機由LGWR背景處理程序負責寫入至硬碟上重置日誌檔
註 5:
(註 5)。如此一來,所有資料異動情況都會完整地保留下來。萬一您的
有關重置紀錄緩衝區與 LGWR 背景處
Oracle9i 資料庫不小心當機或是遭遇毀損,Oracle9i 將憑藉重置日誌 理的互動過程,請參閱我在 2002 年
檔內相關紀錄將資料復原至最完整的狀態—這個動作我們又稱為『Roll 1 月 Linuxer 雜誌的專欄文章。
Forward』。

重置日誌檔的配置方式

請注意,Oracle9i資料庫正常運作的先決條件是至少配置兩個(組)重
置日誌檔!
假定目前Oracle9i資料庫擁有兩個重置日誌檔,分別是redo01.ora與
redo02.ora。因為重置日誌檔是以循環方式使用,所以當redo01.ora寫
滿後就會輪到redo02.ora — 這個動作稱為 switch)。
「日誌切換」(log switch)
理論上,當redo02.ora寫滿後應該會立刻從redo01.ora重新開始寫入動
作。但實際上並非如此 — Oracle9i 會等到 redo01.ora 內紀錄的資料
異動情況真正反應在資料檔案之後(記得我們曾經提過的 CKPT 處理程序

Oracle 9i
資料庫管理實務講座(四) 5
嗎?),才會覆寫 redo01.ora 的資料。在一個大型線上交易(OLTP)系統
下,如果資料交易量十分頻繁,建議您不妨配置五個以上重置日誌檔。
以免 Oracle9i 進行「日誌切換」時還要等候 CKPT 處理程序執行「檢查點
動作」 (checkpoint),因而影響系統效能。

在執行關鍵性任務(mission-critical)的資料庫系統中,為了避免硬
體問題導致重置日誌檔毀損(例如硬碟產生壞軌),我們會考慮建置「多重
重置日誌檔」(multiplexed redo log)。所謂的「多重重置日誌檔」其
實就是在其他硬碟內同時存放多份重置日誌檔之複本。以下圖五為例:
假定原來的重置日誌檔為Redo_A01.ora與Redo_A02.ora。我在第二個磁
碟又額外規劃了兩個重置日誌檔 — Redo_B01.ora 與 Redo_B02.ora(分
別為 Redo_A01.ora 與 Redo_A02.ora 之複本)。這時候 Redo_A01.ora 與
Redo_B01.ora 就構成所謂的「重置日誌群組」(redo log group);而
Redo_A01.ora 與 Redo_B01.ora 分別為該群組之「群組成員」(member)。

一但您以「重置日誌群組」的方式規劃重置日誌檔, LGWR 會同時將異


動紀錄寫入相同群組的所有成員。也就是說, LGWR 會將資料同時寫入
Redo_A01.ora 與 Redo_B01.ora ,等到發生「日誌切換」動作後,再同時
寫入Redo_A02.ora與Redo_B02.ora。可想而知,萬一這兩顆硬碟其中之
一不幸損毀。重置日誌檔將不受任何影響。

儘管「多重重置日誌檔」的概念已具備容錯功能,但是對於重置日誌
檔之寫入效能卻有一定程度的影響!這也是我們在規劃之初就必須考慮
的重點之一。

圖五:多重重置日誌檔的配置方式。

控制檔

每個 Oracle9i 資料庫也都會有一個「控制檔」,用以紀錄與描述資
料庫的實體結構。「控制檔」內記錄以下重要資訊:
■ Oracle9i 資料庫名稱與建立時間。

Oracle 9i
6 資料庫管理實務講座(四)
■ 資料檔案與重置日誌檔之名稱,及其所在位置。
■ 交易紀錄序列碼(log sequence number)。

每當資料庫被啟動時,Oracle9i 會在執行個體啟動後立刻讀取控制檔
(註 6)
內容,待所有資料庫實體組成檔案之所在資訊都收集完畢,資料庫才會 除了資料庫啟動時需讀取控制檔以
被開啟。為了避免控制檔毀損導致資料庫系統停擺,建議您比照「多重 外。進行資料庫復原動作時也必須
重置日誌群組」的方式 — 至少配置兩個控制檔,並存放在不同實體硬 存取控制檔內容。

碟(註 6)。

起始參數檔

在啟動執行個體之前,Oracle9i必須依照特定參數設定值來配置記憶
體空間,並啟動相關背景處理程序。而DBA 可以事先規劃這些參數,並
存放在作業系統內的某個檔案。往後將利用這個檔案來開啟相對應的
Oracle9i 執行個體 。這個檔案就是所謂的「起始參數檔
起始參數檔」。
起始參數檔

起始參數檔包含以下主要內容:
■ 系統全域區相關的組態設定
■ 其他各起始參數之名稱與設定值
■ 控制檔名稱與存放路徑
■ 重置日誌檔之相關設定

您可以利用任何文字編輯器來建立或修改起始參數檔,通常起始參數
檔的名稱為 init.ora 或是 init<SID>.ora 。假定 Oracle9i 執行個體的
名稱為ora901,起始參數檔之檔名就可以定為initora901.ora。以下是
一個起始參數檔範例:

# Copyright (c) 1991, 2001 by Oracle Corporation

# Cache and I/O


db_block_size=8192
db_cache_size=67108864

# Cursors and Library Cache


open_cursors=300

# Diagnostics and Statistics


background_dump_dest=/opt/oracle/admin/ora901/bdump
core_dump_dest=/opt/oracle/admin/ora901/cdump
timed_statistics=TRUE
user_dump_dest=/opt/oracle/admin/ora901/udump

# Distributed, Replication and Snapshot


db_domain=uuu.com.tw
remote_login_passwordfile=EXCLUSIVE

Oracle 9i
資料庫管理實務講座(四) 7
# File Configuration
control_files=("/opt/oracle/oradata/ora901/control01.ctl",
"/opt/oracle/oradata/ora901/control02.ctl",
"/opt/oracle/oradata/ora901/control03.ctl")

# MTS
dispatchers="(PROTOCOL=TCP)(SER=MODOSE)",
"(PROTOCOL=TCP)(PRE=oracle.aurora.server.
GiopServer)",
"(PROTOCOL=TCP)(PRE=oracle.aurora.server.
SGiopServer)"

# Miscellaneous
compatible=9.0.0
db_name=ora901

# Network Registration
instance_name=ora901

# Pools
java_pool_size=117440512
large_pool_size=1048576
shared_pool_size=117440512

# Processes and Sessions


processes=150

# Redo Log and Recovery


fast_start_mttr_target=300

# Resource Manager
resource_manager_plan=SYSTEM_PLAN

# Sort, Hash Joins, Bitmap Indexes


sort_area_size=524288

# System Managed Undo and Rollback Segments


undo_management=AUTO
undo_tablespace=UNDOTBS

除了上述檔案之外, Oracle9i 資料庫內還包含密碼檔(password


file)、重置日誌封存檔(Archived Redo log files)。有關這些檔案的
使用時機與管理方式將在未來專欄中陸續為大家深入介紹。

瞭解 O r a c l e 9 i 資料庫的實體組成後,我們就可以繼續往下探討
Oracle9i 資料庫的啟動 / 關閉方式。

Oracle 9i
8 資料庫管理實務講座(四)
啟動與關閉 Oracle9i 資料庫

在啟動 Oracle9i 資料庫之前,首先您必須瞭解資料庫的各種啟動狀


態:
■ NOMOUNT
■ MOUNT
■ OPEN
下表一列出不同的啟動狀態,與其使用時機:

啟動狀態 說明
NOMOUNT ■ 僅啟動Oracle9i執行個體,不會掛載
(mount)Oracle資料庫。
■ 配置系統全域區(SGA),啟動各背景處理程
序。
■ 資料庫尚無法使用。
■ DBA可執行ALTER DATABASE指令將資料
庫開啟至MOUNT或是OPEN狀態。
■ 通常使用於第一次建立資料庫,或是需重建
控制檔時。
MOUNT ■ 啟動Oracle9i執行個體。
■ 開啟控制檔。
■ 掛載Oracle9i資料庫,但尚未開啟之。
■ 資料庫尚無法使用,但是DBA可以進行特
殊的管理工作(例如更改資料庫內重置日誌
檔的封存模式)。
OPEN ■ 啟動Oracle9i執行個體。
■ 開啟控制檔。
■ 掛載Oracle9i資料庫之後立刻開啟。
■ 使用者可以存取資料庫。

表一:Oracle9i 資料庫各種啟動狀態。

當您的系統內尚未建立任何資料庫之前,只能先將Oracle9i執行個體
開啟至 NOMOUNT 狀態,接著利用 CREATE DATABASE 指令建立 Oracle9i 資
料庫。待資料庫順利建立時(資料庫內相關的資訊已紀錄至控制檔),才可
以執行 ALTER DATABASE 指令將資料庫開啟至 OPEN 狀態;或是先將執行
個體關閉,再一口氣將資料庫開啟至 OPEN 狀態。

欲開啟 / 關閉 Oracle9i 資料庫時可利用以下幾種工具:


■ SQL*Plus 。
■ Oracle Enterprise Manager 。
■ Recovery Manager 。

一般來說,前兩種是比較常用的方式。值得注意的是:在Oracle8i之
前版本可使用Server Manager來啟動/關閉Oracle資料庫,或是執行系
統維護的相關指令。從 Oracle8i 以後,所有 Server Manager 的指令都
可以在 SQL*Plus 下執行。而 Oracle9i 已移除 Server Manager ,統一由
SQL*Plus 做為 Oracle9i 的客戶端工具。

Oracle 9i
資料庫管理實務講座(四) 9
啟動 Oracle9i 資料庫的方式

欲開啟Oracle9i資料庫之前,您必須先以SYSDBA身分登入,然後執行
STARTUP 指令。下列步驟假設您是從 SQL*Plus 啟動資料庫:

1. 啟動 SQL*Plus 。

$ sqlplus /nolog

這裡我們使用了 nolog 選項,這是假設目前 Oracle9i 資料庫尚未啟


動,當然也無法登入資料庫。所以我們僅先進入 SQL*Plus 環境。

2. 利用 SYSDBA 身分登入。

SQL> connect 使用者名稱 / 密碼 as sysdba

3. 執行 START 指令,其基本語法為:

STARTUP PFILE = 起始參數檔名稱 啟動狀態

例如:

STARTUP PFILE = initora901.ora NOMOUNT

在一般情況下,如果要將Oracle9i資料庫開啟至OPEN狀態,可以直接
執行 STARTUP 指令。

STARTUP

結果如下圖五所示:

圖五:利用 SQL*Plus 開啟 Oracle9i 資料庫至 OPEN 狀態。

由圖五可得知:啟動Oracle9i 執行個體時會先配置出系統全域區,然

Oracle 9i
10 資料庫管理實務講座(四)
後是掛載資料庫,最後才會將資料庫開啟至 OPEN 狀態。

關閉 Oracle9i 資料庫的方式

關閉資料庫時,您也必須以 SYSDBA 登入後執行 SHUTDOWN 指令。 SHUT-


DOWN 指令共有下列四種選項:
■ Normal
■ Transactional
■ Immediate
■ Abort

下表二整理出每個選項之用途與使用時機:

SHUTDOWN選項 說明
Normal ■ 其他使用者無法再登入資料庫,但現有使
用者可繼續未完成的資料處理動作。
Oracle9i會等待所有使用者離線後才關閉
資料庫。
■ 下次開啟Oracle9i資料庫時,系統不需進
行執行個體修復動作(Instance Recovery)

■ 為系統預設的關閉資料庫選項。

Transactional ■ 不允許其他使用者再登入資料庫。
■ 正在進行的資料交易動作不會受到影響。
■ 等到交易正常結束(不管是確認或是退回交
易) Oracle9i才結束使用者連線階段。待所
有使用者離線後才關閉資料庫。
■ 下次開啟Oracle9i資料庫時,系統不需進
行執行個體修復動作。
Immediate ■ 不允許其他使用者再登入資料庫。
■ 自動退回(rollback)所有未確認的交易
■ Oracle9i自動結束所有使用者連線階段,
並關閉資料庫。
■ 資料交易的一致性與完整性可能會受到影
響。
■ 下次開啟Oracle9i資料庫時,系統不需進
行執行個體修復動作。

Abort ■ 不允許其他使用者再登入資料庫。
■ 正在進行的所有交易會立刻中斷(不會
rollback)。
■ Oracle9i會自動中斷所有使用者連線階段

■ 資料交易的一致性與完整性可能會受到影
響。
■ 下次開啟Oracle9i資料庫時,系統會自動
進行執行個體修復動作。

表二:Oracle9i 資料庫的關閉指令選項。

Oracle 9i
資料庫管理實務講座(四) 11
關閉資料庫的方式如啟動資料庫的方式類似,您可以在登入SQL*Plus
之後執行 SHUTDOWN 指令。結果如圖六所示:

圖六:關閉 Oracle9i 資料庫。

通常我們都是以 Normal 或是 Transactional 來關閉資料庫。除非必


要,否則請盡量不要使用 SHUTDOWN ABORT 去關閉 Oracle9i 資料庫,以
免影響使用者正在進行的資料處理工作。

結語

在本期內容裡,我以兩種角度探討了Oracle9i資料庫的組成要素。個
人認為這是學習Oracle最重要的工作。在我從事Oracle資料庫管理相關
教學工作以來,這部分也是上課學員普遍認為較難接受的觀念之一。但
是只要這些基本觀念搞清楚,就像練武時任督二脈已被打通一般,未來
研讀 O r a c l e 的相關技術將會如魚得水。最近也有讀者來信和我討論
Oracle9i資料庫的管理技巧。當然了,Oracle9i也有很棒的圖形介面管
理工具 — Oracle9i Enterprise Manager 。未來的專欄內容我必然會
為大家介紹 Oracle9i Enterprise Manager 的使用方式與技巧。有了
Enterprise Manager ,管理 Oracle9i 資料庫將如虎添翼!

Oracle 9i
12 資料庫管理實務講座(四)
作者簡介
何致億
恆逸資訊系統開發部技術顧問。專長為 SQL Server 、 Oracle 等關聯
式資料庫系統管理,資料倉儲規劃建置,以及資料庫應用程式系統開
發。擁有 MCSD 、 MCDBA , Oracle OCP , RHCE , SCJP , Borland
JBuilder Product Certified 等十餘項國際認證。目前正致力於
Oracle9i 應用系統開發,並負責 Oracle9i 系列書籍中文化及 Oracle
Press 技術校稿工作。

曾任台灣微軟E-Developer、TechEd 2000 、Enterprise Server 2000


上市博覽會等大型研討會講師,Windows 2000雜誌、Linuxer雜誌專
欄作者,SQL Magazine國際中文版編輯顧問。他同時也是美商甲骨文
公司、昇陽公司等原廠認證講師。您可以透過rich_ho@uuu.com.tw與
他聯繫。

Oracle 9i
資料庫管理實務講座(四) 13

You might also like