【Oracle ASM】Continuing Operations Directory (file #4)

《【Oracle ASM】ASM FILE NUMBER 3 Active Change Directory》      中我们介绍而来ACD,但是对于长时间运行的操作则简单的ACD不足以描述其变化。 在一些特殊情况下,Continuing Operations Directory (COD)会分配记录来跟踪大的操作并保证其完成。 如果由于进程失败而导致操作没有彻底完成,则恢复进程将查询该COD记录,并要么完成 要么回滚该操作。

一般有2种持续性的操作,分别为 回滚和后台操作。 后台操作一般由ASM实例的后台进程来实施。 其作为diskgroup维护的一部分来完成,而非特殊要求。一个后台操作持续工作,直到其完成或者实例CRASH。

如果实例CRASH,则恢复实例时将需要重启该后台操作。 rebalance diskgroup即是后台操作的一种。

回滚操作类似于数据库事务。 其由ASM前台进程申请启动。 在此操作过程中diskgroup处于非一致的状态。该操作要么全部完成 ,要么全部回滚。长见由数据库实例来引发这些前台操作。如果数据库实例CRASH,ASM前台进程失败,或者出现一些不可恢复的错误,则该操作将被终止。 创建一个文件将会是一个比较好的例子。如果当创建一个文件时若发生错误,则正为该文件分配的空间需要被释放,部分创建的文件也要被删除。 若数据库实例并未提交该创建,则文件必须被删除。如果ASM实例CRASh了,则该工作需要recover实例时完成。

asm database file creation

 

Continuing Operation Directory (COD) 该metadata file 4 中记录的是在单个metadata block中无法完成的操作记录到COD中,这样当ASM instance crash时可以恢复这些操作。例如创建 删除和resize文件,这其中file number 4 blkn=1为KFBTYP_COD_RB  即回滚rollback数据,后面的数据为KFBTYP_COD_DATA。

 

可回滚的操作opcodes包括:

 

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 diskgroup 尝试mount时都会读取FILE number 4 COD中的数据来保证操作要么完成、要么回滚。

 

 

SQL> SELECT xnum_kffxp "Extent", au_kffxp "AU", disk_kffxp "Disk" from  x$kffxp
  2    WHERE group_kffxp=1 and number_kffxp=4
  3    and xnum_kffxp <> 2147483648;

    Extent         AU       Disk
---------- ---------- ----------
         0          7          0
         0          3          3
         0          6          4
         1          3         10
         1          2         11
         1          3          6

	SQL> select path,disk_number from v$asm_disk where disk_number=0;

PATH
--------------------------------------------------------------------------------
DISK_NUMBER
-----------

/oracleasm/asm-disk01
          0

 [oracle@mlab2 ~]$  kfed read /oracleasm/asm-disk01 aus=4194304 aun=7 blkn=0|less
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:                    17378383 ; 0x00c: 0x01092c4f
kfbh.fcn.base:                    44618 ; 0x010: 0x0000ae4a
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

kfrcbg.iser:                          0 ; 0x008: 0x00000000
[oracle@mlab2 ~]$ kfed read /oracleasm/asm-disk01 aus=4194304 aun=7 blkn=1|less
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           15 ; 0x002: KFBTYP_COD_RBO
kfbh.datfmt:                          2 ; 0x003: 0x02
kfbh.block.blk:                       1 ; 0x004: blk=1
kfbh.block.obj:                       4 ; 0x008: file=4
kfbh.check:                    34548815 ; 0x00c: 0x020f2c4f
kfbh.fcn.base:                    44619 ; 0x010: 0x0000ae4b
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfrcrb[0].opcode:                     0 ; 0x000: 0x0000
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[15].opcode:                    0 ; 0x01e: 0x0000
kfrcrb[16].opcode:                    0 ; 0x020: 0x0000
kfrcrb[17].opcode:                    0 ; 0x022: 0x0000
kfrcrb[18].opcode:                    0 ; 0x024: 0x0000
kfrcrb[19].opcode:                    0 ; 0x026: 0x0000
kfrcrb[20].opcode:                    0 ; 0x028: 0x0000
kfrcrb[21].opcode:                    0 ; 0x02a: 0x0000
kfrcrb[22].opcode:                    0 ; 0x02c: 0x0000
kfrcrb[23].opcode:                    0 ; 0x02e: 0x0000
kfrcrb[24].opcode:                    0 ; 0x030: 0x0000
kfrcrb[25].opcode:                    0 ; 0x032: 0x0000
kfrcrb[26].opcode:                    0 ; 0x034: 0x0000
kfrcrb[27].opcode:                    0 ; 0x036: 0x0000
kfrcrb[28].opcode:                    0 ; 0x038: 0x0000
kfrcrb[29].opcode:                    0 ; 0x03a: 0x0000
kfrcrb[30].opcode:                    0 ; 0x03c: 0x0000
kfrcrb[31].opcode:                    0 ; 0x03e: 0x0000
kfrcrb[32].opcode:                    0 ; 0x040: 0x0000
kfrcrb[33].opcode:                    0 ; 0x042: 0x0000
kfrcrb[34].opcode:                    0 ; 0x044: 0x0000
kfrcrb[35].opcode:                    0 ; 0x046: 0x0000
kfrcrb[36].opcode:                    0 ; 0x048: 0x0000
kfrcrb[37].opcode:                    0 ; 0x04a: 0x0000
kfrcrb[38].opcode:                    0 ; 0x04c: 0x0000
kfrcrb[39].opcode:                    0 ; 0x04e: 0x0000
kfrcrb[40].opcode:                    0 ; 0x050: 0x0000
kfrcrb[41].opcode:                    0 ; 0x052: 0x0000
kfrcrb[42].opcode:                    0 ; 0x054: 0x0000
:

[oracle@mlab2 ~]$ kfed read /oracleasm/asm-disk01 aus=4194304 aun=7 blkn=2|less
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:                   856815006 ; 0x00c: 0x3311f59e
kfbh.fcn.base:                    22895 ; 0x010: 0x0000596f
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000

 

kfbh.type KFBTYP_COD_BGO

KFBTYP_COD_BGO  COD BackGround Operations block

KFBTYP_COD_RBO  COD RollBack Operations block

KFBTYP_COD_DATA  COD rollback Data block

kfrcbg.op  opcode defined by KFRCBG_OPDEF

kfrcbg.inum  owning instance number

kfrcbg.iser   instance serial number