天天看點

ocp聽課總結之2——資料庫體系結構

1、資料庫的結構:

1、控制檔案(ctl):其中有四類資訊,分别是

資料庫的實體結構資訊,

資料庫的歸檔曆史資訊,

各個資料檔案的scn号和check point(系統檢查點)

rman源資料。這四類資訊很重要,接下來可以仔細研究一下:

2、redo log files:redo日志檔案有多組,每組内都有多個成員。成員之間是完全相同的關系,一般分為group1,group2,group3。。。等組。這樣就可以實作多組複用。redo log 有四種狀态,分别是 unused,inactived,active,courent。當處于courent狀态的時候如果redo log 丢失,就會丢失資料,且聽我慢慢分析,我們知道執行個體恢複其實就是根據redo

log重新構造髒塊,然後有dbwr程序将資料寫入磁盤的過程。回頭再看由于資料庫送出事務日志和資料寫入磁盤的不一緻性,導緻了redo log記錄事務已經送出,但是實際上資料還在髒塊裡的事情是有的,如果此時丢失,就發生了無法恢複的資料丢失。

orcole在redo log 中記錄每一個 資料塊的修改的版本号,在資料恢複的時候,如果發現日志的版本号比資料塊的版本号要低,那日志就空跑。。當檢查點程序(CKPT程序)觸發時候 會在目前的緩沖區内找到一個叫檢查點隊列的清單,然後找到裡面 最早髒資料塊的位址 寫入控制檔案,這樣下次啟動的時候,oracle就知道了從哪個日志開始恢複髒塊。

3、資料檔案(dbf):

oracle建立一個表的時候,先做兩件事,先去oracle資料字典中把該表的資訊寫入,如表名,有多少列,列的名字屬性等資訊。第二件事,在表空間内配置設定空間。。

但是建立一個視圖的時候,oracle隻做一件事,那就是把視圖的資訊寫到資料字典裡。

2、database interface:

就是一些em,gc,sqlplus之類的與oracle資料庫進行互動的工具。

desc指令一般是用來描述一個表的,但是一般人不知道他用來描述一個包是很有用的。

3、select *:

相老師說select * 會嚴重降低查詢的性能,他說這與資料行在資料塊中的存儲是相關的,我研究了一下這些資料行在塊中是如何存儲的,現在整理如下:

資料行是由n(n是一個或者多個)個行片段來存儲的,但是有一點,這些行片段隻能存儲資料表的前255列。

接下來看第一種情況:一個塊可以納一個完整的資料行,且這個資料行小于255列,則這個行用一個行片段來存儲。當新插入或者更新資料行,導緻一個塊不能容納這個資料行的時候,這時oracle會用另個一個資料塊的行片段來存儲這一行。這一行也就成了多個資料塊之間的行連結。

接下來看第二種情況:一個塊可以容納一個完整的資料行,但是這個表的列大于255列,假設900列吧,但是列的資料還是比較小,整個行都可以存在同一個資料塊裡,這時,oracle會在同一個塊裡分好幾個行片段來存儲,每個行片段存儲255列。這就構成了塊内連結。這時在塊内用各行片段的rowid進行行内連結,這樣同一個塊内不會産生I/O。

每一個行片段都有兩大部分組成:行頭 和

列資料。(可以想象的到,如果某列的資料非常大,可能跨多個行片段,也可能跨多個資料塊哈哈)

行頭:包含以下内容:行管理開銷、列數、簇鍵ID(如果是簇表)、行片段連結的rowid(如果有行連結)。

列資料:各列的列長及列内容。

如果一行能被存儲于一個資料塊中,那麼其行頭所需容量将不少于3 位元組。在行頭資訊之後依次儲存的是各列的列長及列值。列長存儲于列值之前,如列值不超過250 位元組,那麼 Oracle 使用1 位元組存儲其列長;如列值超過250 位元組,則使用3 位元組存儲其列長。列資料所需的存儲空間取決于此列的資料類型。如果某列的資料類型為變長的,那麼存儲此列值所需的空間可能會随着資料更新而增長或縮小。

