1. 程式人生 > >ORALCE邏輯儲存結構

ORALCE邏輯儲存結構

ORACLE邏輯儲存結構
塊: 資料塊 他是最基礎的邏輯儲存單元,資料以行的形式儲存到我麼的資料塊中

區 :多個塊的集合 並且區組成了物理的資料檔案

段 :(表 索引 物化檢視 物化檢視日誌 大物件 大物件) 那麼在括號中的每一個物件都是一個段。而區由組成了段[邏輯的方式] 一個段中包含多個數據檔案

表空間 :表空間指的是段的集合 一個表空間中存在多個段的是 (小表空間) 但是有種特殊的表空間叫(大表空間) 比如說 BLOB CLOB BFILE.....這些都是大表空間中儲存的資料,並且大表空間只能有一個檔案。

BLOB 主要存視訊 圖片 。。。。。一般是不大於4G。
CLOB 主要是存文字、xml程式碼塊等 。像我們部落格大篇的文字都是用clob型別。

BFILE主要是是使用了 物理+資料庫兩種方式進行儲存 物理的檔案存在磁碟空間中 而 這個檔案的路徑 儲存都資料庫的表中。

我們現在儲存大檔案都是用redis進行儲存,備份的用rman備份,但是我老師過備份現在都不用rman備份,都是用儲存備份。


表、索引和段與表空間的對應於使用關係
我們在建立表和建立索引的過程中,實際上就是在建立一個段。而這個段他會根據你表中列的相關型別發生變化。比如說:
CREATE TABLE TAB_T (ID CHAR(18),NAME VARCHAR2(100),MEMBER CLOB,IMAGE BLOB);
根據分析我們可以得出,這裡如果不看相關表中欄位資料型別的話,實際上他只應該建立一個段,並且使用的是小表空間型別,但是這裡有兩個欄位MEMBER和IMAGE使用的是大物件資料型別,所以要為這兩個欄位,單獨建立一個大表空間,並且相關的型別有自己對應段。並且也要為這兩個欄位(member和image)建立獨立的索引。這兩個大物件的索引有是段結構,所以一個大物件建立後會創建出兩個段來,一個是自身的大物件資料段,一個是大物件索引段。

如果這裡我們要把ID這個欄位變成主鍵的話,那麼這個ID欄位也要創建出一個對應的索引段。而這個索引段應該儲存到小表空間型別中,他可以和TBA_T的這個表在一個表空間中,也可以不和這個表在一個表空間中,因為資料段儘量不要和索引段放在一起,放置IO爭搶問題。

資料塊和UNDO塊之間的關係
當我們資料塊中的一行資料發生UPDATE的時候,首先我們資料塊ITL會去記錄相關事務的事務編號,以及事務狀態和事務產生的老資料儲存的UNDO的塊的資訊,並且這些都是又UNDO段中的事務表同步給UNDO塊的。

一個UNDO塊只能被一個事務使用,但是一個事務可能使用多個UNDO塊

行遷移

發生在update,當一個數塊在做UPDATE操作的時候,無法容納新資料(delete後 insert進來的),他會將資料寫到一個新的資料塊中,並且ROWID不發生任何改變依舊是一個。我們管這種情況叫做行遷移

行連結

當一個數據塊在做INSERT操作的時候,無法容納新資料時,他會將資料寫到另一個數據塊中,並且會把相關的資料指標指向到資料結尾(另一個塊開頭的位置)這樣就會發生行連結,只有一個ROWID編號。

無論是行遷移還是行連線,都不會影響事務一致性,但是卻會影響事務的IO.因為無形之中我們在讀一行資料的時候,本來應該讀一個塊,結果變成了讀兩個塊,甚至是多個塊,而且這裡大家要記住,不只是資料塊會發生行遷移或者行連線,我們的UNDO塊依舊會發生。

HWM(高水位線):當我們的段接近不可寫狀態,我們稱之為高水位線,一般到80%時開始預警,90%嚴重警告,或直接導致段拒寫。

UNDO的幾種狀態
FREE 代表UNDO表空間中有足夠的空間來記錄相關的事務。我們稱之為FREE狀態

commit前狀態:

active狀態 事務未提交的狀態,我們稱之為active狀態,這個狀態UNDO表空間的UNDO塊是不允許被再使用的。

commit後狀態:

inactive狀態 事務過期啟用狀態,這種狀態是事務提交後,UNDO塊中的資料沒有超過預設的retention時間,所以我門稱之為inactive狀態。這時候undo塊中的資料依舊是不可以再次被使用的。

expired狀態 事務提交後,並且過retention時間的UNDO資料,那麼這個資料塊可以被重新使用。

UNDO的重要引數指標:
UNDO表空間的位置:在我們的ORACLE資料庫中,一個例項只能使用一個UNDO表空間。
UNDO的retenion時間:指的時事務提交後我們的undo資料可以保留的事件,一般是900秒
guarantee 保證所有的UNDO資料塊中的資料都不過retention時間。

經典面試題:
UNDO表空間不釋放出了啥事?
1 retention時間過長
2 事務並沒有大量提交,依舊處在鎖的狀態
3 UNDO表空間開了自增,不停的有FREE空間給新生事務使用

UNDO表空間使用演算法
UNDO表空間優先使用FREE空間
當FREE空間不夠用的時候,開始使用EXPIRED狀態的UNDO塊
當EXPIRED狀態的塊也不夠用的時候,他就要等待INACTIVE的UNDO塊過retention時間,變成EXPIRED的UNDO塊後接著使用
如果一直不提交,那麼就一直沒有INACTIVE,一直沒有INACTIVE就一直沒有expireed。(這個就和lru演算法一樣,迴圈利