天天看點

Oracle核心系列-揭秘ASM磁盤頭資訊

專家簡介

Oracle核心系列-揭秘ASM磁盤頭資訊

馬育義

【dba+社群】廣州群副

擁有5年dba運維經驗,精通oracle資料庫管理,深入了解oracle 體系結構,擅長使用rac、dataguard、goldengate等技術解決oracle資料庫運維故障。精通oracle資料庫安裝配置、性能診斷、故障處理、備份解決方案的設計與實施。oracle ocp認證講師,在oracle ocp和ocm的教育訓練方面也有較為豐富的經驗,曾多次負責廣東移動、深圳航空的dba教育訓練工作。

1asm中繼資料 

從10g開始,資料檔案的存儲除了使用裸裝置和檔案系統外,還可以存放在asm中。簡單的了解,存放在asm中的資料檔案,日志檔案,控制檔案,歸檔日志等等,就是asm file。僅有以下的檔案類型可以存放在asm diskgroup中:

control file

datafile

temporary data file

online redo log

archive log

rman backup

datafile copy

spfile

disaster recovery configuration

flashback log

change tracking bitmap

datapump dumpset

一個asm file的名字一般以一個”+”和diskgroup名字開頭。 當oracle rdbms kernel核心的檔案i/o層碰到一個以”+”開頭的檔案時,就會走到相關asm的代碼層中 而不是調用依賴于作業系統的檔案系統i/o。 僅僅在file i/o層面才會認識到這是一個asm 中的檔案,而其上層的核心代碼看來asm file和os file都是一樣的。

舉例:

+dataa/orcl/datafile/system.256.689832921

格式說明: +data/orcl/datafile/tbs_name.asm_filenumber.incarnation_number

orcl:資料庫名稱

datafile: 檔案類型,表示是資料檔案

tbs_name: 表空間名

asm file#: 表示asm file編号,$asm_file.file_number

incarnation number: 從時間戳提取,唯一值。

在一個asm diskgroup中僅僅允許存放已知的oracle檔案類型。假設一個檔案通過cp拷貝到asm diskgroup中,則該檔案的第一個塊将被檢驗以便确認其類型,以及收集其他資訊來建構這個檔案的完整asm檔案名。 如果其檔案頭無法被識别,則該檔案在diskgroup中的建立将會報錯。

asm在配置設定空間時,以au為機關進行,au即allocation units,是組成asm disk的基本單元。在oracle 10gr2中,asm au的預設機關大小是1m,相應的條帶化大小是128k,可以通過調整_asm_ausize隐含參數來調整au大小,調整_asm_stripesize控制相應的條帶化大小。

11g後可以在建立磁盤組時可以配置au 大小,au的允許大小有1、2、4、8、16、32 或64 mb。

Oracle核心系列-揭秘ASM磁盤頭資訊

所有被asm所支援的檔案類型仍以其file block作為讀和寫的基本機關。在asm中的檔案仍保持其原有的 block size 例如資料檔案預設為8k,asm并不能影響這些東西。值得一提的是在asm file number 1 的filedir中記錄了每一種file type對應的block size。

asm的中繼資料都存儲在asm磁盤中,用以存放asm diskgroup控制資訊的資料,metadata包括了該磁盤組中有哪些磁盤,多少可用的空間,其中存放的file的名字,一個檔案有哪些extent等等資訊。

中繼資料分成2類,一類是實體中繼資料(physical metadata),一類是虛拟中繼資料(virtual metadata)。實體中繼資料存儲在磁盤的固定位置,通常在asm磁盤頭。虛拟中繼資料後者存儲在asm檔案上,和正常的asm file一樣在所有磁盤之間均勻分布。事實上虛拟中繼資料也是當做一個個asm file來維護的。

所有的中繼資料block均是4k大小,并且有checksum資訊來确認block是否被損壞。

一個asm disk的最前面4096位元組為disk header,對于asm而言是block 0 (blkn=0)。asm disk header描述了該asm disk和diskgroup的屬性,通過對現有disk header的加載,asm執行個體可以知道這個diskgroup的整體資訊。是以對那些會影響asm disk header的操作要慎之又慎,同時最好定期備份disk header。

實體中繼資料存儲在磁盤的固定位置,通常在asm磁盤頭,其由以下組成:

Oracle核心系列-揭秘ASM磁盤頭資訊
Oracle核心系列-揭秘ASM磁盤頭資訊

實體中繼資料用于描述磁盤組的組成、空間配置設定等内容。而虛拟中繼資料則用于記錄asm檔案在磁盤上的分布,虛拟中繼資料也存在于asm檔案當中,和其他asm檔案的分布和管理完全相同。虛拟中繼資料一般包含:

