1. 程式人生 > >Oracle體系結構和物理結構

Oracle體系結構和物理結構

下面咱們就具體瞭解一下Oracle的邏輯結構和物理結構:

一、Oracle邏輯結構 

其他關係的邏輯結構,我感覺都是抽象的,但是,Oracle的邏輯結構不抽象,它是一種層次結構,主要由:表空間(Tablespace),段(segment),區(extents)和資料塊(blocks)等概念組成,具體如下圖所示:

1.1資料塊

資料塊是Oracle最小的儲存單位,Oracle的資料放在資料塊中,但是此”資料塊“非作業系統的”系統塊“,這兩個要區分開,一般Oracle資料塊的大小是作業系統系統塊的整數倍。Oracle每次請求資料的時候,都是以資料塊為單位,也就是說,每次請求的資料是塊的整數倍,如果請求的資料量不到一塊,那麼Oracle也會讀取整個資料塊。

資料塊大小是由初始化引數DB_BLOCK_SIZE指定的,符合標準的就是標準塊,不符合標準的就是不標準塊

[email protected] zxy>col name for a20
[email protected] zxy>col value for a10
[email protected] zxy>select name,value from v$parameter where name='db_block_size';

NAME                 VALUE
-------------------- ----------
db_block_size        8192

[email protected]
zxy>

一般情況下:Oracle預設都是8192B,而作業系統的系統塊是2048B,Oracle的資料塊是由4個作業系統塊構成。

資料塊中存放資料、索引資料和簇資料等,無論存放那種資料,其結構都是一樣的,都是由塊頭、表目錄、行目錄、空餘空間(又叫做自由空間)、行資料等5部分組成,如下圖所示: 

資料塊中各個組成部分介紹如下:

  • 塊頭:存放資料塊的基本資訊,如塊的實體地址、塊所屬的段的型別(索引段還是資料段) 
  • 表目錄:存放表的資訊,如果資料塊中存放的是表資料,則表目錄中儲存有關的表資訊
  • 行目錄:如果塊中有行資料存在,則這些行的資訊將被記錄在行目錄中。這些資訊包括行的地址等
  • 空餘空間:空餘空間是一個塊中未使用的區域,這片區域中用於新行的插入和已經存在行的更新
  • 行資料:用於存放表資料和索引資料,這些空間被資料行所佔用

通常把塊頭、表目錄、行目錄這三部分組合起來成為頭部資訊區,頭部資訊區不存放資料,它存放整個塊的引導資訊,起到引導系統讀取資料的作用,如果頭部資訊區遭到破壞,則oracle系統無法讀取這部分資料。空餘空間和行資料用於儲存真正的資料。

補充:空餘空間,這部分非常重要,經常所說的行連結和行遷移就發生在此:無論是行連結還是行遷移,都會影響資料庫的效能。Oracle在讀取這樣的記錄的時候,Oracle會掃描多個數據塊,執行更多的I/O。

當往資料庫中插入(INSERT)資料的時候,塊中的自由空間會減少,當對塊中已經存在的行進行修改(UPDATE)的時候(使記錄長度增加),塊中的自由空間也會減少。DELETE語句和UPDATE語句會使塊中的自由空間增加。當使用DELETE語句刪除塊中的記錄或者使用UPDATE語句把列的值更改成一個更小值的時候,Oracle會釋放出一部分自由空間。釋放出的自由空間並不一定是連續的。通常情況下,Oracle不會對塊中不連續的自由空間進行合併。因為合併資料塊中不連續的自由空間會影響資料庫的效能。只有當用戶進行資料插入(INSERT)或者更新(UPDATE)操作,卻找不到連續的自由空間的時候,Oracle才會主動的合併資料塊中不連續的自由空間。

行連結和行遷移(Row Chaining and Migrating)

  • 行連結(Row Chaining):如果我們往資料庫中插入(INSERT)一行資料,這行資料很大,以至於一個數據塊存不下一整行,Oracle就會把一行資料分作幾段存在幾個資料塊中,這個過程叫行連結(Row Chaining)。如果一行資料是普通行,這行資料能夠存放在一個數據塊中;如果一行資料是連結行,這行資料存放在多個數據塊中。
  • 行遷移(Row Migrating):資料塊中存在一條記錄,使用者執行UPDATE更新這條記錄,這個UPDATE操作使這條記錄變長,這時候,Oracle在這個資料塊中進行查詢,但是找不到能夠容納下這條記錄的空間,無奈之下,Oracle只能把整行資料移到一個新的資料塊。原來的資料塊中保留一個“指標”,這個“指標”指向新的資料塊。被移動的這條記錄的ROWID保持不變。

對於塊中的自由空間,Oracle提供兩種管理方式:自動管理,手動管理

