ASM中一些運行時間較長的操作,例如rebalance, drop disk, create/delete/resize file,這些信息ACD的簡要結構不足以描述其變化,這些操作需要通過ASM的COD目錄去追蹤,COD是ASM的4號文件,每一個磁盤組都會有一個COD。
如果進程在執行長時間操作未正常完成前異常終止,將會有恢復進程查看COD區域的記錄嘗試完成或回退這個操作,有兩種類型的持續性操作:background和rollback。
后臺操作是由ASM實例的后臺進程去執行的,它作為磁盤組的維護任務的一部分,而非特殊要求,直到完成或者ASM實例掛掉,如果ASM實例掛掉,執行恢復的實例需要重新執行后臺操作,磁盤組的rebalance就是一個很好的后臺操作的例子。
我們查詢內部視圖X$KFFXP找到磁盤組3的COD的AU分布,COD是ASM的文件4,因此在查詢中設置了number_kffxp=4。
SQL> SELECT x.xnum_kffxp "Extent", x.au_kffxp "AU", x.disk_kffxp "Disk #",
d.name "Disk name" FROM x$kffxp x, v$asm_disk_stat d
WHERE x.group_kffxp=d.group_number and x.disk_kffxp=d.disk_number and x.group_kffxp=3 and x.number_kffxp=4 ORDER BY 1, 2; Extent AU Disk # Disk name ---------- ---------- ---------- ------------------------------ 0 8 0 ASMDISK5
SQL>
以上輸出說明ACD位于磁盤ASMDISK5的AU 8,我們來通過kfed查看一下(注意這里的磁盤組AU大小為4MB)
$ kfed read /dev/oracleasm/disks/ASMDISK5 ausz=4m aun=8 blkn=0 | more
kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 9 ; 0x002: KFBTYP_COD_BGO ... kfrcbg.size: 0 ; 0x000: 0x0000 kfrcbg.op: 0 ; 0x002: 0x0000 kfrcbg.inum: 0 ; 0x004: 0x00000000 kfrcbg.iser: 0 ; 0x008: 0x00000000 $
上面顯示了一個COD的塊,kfbh.type=KFBTYPCODBGO顯示為background類型的操作,不過此刻并沒有后臺操作發生,因為所有的kfrcbg區域都是0,這代表了當前沒有活躍的后臺操作,如果操作代碼kfrcbg.op為1,那么將表示有活躍的磁盤的rebalance操作在進行。
Rollback操作類型類似于數據庫的事務。ASM的前臺進程發起請求,為了能夠記錄這個rollback操作,必須在ASM的COD目錄中申請一個槽位,COD目錄的block 1展示了所有的槽位和使用狀態,如果所有的槽位當時都是忙的,那么這個操作會休息一段時間,直到發現其中一個可以使用。rollback類型操作過程中,磁盤組是一個不一致的狀態,這個操作需要完成或者回退所有它對磁盤組的更改。數據庫實例大多時候會去執行這個操作(例如添加數據文件)。如果數據庫實例掛掉或者ASM前臺進程掛掉,一個不可恢復的錯誤會發生,然后這個操作會被終止。
創建文件是一個rollback操作非常好的例子,如果在文件空間分配過程中發生錯誤,那么已經分配過的空間需要被刪除,如果數據庫實例沒有提交文件的創建操作,這個文件必須被自動刪除,如果ASM實例掛掉,這個刪除操作會由恢復實例來執行。
我們來看一下COD的block 1:
$ kfed read /dev/oracleasm/disks/ASMDISK5 ausz=4m aun=8 blkn=1 | more
kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 15 ; 0x002: KFBTYP_COD_RBO ... kfrcrb10[0].opcode: 1 ; 0x000: 0x0001 kfrcrb10[0].inum: 1 ; 0x002: 0x0001 kfrcrb10[0].iser: 1 ; 0x004: 0x00000001 kfrcrb10[0].pnum: 18 ; 0x008: 0x00000012 kfrcrb10[1].opcode: 0 ; 0x00c: 0x0000 kfrcrb10[1].inum: 0 ; 0x00e: 0x0000 kfrcrb10[1].iser: 0 ; 0x010: 0x00000000 kfrcrb10[1].pnum: 0 ; 0x014: 0x00000000 ... $
kfrcrb10[i] 區域跟蹤了所有活躍的rollback類型操作,我們看到有一個操作正在進行中,kfrcrb10[0]的值都是非0值,從操作代碼我們可以知道這是一個文件的創建操作,kfrcrb10[0].inum=1意味著這個操作運行在ASM的實例1。
rollback操作類型的代碼參照表如下:
1 - Create a file 2 - Delete a file 3 - Resize a file 4 - Drop alias entry 5 - Rename alias entry 6 - Rebalance space COD 7 - Drop disks force 8 - Attribute drop 9 - Disk Resync 10 - Disk Repair Time 11 - Volume create 12 - Volume delete 13 - Attribute directory creation 14 - Set zone attributes 15 - User drop
ASM的COD目錄跟蹤所有長時間運行的ASM操作,對于由于任何原因導致的問題,COD目錄中相關記錄可以用來把這些操作完成或回退。這些操作可能由另一個實例來完成或者由故障實例重啟后來完成。
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。