為了節約存儲空間,如果某列值為空,那麼資料庫中隻存儲其列長(值為 0),而不存儲任何資料。對位于一行末尾的空列值,資料庫中将列長也忽略不予存儲。另外,每行還要占用資料塊頭中行目錄區的2 位元組空間。簇表内的行需要存儲與非簇表行相同的資訊。除此之外,簇表内各行還需要存儲其所屬的簇鍵。

行片段的 rowid

Oracle 使用 rowid 記錄每個行片段的存儲位置和位址。每個行片段得到一個 rowid 之後,這個值将會保持不變,直到其所屬行被删除或經過 Oracle 工具導出并再次導入。對于簇表來說,如果某行的簇鍵值發生改變,那麼此行除了儲存原有的 rowid 之外,還将為新簇鍵值存儲一個額外的 rowid 指針。由于行片段在其生命周期内擁有固定的 rowid,是以在 SELECT,UPDATE,及 DELETE 等 SQL 語句中可以充分利用 rowid 的這個特性。

4、資料庫啟動的三個階段:

這三個階段分别是 startup nomount、mount、open 。

第一步:startup nomount:oracle根據目前的oracle_sid到 dbs目錄下的spfileorcl.ora檔案,根據檔案的參數設定,初始化一塊記憶體區域,配置設定各個SGA元件,同時啟動相應的背景程序。好了,這個執行個體産生了。(如果這個時候資料庫啟動不了,報出spfile錯誤等,那就說明隻有一個原因,spfileorcl.ora檔案除了問題。)

第二步:mount:即為打開控制檔案的過程,再根據spfileorcl.ora檔案找到控制檔案的位置,将控制檔案打開。(如果資料庫不能mount 了,那一定是控制檔案出問題了)

第三步:open:這個過程就是打開 redo log 和 dbf檔案的過程。但是這個時候你的知道資料庫的實體結構,在哪知道呢?第二步的mount時,就已經找到了控制檔案,控制檔案中就記錄了資料庫的實體結構。

在打開資料檔案的後,肯定要判斷這個資料庫是需要執行個體恢複呢?還是需要媒體恢複呢?怎麼判斷呢?這裡先不細說了,隻要知道主要是通過SCN号來判斷的,控制檔案裡有scn号,資料檔案裡頭部也有SCN号,還有redo log 的SCN号。。。在資料檔案的頭部,除了scn号,還有一個叫ckpt count的一個參數。還有别的檢查等以後詳細說明,在此判斷後,如果資料庫是一緻的,那就直接打開,如果出現不一緻,那就再做相應的媒體或者執行個體恢複。

5、資料庫關閉的幾種方式:

關閉資料庫有四種方式,下面我一一列舉出來,

1) shutdown abort  ——  一般不用這個來關閉資料庫,這個是相當于直接斷電。跟那個執行個體失敗(instance failure)或者 startup force 一樣。。。(相老師說用shutdown abort 之後去冷備資料庫,備完了肯定不能用。)直接殺死程序,已經修改的緩沖區資料不會寫到資料檔案中,沒沒有送出的事務也不會有時間復原。(abort

流産,堕胎,使終止)

2)shutdown immediate —— ,執行它後, 不再允許新的connection往上連接配接, 上來就kill session,也不會等待事務結束,未送出的事務立即復原。會做一個完全檢查點(檢查點分兩種,有增量和完全兩種,以後細談)。把緩沖區内的所有髒塊都寫入磁盤。

3)shutdown transactional——等到目前事務關閉以後在關閉資料庫,缺點是如果有的事務遲遲不送出,那就不能關閉資料庫了,是以一般也不用,還有一點要注意,如果用這個,遲遲沒送出,你着急了,就ctrl+c 一下,這樣是十分十分危險的,控制檔案 很容易被損壞。

4)shutdown normal

——  

ocp聽課總結之2——資料庫體系結構

6、listener初識:

可以認為listener與資料庫是獨立分開的, 但是listener和資料庫之間是有通信的,listener 有兩種注冊方式:動态注冊和靜态注冊: