阐述oracle的体系结构,Oracle数据库逻辑体系结构详解
以前對Oracle數(shù)據(jù)庫的了解大多數(shù)是集中在mysql,最近工作里面一直使用的是Oracle,雖然說在互聯(lián)網(wǎng)行業(yè)mysql大行其道,但是一些傳統(tǒng)行業(yè)或者是金融領(lǐng)域還是更加傾向于使用oracle,sqlserver這種大型數(shù)據(jù)庫。為此還是有必要深入了解以下oracle的一些內(nèi)部機制的。
有過oracle使用經(jīng)驗的人都知道表空間(tablespace)的概念,表空間其實是一個邏輯概念,它并不實際存在。而與之關(guān)系密切的是數(shù)據(jù)文件(datafile),數(shù)據(jù)文件是實際存在的,并且和表空間是多對1的關(guān)系。其實只知道這些是遠遠不夠的,前段時間遇到一個數(shù)據(jù)文件超過32G導致的業(yè)務問題,才突然醒悟騷年靜下心好好學習學習oracle底層的一些概念才是解決問題的王道。首先我們從整體來上了解一下oracle的邏輯體系結(jié)構(gòu)。在這里附上一張百度到的圖片。
圖片中展示的oracle的最大的邏輯結(jié)構(gòu)為數(shù)據(jù)庫,其實這里最大的體系結(jié)構(gòu)應該是實例(instance),并且實例和數(shù)據(jù)庫是一對一的關(guān)系,這樣的話我們可以將上圖看作是oracle體系結(jié)構(gòu)中的一個可分割的最大單元。 可以看出數(shù)據(jù)庫可劃分的最大單元為表空間,而表空間又由段(segment)組成,段由extent構(gòu)成,如果再往下分的話是block,oracle中block的概念不同于操作系統(tǒng)中塊文件的概念,這個我們后面章節(jié)解釋。下面我們對上述的一些概念進行一下闡述:
表空間:表空間是oracle抽象出來的最大的邏輯單元,用于存儲數(shù)據(jù)庫對象。和表空間相關(guān)的概念為數(shù)據(jù)文件,可以通過dba_data_files來查看表空間和數(shù)據(jù)文件的關(guān)系。
表空間分類:
永久表空間 :存儲數(shù)據(jù)庫中需要永久化存儲的對象,比如二維表、視圖、存儲過程、索引。
臨時表空間 :存儲數(shù)據(jù)庫的中間執(zhí)行過程,如:保存order by數(shù)據(jù)庫排序,分組時產(chǎn)生的臨時數(shù)據(jù)。操作完成后存儲的內(nèi)容會被自動釋放。臨時表空間是通用的,所的用戶都使用TEMP作為臨時表空間。一般只有tmp一個臨時表空間,如果還需要別的臨時表空間時,可以自己創(chuàng)建。
UNDO表空間 :保存數(shù)據(jù)修改前的副本。存儲事務所修改的舊址,即被修改之前的數(shù)據(jù)。當我們對一張表中的數(shù)據(jù)進行修改的同時會對修改之前的信息進行保存,為了對數(shù)據(jù)執(zhí)行回滾、恢復、撤銷的操作。
段: 段是指占用數(shù)據(jù)文件空間的通稱,或數(shù)據(jù)庫對象使用的空間的集合;段可以有表段、索引段、回滾段、臨時段和高速緩存段等。說到這里有必要提一下表段,因為標段中如果表作為一個分區(qū)表,那么表的一個分區(qū)占用一個段。
段分類: 由于oracle中段比較多,這里我們只是簡單的說一些比較常見的段。
表段:表段,故名思意,它是專門用于存儲表的信息的數(shù)據(jù)結(jié)構(gòu),通常與索引段聯(lián)合使用。
分區(qū)段:這種段類型用于分區(qū),與表段很相似。分區(qū)表由一個或多個表分區(qū)段組成,組合分區(qū)表則由一個或多個表子分區(qū)段組成。
索引段:這種段類型可以保存索引結(jié)構(gòu),與mysql類似,在mysql中mysiam存儲引擎下索引和數(shù)據(jù)是分開的,而innodb引擎下是存儲在一起的。
索引分區(qū): 類似于表分區(qū),這種段類型包含一個索引的某個片。分區(qū)索引由一個或多個索引分區(qū)段組成。
臨時段: 用于存放臨時數(shù)據(jù),比如帶有order by語句的sql會在臨時段內(nèi)存儲數(shù)據(jù)。
回滾段:回滾段是 DBA手動創(chuàng)建的段。 Type2 undo段由 Oracle自動創(chuàng)建和管理。
還有很多其他的段,感興趣的大家自行研究一哈。
區(qū):區(qū)是oracle中由塊組成的邏輯單元,在10G中只要創(chuàng)建了表的時候就會分配區(qū),而在11G及其之后是當插入數(shù)據(jù)的時候才會分配區(qū)。區(qū)的分配則是動態(tài)的,當表的容量超過當前區(qū)所能承載的范圍時就會自動添加新的區(qū)。這個內(nèi)容可以通過dba_extents表查看。
塊: oracle的塊是建立在數(shù)據(jù)庫塊的基礎之上的,通常oracle的塊可以是2,4,8,16,32K,是系統(tǒng)塊的整數(shù)倍,并且定義之后不能被修改。在這里引入一個前段時間遇到的問題: oracle數(shù)據(jù)文件超過32G導致業(yè)務失敗的問題。這是因為測試環(huán)境上面使用的是smallfile tablespace 模式,所以需要滿足以下制約:
由于Oracle數(shù)據(jù)庫的Rowid中使用22位來代表Block號,這22位最多只能代表2^22-1(4194303)個數(shù)據(jù)塊,而在我們一般情況下使用的數(shù)據(jù)塊大小為8k,所以數(shù)據(jù)文件的理論大小最大為: 31.9999924G,并且在數(shù)據(jù)文件超過32G的情況下,唯一能做的就是添加一個datafile。
了解更多Oracle數(shù)據(jù)庫相關(guān)內(nèi)容請關(guān)注職坐標Oracle數(shù)據(jù)庫頻道。
總結(jié)
以上是生活随笔為你收集整理的阐述oracle的体系结构,Oracle数据库逻辑体系结构详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拼接的option会多出空行_Word空
- 下一篇: mysql字段是否存在_mysql判断列