Oracle 存儲結(jié)構(gòu)
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”
優(yōu)質(zhì)文章,第一時間送達(dá)
作者 | 夜光兔
來源 | urlify.cn/uEnEJn
數(shù)據(jù)庫是存儲數(shù)據(jù)的容器,它的主要功能是保存和共享數(shù)據(jù)。
oracle數(shù)據(jù)庫的存儲結(jié)構(gòu)可以分為邏輯存儲結(jié)構(gòu)和物理存儲結(jié)構(gòu),對于這兩種存儲結(jié)構(gòu),oracle是分別進(jìn)行管理的。
邏輯存儲結(jié)構(gòu):oracle內(nèi)部組織和管理數(shù)據(jù)的方式。
物理存儲結(jié)構(gòu):oracle外部(操作系統(tǒng))組織和管理數(shù)據(jù)的方式。
接下來我們對上面的兩種結(jié)構(gòu)進(jìn)行詳細(xì)的介紹。
1.邏輯存儲結(jié)構(gòu)

圖 1 Oracle 邏輯存儲結(jié)構(gòu)

圖 2 Oracle 邏輯存儲結(jié)構(gòu)
如圖 1和圖 2 所示,oracle在邏輯上將保存的數(shù)據(jù)劃分為一個個小單元來進(jìn)行存儲和維護(hù),更高一級的邏輯存儲結(jié)構(gòu)都是由這些基本的小單元組成的。
邏輯結(jié)構(gòu)類型按照尺寸從小到大分可分為:塊(block)-->區(qū)(extent)-->段(segment)-->表空間(tablespace)
塊(Block)
Oracle用來管理存儲的最小單元,也是最小的邏輯存儲結(jié)構(gòu)。Oracle數(shù)據(jù)庫在進(jìn)行輸入輸出時,都是以塊為單位進(jìn)行讀寫操作的。我們建議數(shù)據(jù)塊的尺寸為操作系統(tǒng)塊尺寸的整數(shù)倍(1、2、4等)。另外,塊的大小是在創(chuàng)建數(shù)據(jù)庫的時候決定的,之后不能修改。當(dāng)然,oracle同時也支持不同的表空間擁有不同的數(shù)據(jù)塊尺寸。下面,我們對塊的結(jié)構(gòu)進(jìn)行一些介紹。
塊的頭部信息區(qū):
塊頭:包含塊的一般屬性信息 如塊的物理地址、塊所屬的段的類型。
表目錄:如果塊中存儲的數(shù)據(jù)是表數(shù)據(jù), 則在表目錄中保存塊中所包含的表的相關(guān)信息。
行目錄:行記錄的相關(guān)信息 如ROWID。
塊的存儲區(qū):主要包含空閑空間和已經(jīng)使用的空間。Oracle主要是通過下面的兩個參數(shù)對這部分空間進(jìn)行管理的:
* PCTFREE參數(shù):指定塊中必須保留的最小空閑空間比例。當(dāng)塊中的空閑存儲空間減少到PCTFREE所設(shè)置的比例后,Oracle將塊標(biāo)記為不可用狀態(tài),新的數(shù)據(jù)行將不能被加入到這個塊。
* PCTUSED參數(shù):制定一個百分比,當(dāng)塊中已經(jīng)使用的存儲空間降低到這個百分比以下時,這個塊才被重新標(biāo)記為可用狀態(tài)。
注意:以上兩個參數(shù)既可以在表空間級別進(jìn)行設(shè)置,也可以在段級別進(jìn)行設(shè)置。段級別的設(shè)置優(yōu)先級更高。
區(qū)(Extent)
比塊高一級的邏輯存儲結(jié)構(gòu),由連續(xù)的塊組成,它是oracle在進(jìn)行存儲空間的分配和回收的最小單位。在創(chuàng)建具有獨(dú)立段結(jié)構(gòu)的數(shù)據(jù)庫對象時,例如表、索引等,Oracle會為數(shù)據(jù)庫對象創(chuàng)建一個數(shù)據(jù)段,并為數(shù)據(jù)段分配一個‘初始區(qū)’。
后續(xù)區(qū)的分配方式,則根據(jù)表的空間管理辦法不同,而采用不同的分配方式,例如autoextent,uniform size 或者在創(chuàng)建表或表空間時設(shè)置default storage 子句。
另外,用戶還能夠通過執(zhí)行下面的命令來回收表、索引等對象中未使用的區(qū):
SQL>alter table table_name deallocate unused;段(Segment)
由多個區(qū)組成,這些區(qū)可以是連續(xù)的,也可以是不連續(xù)的。當(dāng)用戶在數(shù)據(jù)庫中創(chuàng)建各種具有實際存儲結(jié)構(gòu)的對象時(保存有數(shù)據(jù)的對象),比如表、索引等,Oracle將為這些對象創(chuàng)建“段”。一般一個對象只擁有一個段。
在創(chuàng)建段時,可以為它指定PCTFREE、PCTUSED等參數(shù)來控制其中的塊的存儲空間管理方式,也可以為它指定INITIAL、NEXT、PCTINCREASE等存儲參數(shù),以指定其中區(qū)的分配方式。如果沒有為段指定這些參數(shù),段將自動繼承表空間的相應(yīng)參數(shù)。
不同類型的數(shù)據(jù)庫對象擁有不同類型的段:
數(shù)據(jù)段:保存表中的記錄。
索引段:索引中的索引條目。
臨時段:在執(zhí)行查詢等操作時,Oracle可能會需要使用到一些臨時存儲空間,用于臨時保存解析過的查詢語句以及在排序過程中產(chǎn)生的臨時數(shù)據(jù)。
回滾段:保存回滾數(shù)據(jù)。
表空間(Tablespace)
最高級的邏輯存儲結(jié)構(gòu),數(shù)據(jù)庫是由多個表空間組成的。在創(chuàng)建數(shù)據(jù)庫時會自動創(chuàng)建一些默認(rèn)的表空間,例如 SYSTEM表空間,SYSAUX表空間等。通過使用表空間,Oracle將所有相關(guān)的邏輯結(jié)構(gòu)和對象組合在一起。我們可以在表空間級別指定存儲參數(shù),也可以在段級別指定。
下面我們列出常見的表空間,和它們所存儲的信息:
數(shù)據(jù)表空間:用于存儲用戶數(shù)據(jù)的普通表空間。
系統(tǒng)表空間:默認(rèn)的表空間,用于保存數(shù)據(jù)字典(一組保存數(shù)據(jù)庫自身信息的內(nèi)部系統(tǒng)表和視圖,及用于Oracle內(nèi)部使用的其他一些對象),保存所有的PL/SQL程序的源代碼和解析代碼,包括存儲過程和函數(shù)、包、數(shù)據(jù)庫觸發(fā)器等,保存數(shù)據(jù)庫對象(表、視圖、序列)的定義。
回滾表空間:用于存放回滾段,每個實例最多只能使用一個回滾表空間。
臨時表空間:存儲SQL執(zhí)行過程中產(chǎn)生的臨時數(shù)據(jù)。
最后,我們可以用下面的比喻來描述邏輯結(jié)構(gòu)關(guān)系:
塊 (一張張白紙) ---> 區(qū)(白紙組成的本子)---> 段(多個本子放到一個文件袋中)---> 表空間(存放多個文件袋的文件柜)
2.物理存儲結(jié)構(gòu)
Oracle數(shù)據(jù)庫邏輯上由一個或多個表空間組成,每個表空間在物理上由一個或多個數(shù)據(jù)文件組成,而每個數(shù)據(jù)文件是由數(shù)據(jù)塊構(gòu)成的。所以,邏輯上數(shù)據(jù)存放在表空間中,而物理上存儲在表空間所對應(yīng)的數(shù)據(jù)文件中。我們可以用下圖來描述數(shù)據(jù)文件和表空間的關(guān)系。

圖 3 Oracle 邏輯存儲結(jié)構(gòu)和物理存儲結(jié)構(gòu)對應(yīng)關(guān)系

圖 4 Oracle 邏輯存儲結(jié)構(gòu)和物理存儲結(jié)構(gòu)對應(yīng)關(guān)系
構(gòu)成數(shù)據(jù)庫的物理文件主要有三種:
數(shù)據(jù)文件:存放數(shù)據(jù)庫數(shù)據(jù)。
控制文件:存放數(shù)據(jù)庫的基本信息,告訴數(shù)據(jù)庫到哪里找到數(shù)據(jù)文件和重做日志文件等。對數(shù)據(jù)庫的成功啟動和正常運(yùn)行是很重要的。
重做日志文件:存放對數(shù)據(jù)的改變。至少兩組,Oracle以循環(huán)方式來使用它們。
粉絲福利:Java從入門到入土學(xué)習(xí)路線圖
??????

??長按上方微信二維碼 2 秒
感謝點(diǎn)贊支持下哈 
