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