自動管理:Oracle使用點陣圖(bitmap)來管理和跟蹤資料塊,這種塊的空間管理方式叫“自動管理”。自動管理有下面的好處:

  • 易於使用
  • 更好地利用空間
  • 可以對空間進行實時調整

手動管理:使用者可以通過PCTFREE, PCTUSED來調整塊中空間的使用,這種管理方式叫手動管理。相對於自動管理,手動管理方式比較麻煩,不容易掌握,容易造成塊中空間的浪費。

PCTUSED也是用於設定一個百分比,當塊中已使用的空間的比例小於這個百分比的時候,這個塊才被標識為有效狀態。只有有效的塊才被允許插入資料。

PCTFREE引數用於指定塊中必須保留的最小空閒空間百分例,預設值為10。之所以要預留這樣的空間,是因為UPDATE時,需要這些空間。如果UPDATE時,沒有空餘空間,Oracle就會分配一個新的塊,這會產生行遷移(Row Migrating)。

簡單來說:

pctused表示資料所佔最低百分比,如果達到pctused時不能插入資料,delete後如果達到pctused才可以用來insert。

pctfree表示用於保留更新操作的百分比,如果超過該值就不能插入資料。

例如,假定在Create table語句中指定了pctfree為20,則說明在該表的資料段內每個資料塊的20%被作為可利用的空閒空間,用於更新已在資料塊記憶體在的資料行其餘80%是用於插入新的資料行,直到達到80%為止。顯然,pctfree值越小,則為現存行更新所預留的空間越少。因此,如果pctfree設定得太高,則在全表掃描期間增加I/O,浪費磁碟空間;如果pctfree設定得太低,則會導致行遷移。 

pctused引數設定了資料塊是否是空閒的界限。當資料塊的使用空間低於pctused的值時,此資料塊標誌為空閒,該空閒空間僅用於插入新的行。如果資料塊已經達到了由pctused所確定的上邊界時,Oracle就認為此資料塊已經無法再插入新的行。例如,假定在Create table語句中指定pctused為40,則當小於或等於39時,該資料塊才是可用的。所以,可將資料塊填得更滿,這樣可節省空間,但卻增加了處理開銷,因為資料塊的空閒空間總是要被更新的行佔據,所以對資料塊需要頻繁地進行重新組織。比較低的pctused增加了資料庫的空閒空間,但減少了更新操作的處理開銷。所以,如果pctused設定過高,則會降低磁碟的利用率導致行遷移;若pctused設定過低,則浪費磁碟空間,增加全表掃描時的I/O輸出。pctused是與pctfree相對的引數。 

那麼,如何選擇pctfree和pctused的值呢?有個公式可供參考。顯然,pctfree和pctused的之和不能超過100。若兩者之和低於100,則空間的利用與系統的I/O之間的最佳平衡點是:pctfree與pctused之和等於100%減去一行的大小佔塊空間大小的百分比。例如,如果塊大小為2048位元組,則它需要100個位元組的開銷,而行大小是390位元組(為可用塊的20%)。為了充分利用空間,pctfree與pctused之和最好為80%。 

那麼,怎樣確定資料塊大小呢?有兩個因素需要考慮: 

一是資料庫環境型別。例如,是DSS環境還是OLTP環境?在資料倉庫環境(OLAP或DSS)下,使用者需要進行許多執行時間很長的查詢,所以應當使用大的資料塊。在OLTP系統中,使用者處理大量的小型事務,採用較小資料塊能夠獲得更好的效果。 

二是SGA的大小。資料庫緩衝區的大小由資料塊大小和初始化檔案的db_block_buffers引數決定。最好設為作業系統I/O的整數倍。

1.2 資料區(extent)

資料區是一組連續的資料塊。當一個表、回滾段或臨時段建立或需要附加空間時,系統總是為之分配一個新的資料區。一個數據區不能跨越多個檔案,因為它包含連續的資料塊。使用區的目的是用來儲存特定資料型別的資料,也是表中資料增長的基本單位。在Oracle資料庫中,分配空間就是以資料區為單位的。一個Oracle物件包含至少一個數據區。設定一個表或索引的儲存引數包含設定它的資料區大小。

1.3 資料段(segment)

段是由多個數據區構成的,它是為特定的資料庫物件(如表段、索引段、回滾段、臨時段)分配的一系列資料區。段內包含的資料區可以不連續,並且可以跨越多個檔案。使用段的目的是用來儲存特定物件。 