Oracle核心系列-揭秘ASM磁盤頭資訊
Oracle核心系列-揭秘ASM磁盤頭資訊

asm的實體中繼資料都儲存在au 0和au 1中,其他的虛拟中繼資料的位置要到file directory去查詢,該目錄記錄了所有asm file的中繼資料,每個asm file在它裡面都有一條記錄,它記錄了每個asm file的extent對應的disk number和au number。

file directory的起始點存儲在磁盤0的2号au上面。2号au總共有256個塊。每一個塊大概4kb。第0個塊是用于檔案頭留用。從第1個塊開始記錄檔案asm file number為1的磁盤分布資訊,而第2個塊開始記錄asm file number為2的磁盤分布資訊。以此類推,剛好從asm file number從1-255都儲存在2号au上面。是以file#1至少包含了2個au,因為我們的資料庫檔案的file number是從256開始的。

想知道虛拟中繼資料的分布情況,就要先找到file#1的disk number和au number的分布資訊,就需要讀取0号磁盤的2号au的第一個塊。

oracle提供了一個kfod工具,10gr2以上都有自帶,用于列舉搜尋磁盤。我們先看看測試環境中有哪些共享磁盤:

Oracle核心系列-揭秘ASM磁盤頭資訊

在我的測試環境中,磁盤組data有兩個磁盤raw3和raw4:

Oracle核心系列-揭秘ASM磁盤頭資訊

asm block的檢視,oracle提供了一個kfed工具。11g後可直接在oracle使用者下使用,而10g則需要編譯一下:

Oracle核心系列-揭秘ASM磁盤頭資訊

查找file#1的au分布情況:

Oracle核心系列-揭秘ASM磁盤頭資訊

我們可以看到file#1有2個au:

disk 0,au[2]

disk 1,au[2]

Oracle核心系列-揭秘ASM磁盤頭資訊

案例:查詢控制檔案的au資訊

現在我想檢視控制檔案的au資訊,先計算控制檔案的au資訊在file directory的哪個塊:

Oracle核心系列-揭秘ASM磁盤頭資訊

接下來我們讀取1号磁盤的2号au的第4個塊。這個au是從塊0來記錄256号檔案的。無需進行預留。為什麼是第4個塊?

260-255=5  預設從0号塊開始,是以第4個塊代表了260号檔案

然後我們查出包括控制檔案的au資訊。

Oracle核心系列-揭秘ASM磁盤頭資訊
Oracle核心系列-揭秘ASM磁盤頭資訊

最後我們找一個au來确認一下是否是控制檔案。我們用作業系統的dd指令讀取0号檔案的第834号au資訊。

Oracle核心系列-揭秘ASM磁盤頭資訊

通過視圖x$kffxp可以更直覺地檢視asm file的實體配置設定au情況。該視圖主要是反映了file extent map的映射關系。asm把檔案分成多個extent,而extent是由au構成的。

Oracle核心系列-揭秘ASM磁盤頭資訊

通過x$kffxp和v$asm_alias、v$asm_disk、v$asm_diskgroup等相連,可以友善地查詢到各個asm file的au分布情況:

Oracle核心系列-揭秘ASM磁盤頭資訊
Oracle核心系列-揭秘ASM磁盤頭資訊

2asm磁盤頭

asm disk header描述了該asm disk和diskgroup的屬性,通過對現有disk header的加載,asm執行個體可以知道這個diskgroup的整體資訊。

下面是一個典型的disk header的組成:

Oracle核心系列-揭秘ASM磁盤頭資訊
Oracle核心系列-揭秘ASM磁盤頭資訊
Oracle核心系列-揭秘ASM磁盤頭資訊

下面的資訊是在同一個diskgroup中的所有disk的header上均會複制一份的:

disk group name and creation timestamp

physical sector size of all disks in the disk group

allocation unit size

metadata block size

software version compatibility

default redundancy

mount timestamp

下面的資訊是每一個asm disk獨有的:

asm disk name (not os path name)

disk number within disk group

failure group name

disk size in allocation units

asm磁盤頭的檢視,我們可以直接使用oracle提供的kfed工具。

Oracle核心系列-揭秘ASM磁盤頭資訊

但是這樣不一樣能發現中繼資料有異常的情況,我們可以使用kfed find指令檢驗au[0]所有塊的中繼資料類型是否正常。如果出現非以下結果的塊,說明asm中繼資料塊有所損壞。

Oracle核心系列-揭秘ASM磁盤頭資訊

