Oracle ASM Continuing Operations Directory

eric0435發表於2016-12-29

Continuing Operations Directory(COD)
COD用來跟蹤ASM中長時間執行的操作,例如rebalance, drop disk, create/delete/resize file,這些資訊ACD的簡要結構不足以描述其變化,這些操作需要透過ASM的COD目錄去追蹤,COD是ASM的4號檔案,A每一個磁碟組都會有一個COD。如果程式在執行長時間操作未正常完成前異常終止,將會有恢復程式檢視COD區域的記錄嘗試完成或回退這個操作,有兩種型別的持續性操作:後臺操作和回滾操作。

後臺操作
後臺操作是由ASM例項的後臺程式去執行的,它作為磁碟組的維護任務的一部分,而非特殊要求,直到完成或者ASM例項掛掉,如果ASM例項掛掉,執行恢復的例項需要重新執行後臺操作,磁碟組的rebalance就是一個很好的後臺操作的例子。我們查詢內部檢視X$KFFXP找到磁碟組3的COD的AU分佈,COD是ASM的檔案4,因此在查詢中設定了number_kffxp=4。

SQL> select group_number,name,type from v$asm_diskgroup;

GROUP_NUMBER NAME                           TYPE
------------ ------------------------------ ------------
           1 ARCHDG                         NORMAL
           2 CRSDG                          EXTERN
           3 DATADG                         NORMAL
           4 TESTDG                         NORMAL

SQL> select group_number, disk_number, state, name,failgroup,mount_status from v$asm_disk where group_number=3;

GROUP_NUMBER DISK_NUMBER STATE                          NAME                           FAILGROUP                                                    MOUNT_STATUS
------------ ----------- ------------------------------ ------------------------------ ------------------------------------------------------------ --------------
           3           0 NORMAL                         DATADG_0001                    DATADG_0001                                                  CACHED
           3           3 NORMAL                         DATADG_0000                    DATADG_0000                                                  CACHED
           3           1 NORMAL                         DATADG_0003                    DATADG_0003                                                  CACHED
           3           2 NORMAL                         DATADG_0002                    DATADG_0002                                                  CACHED

SQL> select group_number,disk_number,name,path,state from v$asm_disk where group_number=3;

GROUP_NUMBER DISK_NUMBER NAME                           PATH                           STATE
------------ ----------- ------------------------------ ------------------------------ ------------------------------
           3           0 DATADG_0001                    /dev/raw/raw11                 NORMAL
           3           3 DATADG_0000                    /dev/raw/raw10                 NORMAL
           3           1 DATADG_0003                    /dev/raw/raw4                  NORMAL
           3           2 DATADG_0002                    /dev/raw/raw3                  NORMAL


SQL> select number_kffxp file#, disk_kffxp disk#, count(disk_kffxp) extents
  2  from x$kffxp
  3  where group_kffxp=3
  4   and disk_kffxp <> 65534
  5   and number_kffxp=4
  6  group by number_kffxp, disk_kffxp
  7  order by 1;

     FILE#      DISK#    EXTENTS
---------- ---------- ----------
         4          0          6
         4          1          5
         4          2          6
         4          3          7

可以看到,上面顯示file #的資訊有4條,每個COD大小分別是6個AU,5個AU,6個AU,7個AU。因磁碟組DATADG有4個磁碟所以有4行記錄。

查詢COD在磁碟組DATADG中的AU分佈情況

SQL> select x.xnum_kffxp "virtual extent",pxn_kffxp "physical extent",x.au_kffxp "au",x.disk_kffxp "disk #",d.name "disk name"
  2  from x$kffxp x, v$asm_disk_stat d
  3  where x.group_kffxp=d.group_number
  4  and x.disk_kffxp=d.disk_number
  5  and x.group_kffxp=3
  6  and x.number_kffxp=4
  7  order by 1, 2,3;