一個Oracle資料庫有4種類型的段: 

  1. 資料段:資料段也稱為表段,它包含資料並且與表和簇相關。當建立一個表時,系統自動建立一個以該表的名字命名的資料段。 
  2. 索引段:包含了用於提高系統性能的索引。一旦建立索引,系統自動建立一個以該索引的名字命名的索引段
  3. 回滾段:包含了回滾資訊,並在資料庫恢復期間使用,以便為資料庫提供讀入一致性和回滾未提交的事務,即用來回滾事務的資料空間。當一個事務開始處理時,系統為之分配回滾段,回滾段可以動態建立和撤銷。系統有個預設的回滾段,其管理方式既可以是自動的,也可以是手工的。 
  4. 臨時段:它是Oracle在執行過程中自行建立的段。當一個SQL語句需要臨時工作區時,由Oracle建立臨時段。一旦語句執行完畢,臨時段的區間便退回給系統。

1.4 表空間(tablespace)

任何資料庫物件在儲存時都必須儲存在某個表空間中。表空間對應於若干個磁碟檔案,即表空間是由一個或多個磁碟檔案構成的。表空間相當於作業系統中的資料夾,也是資料庫邏輯結構與物理檔案之間的一個對映。每個資料庫至少有一個表空間(system tablespace),表空間的大小等於所有從屬於它的資料檔案大小的總和。下面說幾個資料庫不可獲缺的表空間:

  1. System 表空間 :系統表空間是每個Oracle資料庫都具備的,儲存著諸如表空間名稱、表空間所含資料檔案等資料庫管理所需的資訊。系統表空間的名稱是不可更改的。系統表空間必須在任何時候都可以用,也是資料庫執行的必要條件。因此,系統表空間是不能離線的。 系統表空間包括資料字典、儲存過程、觸發器和系統回滾段。為避免系統表空間產生儲存碎片以及爭用系統資源的問題,應建立一個獨立的表空間用來單獨儲存使用者資料。
  2. SYSAUX 表空間:sysaux表空間是隨著資料庫的建立而建立的,它充當SYSTEM的輔助表空間,主要儲存除資料字典以外的其他物件。SYSAUX也是許多Oracle 資料庫的預設表空間,它減少了由資料庫和DBA管理的表空間數量,降低了SYSTEM表空間的負荷
  3. Temp 表空間:臨時表空間儲存Oracle資料庫執行期間所產生的臨時資料。資料庫可以建立多個臨時表空間。當資料庫關閉後,臨時表空間中所有資料將全部被清除。除臨時表空間外,其他表空間都屬於永久性表空間
  4. Undo 表空間:Undo表空間用於儲存Oracle資料庫的撤銷資訊,用於回滾
  5. Users表空間:使用者表空間,用於存放永久性使用者物件的資料和私有資訊。每個資料塊都應該有一個使用者表空間,以便在建立使用者是將其分配給使用者

OK,以上內容為Oracle的邏輯結構,下面就是Oracle的物理結構啦!

二、物理結構

物理結構包含了資料檔案、日誌檔案和控制檔案

  1. data 檔案:每個Oracle資料都有一個或多個物理的資料檔案,資料庫的所有資料都是儲存在資料檔案上
  2. redo 檔案:每個資料庫都有兩個或多個日誌檔案組,每個日誌檔案組根據需要,可以指定幾個成員。每個日誌組用於收集資料庫日誌,而日誌的主要功能是記錄對資料所作的修改,在出現故障時,如果不能將修改資料永久地寫入資料檔案,則可利用日誌得到該修改,所以從不會丟失已有操作成果。日誌檔案主要是保護資料,防止資料丟失。為了防止日誌檔案本身的故障,ORACLE允許鏡象日誌(mirrored redo log),以致可在不同磁碟上維護兩個或多個日誌副本。 日誌檔案中的資訊僅在系統故障或介質故障恢復資料庫時使用,這些故障阻止將資料庫資料寫入到資料庫的資料檔案。然而任何丟失的資料在下一次資料庫開啟時,ORACLE自動地應用日誌檔案中的資訊來恢復資料庫資料檔案。
  3. 控制檔案:每一ORACLE資料庫有一個控制檔案(control file),它記錄資料庫的物理結構,包含下列資訊型別: 

    資料庫名、資料庫資料檔案、日誌檔案的名字和位置、資料庫建立日期。為了安全起見,允許控制檔案被鏡象。每一次ORACLE資料庫的例項啟動時,它的控制檔案用於標識資料庫和日誌檔案,當著手資料庫操作時它們必須被開啟。當資料庫的物理組成更改時,ORACLE自動更改該資料庫的控制檔案。資料恢復時,也要使用控制檔案。

  4. 引數檔案:除了構成Oracle資料庫物理結構的三類主要檔案外,Oracle資料庫還具有另外一種重要的檔案:引數檔案。引數檔案記錄了Oracle資料庫的基本引數資訊,主要包括資料庫名、控制檔案所在路徑、程序等