標籤:
一、資料區塊
Oracle對資料庫資料檔案中的儲存空間進行管理的單位是資料區塊。資料區塊是資料庫中最小的(邏輯)資料單位,是最小的I/O單位。與資料區塊對應的,所有資料在作業系統級的最小實體儲存體單位是位元組。每種作業系統都有一個被稱為塊容量的參數。Oracle每次擷取資料時,總是訪問整個資料區塊,而不是按照作業系統塊的容量訪問資料。資料區塊容量應該設為作業系統塊容量的整數倍,以便減少不必要的I/O操作,一般資料區塊大小為8k。
結構:
頭部:(1)塊的物理地址 (2)塊的段資訊、資料表空間資訊 (3) 事物槽 (4)行目錄:記錄每一行的起始位置
資料:從塊最後的位置開始儲存,成S行串連。行資訊:鎖資訊 列寬 列值 列寬 列值。下一行的鎖資訊 列寬 列值 列寬 列值。
事物槽ITL:用來記錄該塊所有發生的事務,一個itl可以看作是一條事務記錄。當然,如果這個事務已經提交,那麼這個itl的位置就可以被反覆使用了,因為itl類似記錄,所以,有的時候也叫itl槽位。如果一個事務一直沒有提交,那麼,這個事務將一直佔用一個itl槽位,itl裡面記錄了事務資訊,復原段的入口,事務類型等等。如果這個事務已經提交,那麼,itl槽位中還儲存的有這個事務提交時候的SCN號。
PCT-FREE : PCTFREE 參數用來設定一個資料區塊(data block)中至少需要保留(reserve)多少可用空間(百分比值),為資料區塊中已有資料更新時可能發生的資料量增長做準備。
PCTUSED:PCTUSED 參數用於決定一個資料區塊(data block)是否可被用於插入新資料,她的依據是資料區(row data)與資料區塊頭(overhead)的容量之和占資料區塊全部容量的最大百分比。當一個資料區塊中的可用空間比例小於 PCTFREE 參數的規定時,Oracle就認為此資料區塊無法被用於插入新資料,直到資料區塊中的佔用容量比例小於 PCTUSED 參數的限定。
為什麼會有PCT-FREE呢,因為更新塊中的資料的時候,可能會使行資訊變大,佔用更多的空間。如果不預留一定的空間,就會導致大量的行記錄分布在不同的塊中,從而導致訪問一行記錄,需要訪問多個塊,降低oracle的效率。從效率上考慮,oracle一般不允許一條記錄分布在不同的塊。
行遷移:當update操作時,行佔用的空間增大,導致行跨塊時,將整行移出,放置在一個新塊,將新塊的地址放入當前位置。
行遷移大部分是由於PCT_FREE空間過小導致。也可以通過重建表來最佳化資料。
行連結:當一行資料被插入時一個資料區塊就無法容納。在這種情況下Oracle將這行資料存放區在段內的一個資料區塊鏈中,這種是無法避免的。所以,平常建表時,不能將一個表的欄位設定過多,容易導致行串連多,從而降低資料庫的效率。
ROWID:資料庫中行的全域唯一地址。
rowid值主要包含以下資訊:
(1)對象的資料對象編號 對象段編號
資料區段編號和對象編號的區別:當一個表的物理位置發生改變時,資料區段編號會發生改變。對象編號不會發生改變。
當段中的資料被truncate時,Truncate過程是在system資料表空間中重建一個資料區段,原來的資料區段棄用。所以會非常快且資料區段編號也會發生改變。
凡是ddl發生時,不涉及到修改資料,只涉及到原資料(SYSTEM資料表空間中的資料)。Drop表之後為什麼可以很快閃回,因為就是更改了中繼資料,所以很快就能找回。
(2)該行所在的資料檔案中的資料區塊
(3)該行中資料區塊的位置(第一行是0)
(4)資料行所在的資料檔案(第一個檔案是1)。該檔案編號是相對於資料表空間。
通常來說,一個rowid值唯一標識資料中的一行。而且,rowid能記錄資料行的物理位置資訊,所以,無論是用來查詢還是更新,都能非常快。
二、資料區
資料擴充是由一組連續的資料區塊構成的資料庫邏輯儲存分配單位。是資料庫給段分配空間的最小單位。當使用者建立資料表時,Oracle為此表的資料區段分配一個包含若干資料區塊的初始資料擴充。雖然此時資料表中還沒有資料,但是在此初始資料擴充中的資料區塊已經為插入新資料做好了準備。
如果一個段的 初始區中的資料區塊都已裝滿,且有新資料插入需要空間時,Oracle自動為這個段分配一個增量資料擴充。增量資料擴充 是一個段中繼已有資料擴充之後分配的後續資料擴充,她的容量大於或等於之前的資料擴充 。
為了管理的需要,每個段的段頭中包含一個記錄此段所有資料擴充的目錄。
使用者可以在 CREATE TABLE 語句中使用 STORAGE 子句設定儲存參數,決定建立表時為其資料區段(data segment)分配多少初始空間,或限定一個表最多可以包含多少資料擴充。
本地管理的資料表空間通過資料區塊頭的位元影像尋找資料檔案中的可用空間
資料區何時被回收:
1、表,簇表的所有者(owner)或擁有 DELETE ANY 許可權的使用者, 可以使用 TRUNCATE...DROP STORAGE 語句將表,簇表的資料清除
2、DBA 可以使用以下文法收回一個段中未使用的資料擴充:
ALTER TABLE table_name DEALLOCATE UNUSED;
3、如果使用者為復原段(rollback segment)設定了 OPTIMAL 參數,Oracle將周期性地從其中回收資料擴充。
當資料擴充(extent)被釋放後,Oracle修改資料檔案中的位元影像(對於本地管理的資料表空間)或更新資料字典(對於資料字典管理的資料表空間),將回收的資料擴充視為可用空間。被釋放的資料擴充中的資料無法繼續訪問。
只要使用者沒有移除(drop)或清空(truncate)非簇表,那麼對應資料區段內的任何資料區塊都不會被回收。Oracle會在插入資料時使用這些資料區塊(只要資料區塊有足夠的空間)。即使使用者刪除(delete)了表的所有行,Oracle也不會回收此表的資料區塊供資料表空間內的其他方案對象使用。這就是形成高水位線的原因。
三、資料區段
資料區段是與資料庫物件相對應,一般一個資料庫物件對應一個資料區段。多個extent是對應一個資料區段,每個資料區段實際上就是資料庫一個對象的代表。資料表、索引、復原、聚集這些都是資料區段的一種表現形式。同時,資料區段是在資料對象建立的時候就已經建立出來,隨著對象體積的增大,而不斷分配多個extents進行管理。
通俗的講,一般情況下,一個表為一個段。如果表分區了,一個表分區是一個段。其他還有索引段,索引分割區段。二進位大對象段BLOB。
高水位線:
所有的oracle段都有一個在段內容納資料的上限,我們把這個上限稱為"high water mark"或HWM。HWM是一個標記,用來說明已經有多少沒有使用的資料區塊分配給這個segment。HWM通常增長的幅度為一次5個資料區塊,原則上HWM只會增大,不會縮小,即使將表中的資料全部刪除,HWM還是為原值,由於這個特點,使HWM很象一個水庫的曆史最高水位,這也就是HWM的原始含義,當然不能說一個水庫沒水了,就說該水庫的曆史最高水位為0。但是如果我們在表上使用了truncate命令,則該表的HWM會被重新置為0。
高水位線的危害:
1:全表掃描通常要讀出直到HWM標記的所有的屬於該表資料庫塊,即使該表中沒有任何資料。
2:即使HWM以下有閒置資料庫塊,鍵入在插入資料時使用了append關鍵字,則在插入時使用HWM以上的資料區塊,此時HWM會自動增大。
降低高水位線操作:
1:執行表重建指令
2:執行alter table table_name shrink space;
3:複製要保留的資料到暫存資料表t,drop原表,然後rename暫存資料表t為原表
4:truncate
四、資料表空間
由一個或者多個物理資料檔案組成。建表時,將表建在資料表空間上。
系統預設資料表空間:
SYSTEM資料表空間:存放ORACLE資料字典等。資料庫建立的PL/SQL程式單元同樣也儲在system資料表空間.Oracle建義在system資料表空間中除了建立資料字典之外不要再建立任何其它對象。
SYSTEMAUX資料表空間:為system資料表空間的輔助資料表空間。10g版本中增加了另一個強制的資料表空間SYSAUX,它包含一些以前位於system資料表空間中的對象,並且集中儲存支援oracle特性(例如LogMiner、UltraSearch和DataMining)的對象,這些對象提供了新的視圖v$sysaux_occupants,其中顯示了每個組件使用的空間數量以及oracle提供的預存程序的名稱,可以使用這些預存程序將對象移入和移出SYSAUX資料表空間。
UNDO資料表空間:undo資料表空間中會自動分配undo段,這些undo段用來儲存事務中的DML語句的undo資訊,也就是來儲存資料在被修改之前的值。在rollback,執行個體恢複(前滾),一致性讀CR塊的構造時會使用到undo資訊。由於undo的引入,從而Oracle的select語句實現一致性讀時,不需要任何鎖。
undo資料表空間和其它資料表空間有很多類似的地方:undo資料區塊也會被讀到buffer cache緩衝起來,修改時也會產生redo log,資料也會寫回到undo資料表空間的磁碟上。所以崩潰後,undo塊的buffer cache也會恢複過來。
TEMP資料表空間:暫存資料表空間用來管理資料庫排序操作以及用於儲存暫存資料表、中間排序結果等臨時對象,當ORACLE裡需要用到SORT的時候,並且當PGA中sort_area_size大小不夠時,將會把資料放入暫存資料表空間裡進行排序。像資料庫中一些操作: CREATE INDEX、 ANALYZE、SELECT DISTINCT、ORDER BY、GROUP BY、 UNION ALL、 INTERSECT、MINUS、SORT-MERGE JOINS、HASH JOIN等都可能會用到暫存資料表空間。當操作完成後,系統會自動清理暫存資料表空間中的臨時對象,自動釋放臨時段。這裡的釋放只是標記為空白閑、可以重用,其實實質佔用的磁碟空間並沒有真正釋放。這也是暫存資料表空間有時會不斷增大的原因。
暫存資料表空間不會儲存永久類型的對象,所以它不會也不需要備份。另外,對臨時資料檔案的操作不產生redo日誌,不過會產生undo日誌。
建立暫存資料表空間或暫存資料表空間添加臨時資料檔案時,即使臨時資料檔案很大,添加過程也相當快。這是因為ORACLE的臨時資料檔案是一類特殊的資料檔案:疏鬆檔案(Sparse File),當暫存資料表空間檔案建立時,它只會寫入檔案頭部和最後塊資訊。它的空間是延後分配的.這就是建立暫存資料表空間或給暫存資料表空間添加資料檔案飛快的原因。
會話級暫存資料表: 會話級的暫存資料表因為這這個暫存資料表中的資料和你的當前會話有關係,當你當前SESSION不退出的情況下,暫存資料表中的資料就還存在,而當你退出當前SESSION的時候,暫存資料表中的資料就全部沒有了,當然這個時候你如果以另外一個SESSION登陸的時候是看不到另外一個SESSION中插入到暫存資料表中的資料的。即兩個不同的SESSION所插入的資料是互不相干的。當某一個SESSION退出之後暫存資料表中的資料就被截斷(truncate table,即資料清空)了。
事務級暫存資料表:是指該暫存資料表與事務相關,當進行事務提交或者交易回復的時候,暫存資料表中的資料將自行被截斷,其他的內容和會話級的暫存資料表的一致(包括退出SESSION的時候,事務級的暫存資料表也會被自動截斷)。
會話級暫存資料表採用on commit preserve rows;而事務級則採用on commit delete rows;用法上,會話層級只有當會話結束暫存資料表中的資料才會被截斷,而且事務級暫存資料表則不管是commit、rollback或者是會話結束,暫存資料表中的資料都將被截斷。
五、SCHEME(owner)
通俗來講,對應使用者。在資料庫的結構中,一個資料庫有多個使用者。一個使用者由多個段組成。一個資料庫有多個資料表空間,一個資料表空間也由多個段組成。
六、ORCALE檔案介紹
資料庫至少包含:控制檔案、資料檔案、聯機重做記錄檔。這三類檔案,最好能放在儲存上。
控制檔案:控制檔案在Oracle資料庫中扮演著很重要的角色,沒有控制檔案(或者控制檔案損壞了),運行著的執行個體立即崩潰。可以說,控制檔案一旦損壞,資料庫必然down了。Oracle資料庫執行個體啟動過程中,當啟動到unmount時,此時只是在記憶體中為Oracle執行個體分配了執行個體空間,然後如果繼續要啟動到mount狀態,這個時候控制檔案就閃亮登場了,因為Oracle要依據控制檔案找到資料檔案跟重做記錄檔的路徑,確定找到了再進去mount狀態。
控制檔案的內容包括重做記錄檔、資料庫的名稱、資料庫建立資訊、資料表空間資訊、資料檔案的狀態、記錄檔資訊、備份資訊、檢查點資訊等
控制檔案是一個2進位檔案,不可以直接通過文字編輯器進行編寫,這個檔案由Oracle自己進行維護,Oracle建議控制檔案至少有兩份冗餘,並且放在不同的磁碟中。
從資料庫可以查詢到控制檔案的位置,一般3個控制檔案,都是一樣,屬於複用的關係。最好放到不同的目錄下。
參數檔案:spfile。啟動的時候,會讀取。但是運行過程中不會關閉。檔案損壞了,oracle也不會奔潰。spfile動態參數檔案,是二進位檔案,不可以直接用記事本等等程式做修改,可以用ALTER命令做修改,不用重起資料庫也能生效。
備份檔案:離線檔案,主要是備份資料檔案、控制檔案、參數檔案和記錄檔。不能放在儲存上。一般放在帶庫(用于海量資料離線儲存和備份的裝置)上。
歸檔記錄檔:佔用空間很大,但是不能放在儲存上。儲存很容易出問題,由於資料檔案再儲存上,所以,容易丟資料。
預警和追蹤記錄檔檔案:bdump/alert_資料庫名.log 查看oracle是否出現問題。oracle問題診斷的入口。
ORACLE資料庫儲存結構