virtual extent physical extent         au     disk # disk name
-------------- --------------- ---------- ---------- ------------------------------------------------------------
             0               0         36          2 DATADG_0002
             0               1         35          3 DATADG_0000
             0               2         35          1 DATADG_0003
             1               3         36          3 DATADG_0000
             1               4         37          0 DATADG_0001
             1               5         37          2 DATADG_0002
             2               6         72          1 DATADG_0003
             2               7         71          0 DATADG_0001
             2               8         71          3 DATADG_0000
             3               9         72          0 DATADG_0001
             3              10         72          3 DATADG_0000
             3              11         73          1 DATADG_0003
             4              12         73          2 DATADG_0002
             4              13         73          0 DATADG_0001
             4              14         73          3 DATADG_0000
             5              15         74          3 DATADG_0000
             5              16         74          1 DATADG_0003
             5              17         74          2 DATADG_0002
             6              18         75          1 DATADG_0003
             6              19         75          2 DATADG_0002
             6              20         74          0 DATADG_0001
             7              21         75          0 DATADG_0001
             7              22         76          2 DATADG_0002
             7              23         75          3 DATADG_0000

24 rows selected.

因磁碟組DATADG為normal冗餘,並且有4個故障磁碟組所以COD資訊將會有三份副本。也就是說virtual extent對應的3個physical extent所對應的3個AU所儲存的內容是一樣的。

透過kfed工具來檢視COD的AU分佈情況
由於1號檔案總是開始在0號磁碟2號AU,記住這個位置:0號盤2號AU。這是ASM中定位檔案的起點,它的作用,有點相當於磁碟上的引導區,在電腦開機後負責將OS啟動起來。1號檔案在最少情況下,至少有兩個AU。在1號檔案中,每個檔案佔用一個後設資料塊,存放自身的空間分佈資訊。每個後設資料塊大小是4K,一個AU是1M,哪麼,每個AU中,可以儲存256個檔案的空間分佈資訊。這其中,0號盤2號AU中,全是元檔案的資訊。再具體一點,0號盤2號AU,第一個後設資料塊被系統佔用,從第二個塊開始,到255為止,共255個後設資料塊,對應索引號1至255的檔案。其實,也就是全部的元檔案了。也就是說0號盤2號AU,儲存了全部元檔案的空間分佈資訊。1號檔案的第二個AU,從第一個塊開始,儲存256號檔案。第二個塊對應257號檔案,等等。每次從ASM中讀資料時,Oracle都要先讀到1號檔案,從中找出要讀的目標檔案在磁碟上的分佈位置,然後再去讀取相應的檔案的資料。由於COD是4號檔案,所以要讀取0號磁碟(/dev/raw/raw11)的2號AU的4號塊