注:以上隻是檢驗中繼資料塊的類型是否正常,如果中繼資料塊中内容有誤,目前還是沒有辦法可以直接檢查出來。

asm磁盤頭的重要性無庸置疑,通過觀察asm磁盤頭各項含義後,我們發現asm磁盤頭并不類似其他asm file一樣經常變化修改,這使得對asm磁盤頭的備份具體有行性。

對于10.2 到11.1.0.6的asm,磁盤頭的備份方法就是dd或者kfed。

dd備份:

Oracle核心系列-揭秘ASM磁盤頭資訊

dd恢複示範:

1、模拟磁盤頭損壞

Oracle核心系列-揭秘ASM磁盤頭資訊

此時再挂載磁盤組報錯:

Oracle核心系列-揭秘ASM磁盤頭資訊

2、檢查磁盤頭内容

kfed檢查asm 磁盤頭,kfed輸出顯示磁盤頭的資訊全部都是0,說明asm磁盤頭被覆寫或損壞了。

Oracle核心系列-揭秘ASM磁盤頭資訊

3、使用前面的dd備份恢複

Oracle核心系列-揭秘ASM磁盤頭資訊

4、重新挂載磁盤組

Oracle核心系列-揭秘ASM磁盤頭資訊

kfed備份:

Oracle核心系列-揭秘ASM磁盤頭資訊

kfed恢複:

Oracle核心系列-揭秘ASM磁盤頭資訊

注意:如果既無dd備份也無kfed備份,則隻能手動修複磁盤頭,後面有詳細介紹。

從10.2.0.5、11.1.0.7、11.2之後asm磁盤頭會自動備份到au#1的倒數第二個block。對于au size是1mb的diskgroup,每個au包括block數量=1024kb/4kb=256個,是以備份資訊位于au#1的第254号block(block從0号開始)。當然可以計算得到:

Oracle核心系列-揭秘ASM磁盤頭資訊

檢視asm磁盤頭備份資訊,備份資訊與asm disk header資訊完全一緻(blk、check除外):

Oracle核心系列-揭秘ASM磁盤頭資訊

是以可以直接使用kfed指令修複磁盤頭。

Oracle核心系列-揭秘ASM磁盤頭資訊
Oracle核心系列-揭秘ASM磁盤頭資訊

2、kfed修複磁盤頭

Oracle核心系列-揭秘ASM磁盤頭資訊

3、檢視新的磁盤頭

Oracle核心系列-揭秘ASM磁盤頭資訊

針對10g和11gr1,由于asm沒有自動備份磁盤頭。在某些磁盤維護操作時很容易誤删除磁盤頭資料,此時就隻能通過手工重構磁盤頭。

重構磁盤頭主要需要修改下列值:

kfbh.endian

kfbh.block.obj

kfdhdb.driver.provstr

kfdhdb.dsknum

kfdhdb.grptyp

kfdhdb.dskname

kfdhdb.grpname

kfdhdb.fgname

kfdhdb.crestmp.hi

kfdhdb.crestmp.lo

kfdhdb.mntstmp.hi

kfdhdb.mntstmp.lo

kfdhdb.dsksize

kfdhdb.fstlocn

kfdhdb.altlocn

kfdhdb.f1b1locn

kfdhdb.grpstmp.hi

kfdhdb.grpstmp.lo

當然還有些情況,需要具體問題具體分析,比如使用了11.2的版本的,就需要有votedisk和spfile的那幾個參數值,上面列出來的是針對10g和11gr1。

如1.3中所介紹的,disk directory包含大量磁盤頭資訊,是我們手工重構磁盤頭的資料來源。而如果隻是磁盤組中一塊磁盤頭損壞,則可以更加友善地參考其他正常磁盤頭的資訊。

Oracle核心系列-揭秘ASM磁盤頭資訊

先暴力摧毀raw3的磁盤頭:

Oracle核心系列-揭秘ASM磁盤頭資訊

我們先利用raw4生成一個磁盤頭,再重構成raw3的磁盤頭:

Oracle核心系列-揭秘ASM磁盤頭資訊

修改必要的值,與raw3的實際情況配合,以下是要修改的項。

Oracle核心系列-揭秘ASM磁盤頭資訊
Oracle核心系列-揭秘ASM磁盤頭資訊

修改/tmp/raw3.head後,寫入到raw3的磁盤頭中,重新挂載磁盤組成功。

Oracle核心系列-揭秘ASM磁盤頭資訊

<b>本文來自雲栖社群合作夥伴"dbaplus",原文釋出時間:2015-12-17</b>