[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=2 blkn=4 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            4 ; 0x002: KFBTYP_FILEDIR
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       4 ; 0x004: blk=4
kfbh.block.obj:                       1 ; 0x008: file=1
kfbh.check:                  3953869782 ; 0x00c: 0xebab43d6
kfbh.fcn.base:                      307 ; 0x010: 0x00000133
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfffdb.node.incarn:                   1 ; 0x000: A=1 NUMM=0x0
kfffdb.node.frlist.number:   4294967295 ; 0x004: 0xffffffff
kfffdb.node.frlist.incarn:            0 ; 0x008: A=0 NUMM=0x0
kfffdb.hibytes:                       0 ; 0x00c: 0x00000000
kfffdb.lobytes:                 8331264 ; 0x010: 0x007f2000
kfffdb.xtntcnt:                      24 ; 0x014: 0x00000018
kfffdb.xtnteof:                      24 ; 0x018: 0x00000018
kfffdb.blkSize:                    4096 ; 0x01c: 0x00001000
kfffdb.flags:                         1 ; 0x020: O=1 S=0 S=0 D=0 C=0 I=0 R=0 A=0
kfffdb.fileType:                     15 ; 0x021: 0x0f
kfffdb.dXrs:                         19 ; 0x022: SCHE=0x1 NUMB=0x3
kfffdb.iXrs:                         19 ; 0x023: SCHE=0x1 NUMB=0x3
kfffdb.dXsiz[0]:             4294967295 ; 0x024: 0xffffffff
kfffdb.dXsiz[1]:                      0 ; 0x028: 0x00000000
kfffdb.dXsiz[2]:                      0 ; 0x02c: 0x00000000
kfffdb.iXsiz[0]:             4294967295 ; 0x030: 0xffffffff
kfffdb.iXsiz[1]:                      0 ; 0x034: 0x00000000
kfffdb.iXsiz[2]:                      0 ; 0x038: 0x00000000
kfffdb.xtntblk:                      24 ; 0x03c: 0x0018
kfffdb.break:                        60 ; 0x03e: 0x003c
kfffdb.priZn:                         0 ; 0x040: KFDZN_COLD
kfffdb.secZn:                         0 ; 0x041: KFDZN_COLD
kfffdb.ub2spare:                      0 ; 0x042: 0x0000
kfffdb.alias[0]:             4294967295 ; 0x044: 0xffffffff
kfffdb.alias[1]:             4294967295 ; 0x048: 0xffffffff
kfffdb.strpwdth:                      0 ; 0x04c: 0x00
kfffdb.strpsz:                        0 ; 0x04d: 0x00
kfffdb.usmsz:                         0 ; 0x04e: 0x0000
kfffdb.crets.hi:               33042831 ; 0x050: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfffdb.crets.lo:             2457465856 ; 0x054: USEC=0x0 MSEC=0x27d SECS=0x27 MINS=0x24
kfffdb.modts.hi:               33042831 ; 0x058: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfffdb.modts.lo:             2457465856 ; 0x05c: USEC=0x0 MSEC=0x27d SECS=0x27 MINS=0x24
kfffdb.dasz[0]:                       0 ; 0x060: 0x00
kfffdb.dasz[1]:                       0 ; 0x061: 0x00
kfffdb.dasz[2]:                       0 ; 0x062: 0x00
kfffdb.dasz[3]:                       0 ; 0x063: 0x00
kfffdb.permissn:                      0 ; 0x064: 0x00
kfffdb.ub1spar1:                      0 ; 0x065: 0x00
kfffdb.ub2spar2:                      0 ; 0x066: 0x0000
kfffdb.user.entnum:                   0 ; 0x068: 0x0000
kfffdb.user.entinc:                   0 ; 0x06a: 0x0000
kfffdb.group.entnum:                  0 ; 0x06c: 0x0000
kfffdb.group.entinc:                  0 ; 0x06e: 0x0000
kfffdb.spare[0]:                      0 ; 0x070: 0x00000000
kfffdb.spare[1]:                      0 ; 0x074: 0x00000000
kfffdb.spare[2]:                      0 ; 0x078: 0x00000000
kfffdb.spare[3]:                      0 ; 0x07c: 0x00000000
kfffdb.spare[4]:                      0 ; 0x080: 0x00000000
kfffdb.spare[5]:                      0 ; 0x084: 0x00000000
kfffdb.spare[6]:                      0 ; 0x088: 0x00000000
kfffdb.spare[7]:                      0 ; 0x08c: 0x00000000
kfffdb.spare[8]:                      0 ; 0x090: 0x00000000
kfffdb.spare[9]:                      0 ; 0x094: 0x00000000
kfffdb.spare[10]:                     0 ; 0x098: 0x00000000
kfffdb.spare[11]:                     0 ; 0x09c: 0x00000000
kfffdb.usm:                             ; 0x0a0: length=0
kfffde[0].xptr.au:                   36 ; 0x4a0: 0x00000024
kfffde[0].xptr.disk:                  2 ; 0x4a4: 0x0002
kfffde[0].xptr.flags:                 0 ; 0x4a6: L=0 E=0 D=0 S=0
kfffde[0].xptr.chk:                  12 ; 0x4a7: 0x0c
kfffde[1].xptr.au:                   35 ; 0x4a8: 0x00000023
kfffde[1].xptr.disk:                  3 ; 0x4ac: 0x0003
kfffde[1].xptr.flags:                 0 ; 0x4ae: L=0 E=0 D=0 S=0
kfffde[1].xptr.chk:                  10 ; 0x4af: 0x0a
kfffde[2].xptr.au:                   35 ; 0x4b0: 0x00000023
kfffde[2].xptr.disk:                  1 ; 0x4b4: 0x0001
kfffde[2].xptr.flags:                 0 ; 0x4b6: L=0 E=0 D=0 S=0
kfffde[2].xptr.chk:                   8 ; 0x4b7: 0x08
kfffde[3].xptr.au:                   36 ; 0x4b8: 0x00000024
kfffde[3].xptr.disk:                  3 ; 0x4bc: 0x0003
kfffde[3].xptr.flags:                 0 ; 0x4be: L=0 E=0 D=0 S=0
kfffde[3].xptr.chk:                  13 ; 0x4bf: 0x0d
kfffde[4].xptr.au:                   37 ; 0x4c0: 0x00000025
kfffde[4].xptr.disk:                  0 ; 0x4c4: 0x0000
kfffde[4].xptr.flags:                 0 ; 0x4c6: L=0 E=0 D=0 S=0
kfffde[4].xptr.chk:                  15 ; 0x4c7: 0x0f
kfffde[5].xptr.au:                   37 ; 0x4c8: 0x00000025
kfffde[5].xptr.disk:                  2 ; 0x4cc: 0x0002
kfffde[5].xptr.flags:                 0 ; 0x4ce: L=0 E=0 D=0 S=0
kfffde[5].xptr.chk:                  13 ; 0x4cf: 0x0d
kfffde[6].xptr.au:                   72 ; 0x4d0: 0x00000048
kfffde[6].xptr.disk:                  1 ; 0x4d4: 0x0001
kfffde[6].xptr.flags:                 0 ; 0x4d6: L=0 E=0 D=0 S=0
kfffde[6].xptr.chk:                  99 ; 0x4d7: 0x63
kfffde[7].xptr.au:                   71 ; 0x4d8: 0x00000047
kfffde[7].xptr.disk:                  0 ; 0x4dc: 0x0000
kfffde[7].xptr.flags:                 0 ; 0x4de: L=0 E=0 D=0 S=0
kfffde[7].xptr.chk:                 109 ; 0x4df: 0x6d
kfffde[8].xptr.au:                   71 ; 0x4e0: 0x00000047
kfffde[8].xptr.disk:                  3 ; 0x4e4: 0x0003
kfffde[8].xptr.flags:                 0 ; 0x4e6: L=0 E=0 D=0 S=0
kfffde[8].xptr.chk:                 110 ; 0x4e7: 0x6e
kfffde[9].xptr.au:                   72 ; 0x4e8: 0x00000048
kfffde[9].xptr.disk:                  0 ; 0x4ec: 0x0000
kfffde[9].xptr.flags:                 0 ; 0x4ee: L=0 E=0 D=0 S=0
kfffde[9].xptr.chk:                  98 ; 0x4ef: 0x62
kfffde[10].xptr.au:                  72 ; 0x4f0: 0x00000048
kfffde[10].xptr.disk:                 3 ; 0x4f4: 0x0003
kfffde[10].xptr.flags:                0 ; 0x4f6: L=0 E=0 D=0 S=0
kfffde[10].xptr.chk:                 97 ; 0x4f7: 0x61
kfffde[11].xptr.au:                  73 ; 0x4f8: 0x00000049
kfffde[11].xptr.disk:                 1 ; 0x4fc: 0x0001
kfffde[11].xptr.flags:                0 ; 0x4fe: L=0 E=0 D=0 S=0
kfffde[11].xptr.chk:                 98 ; 0x4ff: 0x62
kfffde[12].xptr.au:                  73 ; 0x500: 0x00000049
kfffde[12].xptr.disk:                 2 ; 0x504: 0x0002
kfffde[12].xptr.flags:                0 ; 0x506: L=0 E=0 D=0 S=0
kfffde[12].xptr.chk:                 97 ; 0x507: 0x61
kfffde[13].xptr.au:                  73 ; 0x508: 0x00000049
kfffde[13].xptr.disk:                 0 ; 0x50c: 0x0000
kfffde[13].xptr.flags:                0 ; 0x50e: L=0 E=0 D=0 S=0
kfffde[13].xptr.chk:                 99 ; 0x50f: 0x63
kfffde[14].xptr.au:                  73 ; 0x510: 0x00000049
kfffde[14].xptr.disk:                 3 ; 0x514: 0x0003
kfffde[14].xptr.flags:                0 ; 0x516: L=0 E=0 D=0 S=0
kfffde[14].xptr.chk:                 96 ; 0x517: 0x60
kfffde[15].xptr.au:                  74 ; 0x518: 0x0000004a
kfffde[15].xptr.disk:                 3 ; 0x51c: 0x0003
kfffde[15].xptr.flags:                0 ; 0x51e: L=0 E=0 D=0 S=0
kfffde[15].xptr.chk:                 99 ; 0x51f: 0x63
kfffde[16].xptr.au:                  74 ; 0x520: 0x0000004a
kfffde[16].xptr.disk:                 1 ; 0x524: 0x0001
kfffde[16].xptr.flags:                0 ; 0x526: L=0 E=0 D=0 S=0
kfffde[16].xptr.chk:                 97 ; 0x527: 0x61
kfffde[17].xptr.au:                  74 ; 0x528: 0x0000004a
kfffde[17].xptr.disk:                 2 ; 0x52c: 0x0002
kfffde[17].xptr.flags:                0 ; 0x52e: L=0 E=0 D=0 S=0
kfffde[17].xptr.chk:                 98 ; 0x52f: 0x62
kfffde[18].xptr.au:                  75 ; 0x530: 0x0000004b
kfffde[18].xptr.disk:                 1 ; 0x534: 0x0001
kfffde[18].xptr.flags:                0 ; 0x536: L=0 E=0 D=0 S=0
kfffde[18].xptr.chk:                 96 ; 0x537: 0x60
kfffde[19].xptr.au:                  75 ; 0x538: 0x0000004b
kfffde[19].xptr.disk:                 2 ; 0x53c: 0x0002
kfffde[19].xptr.flags:                0 ; 0x53e: L=0 E=0 D=0 S=0
kfffde[19].xptr.chk:                 99 ; 0x53f: 0x63
kfffde[20].xptr.au:                  74 ; 0x540: 0x0000004a
kfffde[20].xptr.disk:                 0 ; 0x544: 0x0000
kfffde[20].xptr.flags:                0 ; 0x546: L=0 E=0 D=0 S=0
kfffde[20].xptr.chk:                 96 ; 0x547: 0x60
kfffde[21].xptr.au:                  75 ; 0x548: 0x0000004b
kfffde[21].xptr.disk:                 0 ; 0x54c: 0x0000
kfffde[21].xptr.flags:                0 ; 0x54e: L=0 E=0 D=0 S=0
kfffde[21].xptr.chk:                 97 ; 0x54f: 0x61
kfffde[22].xptr.au:                  76 ; 0x550: 0x0000004c
kfffde[22].xptr.disk:                 2 ; 0x554: 0x0002
kfffde[22].xptr.flags:                0 ; 0x556: L=0 E=0 D=0 S=0
kfffde[22].xptr.chk:                100 ; 0x557: 0x64
kfffde[23].xptr.au:                  75 ; 0x558: 0x0000004b
kfffde[23].xptr.disk:                 3 ; 0x55c: 0x0003
kfffde[23].xptr.flags:                0 ; 0x55e: L=0 E=0 D=0 S=0
kfffde[23].xptr.chk:                 98 ; 0x55f: 0x62
kfffde[24].xptr.au:          4294967295 ; 0x560: 0xffffffff
kfffde[24].xptr.disk:             65535 ; 0x564: 0xffff
kfffde[24].xptr.flags:                0 ; 0x566: L=0 E=0 D=0 S=0
kfffde[24].xptr.chk:                 42 ; 0x567: 0x2a

從kfffde[0].xptr.au=36,kfffde[0].xptr.disk=2可知COD儲存在2號磁碟的36號AU,依此類推,這與上面的查詢結果是一致的。

下面透過kfed工具來驗證0號virtual extent的3個phyiscal extent所對的3個AU所儲存的內容

[grid@jyrac1 ~]$ kfed read /dev/raw/raw3 aun=36 blkn=0 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            9 ; 0x002: KFBTYP_COD_BGO
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:                       4 ; 0x008: file=4
kfbh.check:                    17403005 ; 0x00c: 0x01098c7d
kfbh.fcn.base:                     3704 ; 0x010: 0x00000e78
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfrcbg.size:                          0 ; 0x000: 0x0000
kfrcbg.op:                            0 ; 0x002: 0x0000
kfrcbg.inum:                          0 ; 0x004: 0x00000000
kfrcbg.iser:                          0 ; 0x008: 0x00000000
[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=35 blkn=0 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            9 ; 0x002: KFBTYP_COD_BGO
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:                       4 ; 0x008: file=4
kfbh.check:                    17403005 ; 0x00c: 0x01098c7d
kfbh.fcn.base:                     3704 ; 0x010: 0x00000e78
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfrcbg.size:                          0 ; 0x000: 0x0000
kfrcbg.op:                            0 ; 0x002: 0x0000
kfrcbg.inum:                          0 ; 0x004: 0x00000000
kfrcbg.iser:                          0 ; 0x008: 0x00000000
[grid@jyrac1 ~]$ kfed read /dev/raw/raw4 aun=35 blkn=0 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            9 ; 0x002: KFBTYP_COD_BGO
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:                       4 ; 0x008: file=4
kfbh.check:                    17403005 ; 0x00c: 0x01098c7d
kfbh.fcn.base:                     3704 ; 0x010: 0x00000e78
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfrcbg.size:                          0 ; 0x000: 0x0000
kfrcbg.op:                            0 ; 0x002: 0x0000 -- 表示後臺程式操作,有2種屬性值,0 表示當前沒有後臺程式操作,1表示當前後臺程式正在進行reblance operation.
kfrcbg.inum:                          0 ; 0x004: 0x00000000 --表示後臺程式所運作的asm instance number
kfrcbg.iser:                          0 ; 0x008: 0x00000000

從上面的輸出可以看到,0號virtual extent的3個phyiscal extent所對應的3個AU(2號磁碟[/dev/raw/raw3]的36號AU,3號磁碟[/dev/raw/raw10]的35號AU,1號磁碟[/dev/raw/raw4]的35號AU)所儲存的內容是一樣的。上面顯示了一個COD的塊,kfbh.type=KFBTYP_COD_BGO顯示為background型別的操作,不過此刻並沒有後臺操作發生,因為所有的kfrcbg區域都是0,這代表了當前沒有活躍的後臺操作,如果操作程式碼kfrcbg.op為1,那麼將表示有活躍的磁碟的rebalance操作在進行。

回滾操作
Rollback操作型別類似於資料庫的事務。ASM的前臺程式發起請求,為了能夠記錄這個rollback操作,必須在ASM的COD目錄中申請一個槽位,COD目錄的block 1展示了所有的槽位和使用狀態,如果所有的槽位當時都是忙的,那麼這個操作會休息一段時間,直到發現其中一個可以使用。rollback型別操作過程中,磁碟組是一個不一致的狀態,這個操作需要完成或者回退所有它對磁碟組的更改。資料庫例項大多時候會去執行這個操作(例如新增資料檔案)。如果資料庫例項掛掉或者ASM前臺程式掛掉,一個不可恢復的錯誤會發生,然後這個操作會被終止。建立檔案是一個rollback操作非常好的例子,如果在檔案空間分配過程中發生錯誤,那麼已經分配過的空間需要被刪除,如果資料庫例項沒有提交檔案的建立操作,這個檔案必須被自動刪除,如果ASM例項掛掉,這個刪除操作會由恢復例項來執行。

使用kfed來檢視COD的1號塊:
先執行資料檔案的建立操作

SQL> create tablespace jycs datafile '+DATADG/jyrac/datafile/jycs01.dbf' size 1G ; 

再檢視cod的1號塊

[grid@jyrac1 ~]$ kfed read /dev/raw/raw3 aun=36 blkn=1 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           15 ; 0x002: KFBTYP_COD_RBO --表示操作型別,15即為 KFBTYP_COD_RBO,RBO 即為rollback operation的簡寫
kfbh.datfmt:                          2 ; 0x003: 0x02
kfbh.block.blk:                       1 ; 0x004: blk=1 --表示當前後設資料所在的block號
kfbh.block.obj:                       4 ; 0x008: file=4
kfbh.check:                    34575077 ; 0x00c: 0x020f92e5
kfbh.fcn.base:                     4320 ; 0x010: 0x000010e0
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
--kfrcrb rb即為rollback
kfrcrb[0].opcode:                     1 ; 0x000: 0x0001 --表示具體的操作型別,該opcode有很多種屬性值
kfrcrb[1].opcode:                     0 ; 0x002: 0x0000
kfrcrb[2].opcode:                     0 ; 0x004: 0x0000
kfrcrb[3].opcode:                     0 ; 0x006: 0x0000
kfrcrb[4].opcode:                     0 ; 0x008: 0x0000
kfrcrb[5].opcode:                     0 ; 0x00a: 0x0000
kfrcrb[6].opcode:                     0 ; 0x00c: 0x0000
kfrcrb[7].opcode:                     0 ; 0x00e: 0x0000
kfrcrb[8].opcode:                     0 ; 0x010: 0x0000
kfrcrb[9].opcode:                     0 ; 0x012: 0x0000
kfrcrb[10].opcode:                    0 ; 0x014: 0x0000
kfrcrb[11].opcode:                    0 ; 0x016: 0x0000
kfrcrb[12].opcode:                    0 ; 0x018: 0x0000
kfrcrb[13].opcode:                    0 ; 0x01a: 0x0000
kfrcrb[14].opcode:                    0 ; 0x01c: 0x0000

kfrcrb[i] 區域跟蹤了所有活躍的rollback型別操作,上面的資訊可以看到有一個操作正在進行中,kfrcrb[0]的值為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

上面的操作是11G,如果是10G,kfrcrb[i]則是不一樣的多了kfrcrb[i].inum,kfrcrb[i].iser,kfrcrb[i].pnum例如:

[oracle@jyrac3 ~]$ kfed read /dev/raw/raw5 aun=7 blkn=1 aus=16777216 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           15 ; 0x002: KFBTYP_COD_RBO
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       1 ; 0x004: T=0 NUMB=0x1
kfbh.block.obj:                       4 ; 0x008: TYPE=0x0 NUMB=0x4
kfbh.check:                    17797779 ; 0x00c: 0x010f9293
kfbh.fcn.base:                     4247 ; 0x010: 0x00001097
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfrcrb[0].opcode:                     0 ; 0x000: 0x0000 --表示具體的操作型別,該opcode有很多種屬性值
kfrcrb[0].inum:                       0 ; 0x002: 0x0000 --表示asm instance number
kfrcrb[0].iser:                       0 ; 0x004: 0x00000000
kfrcrb[0].pnum:                       0 ; 0x008: 0x00000000
kfrcrb[1].opcode:                     0 ; 0x00c: 0x0000
kfrcrb[1].inum:                       0 ; 0x00e: 0x0000
kfrcrb[1].iser:                       0 ; 0x010: 0x00000000
kfrcrb[1].pnum:                       0 ; 0x014: 0x00000000
kfrcrb[2].opcode:                     0 ; 0x018: 0x0000
kfrcrb[2].inum:                       0 ; 0x01a: 0x0000
kfrcrb[2].iser:                       0 ; 0x01c: 0x00000000
kfrcrb[2].pnum:                       0 ; 0x020: 0x00000000
kfrcrb[3].opcode:                     0 ; 0x024: 0x0000
kfrcrb[3].inum:                       0 ; 0x026: 0x0000
kfrcrb[3].iser:                       0 ; 0x028: 0x00000000
kfrcrb[3].pnum:                       0 ; 0x02c: 0x00000000
kfrcrb[4].opcode:                     0 ; 0x030: 0x0000
kfrcrb[4].inum:                       0 ; 0x032: 0x0000
kfrcrb[4].iser:                       0 ; 0x034: 0x00000000
kfrcrb[4].pnum:                       0 ; 0x038: 0x00000000
kfrcrb[5].opcode:                     0 ; 0x03c: 0x0000
kfrcrb[5].inum:                       0 ; 0x03e: 0x0000
kfrcrb[5].iser:                       0 ; 0x040: 0x00000000
kfrcrb[5].pnum:                       0 ; 0x044: 0x00000000
kfrcrb[6].opcode:                     0 ; 0x048: 0x0000
kfrcrb[6].inum:                       0 ; 0x04a: 0x0000
kfrcrb[6].iser:                       0 ; 0x04c: 0x00000000
kfrcrb[6].pnum:                       0 ; 0x050: 0x00000000
kfrcrb[7].opcode:                     0 ; 0x054: 0x0000
kfrcrb[7].inum:                       0 ; 0x056: 0x0000
kfrcrb[7].iser:                       0 ; 0x058: 0x00000000
kfrcrb[7].pnum:                       0 ; 0x05c: 0x00000000
kfrcrb[8].opcode:                     0 ; 0x060: 0x0000

接下來才是COD DATA

[grid@jyrac1 ~]$ kfed read /dev/raw/raw3 aun=36 blkn=2 
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           16 ; 0x002: KFBTYP_COD_DATA
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       2 ; 0x004: blk=2
kfbh.block.obj:                       4 ; 0x008: file=4
kfbh.check:                   916174568 ; 0x00c: 0x369bb6e8
kfbh.fcn.base:                     4320 ; 0x010: 0x000010e0
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000

這部分是COD DATA內容,從上面可以看到,基本上就是隻要頭部資訊,唯一更新的也就是check值和bash。

小結:
ASM的COD目錄跟蹤所有長時間執行的ASM操作,對於由於任何原因導致的問題,COD目錄中相關記錄可以用來把這些操作完成或回退。這些操作可能由另一個例項來完成或者由故障例項重啟後來完成。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2131594/,如需轉載,請註明出處,否則將追究法律責任。

相關文章