天天看點

Oracle ASM 翻譯系列第二十彈:ASM Internal ASM file number 7ASM file number 7

asm元資訊7号檔案,是asm的邏輯卷目錄,用于跟蹤與advm有關的檔案。

asm動态邏輯卷裝置是由asm動态邏輯卷建構的。一個磁盤組中可以配置一個或多個asm動态邏輯卷裝置。asm叢集檔案系統通過advm接口建構在asm磁盤組之上。advm像資料庫一樣,也是asm的一個用戶端。當一個邏輯卷被通路時,相應的asm檔案會被打開并且asm extent的資訊會被發送到advm驅動。

有兩種與advm邏輯卷相關的檔案類型:

· asmvol:邏輯卷檔案,作為邏輯卷存儲的容器

· asmvdrl:包含髒資料記錄區域資訊的檔案。重新同步鏡像資料時會用到此檔案。

為advm建立一個單獨的磁盤組并不是必須的,但這樣做确實是有意義的,通過這種方式,可以把資料庫檔案與acfs檔案隔離開。看幾個例子。

sql> create diskgroup acfs

disk 'orcl:asmdisk5', 'orcl:asmdisk6'

attribute 'compatible.asm' = '11.2', 'compatible.advm' = '11.2';

diskgroup created.

要建立邏輯卷,首先需要有一個磁盤組,上面建立了一個名稱為acfs的磁盤組。為了能在磁盤組中建立邏輯卷,磁盤組的compatible.asm與compatible.advm必須設定為11.2或以上,同時advm/acfs驅動要被加載(在叢集環境中,已經預設加載,而在單執行個體環境中,需要手動加載)。

做到以上要求後,就可以在磁盤組中建立邏輯卷了。

$ asmcmd volcreate -g acfs -s 2g acfs_vol1

$ asmcmd volcreate -g acfs -s 2g acfs_vol2

$ asmcmd volinfo -a

diskgroup name: acfs

 volume name: acfs_vol1

 volume device: /dev/asm/acfs_vol1-159

 state: enabled

 size (mb): 2048

 resize unit (mb): 32

 redundancy: mirror

 stripe columns: 4

 stripe width (k): 128

 usage:

 mountpath:

 volume name: acfs_vol2

 volume device: /dev/asm/acfs_vol2-159

$

到現在,還沒有相應的挂載目錄與邏輯卷相關聯,是以還不能使用它們。這時,我們可以先看看advm邏輯卷元資訊,我們先從邏輯卷目錄擷取其所在的配置設定單元。

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=2

 and x.number_kffxp=7

order by 1, 2;

    extent         au     disk # disk name

---------- ---------- ---------- ------------------------------

         0         53          1 asmdisk6

         0         53          0 asmdisk5

接下來,使用kfed工具檢視真實的元資訊。

$ kfed read /dev/oracleasm/disks/asmdisk5 aun=53 | more

kfbh.endian:                          1 ; 0x000: 0x01

kfbh.hard:                          130 ; 0x001: 0x82

kfbh.type:                           22 ; 0x002: kfbtyp_volumedir

...

kfvvde.entry.incarn:                  1 ; 0x024: a=1 numm=0x0

kfvvde.entry.hash:                    0 ; 0x028: 0x00000000

kfvvde.entry.refer.number:   4294967295 ; 0x02c: 0xffffffff

kfvvde.entry.refer.incarn:            0 ; 0x030: a=0 numm=0x0

kfvvde.volnm:           ++avd_dg_number ; 0x034: length=15

kfvvde.usage:                           ; 0x054: length=0

kfvvde.dgname:                          ; 0x074: length=0

kfvvde.clname:                          ; 0x094: length=0

kfvvde.mountpath:                       ; 0x0b4: length=0

kfvvde.drlinit:                       0 ; 0x4b5: 0x00

kfvvde.pad1:                          0 ; 0x4b6: 0x0000

kfvvde.volfnum.number:                0 ; 0x4b8: 0x00000000

kfvvde.volfnum.incarn:                0 ; 0x4bc: 0x00000000

kfvvde.drlfnum.number:                0 ; 0x4c0: 0x00000000

kfvvde.drlfnum.incarn:                0 ; 0x4c4: 0x00000000

kfvvde.volnum:                        0 ; 0x4c8: 0x0000

kfvvde.avddgnum:                    159 ; 0x4ca: 0x009f

kfvvde.extentsz:                      0 ; 0x4cc: 0x00000000

kfvvde.volstate:                      4 ; 0x4d0: d=0 c=0 r=1

上面的輸出資訊顯示了53号au的block 0.它隻包含了advm邏輯卷的标記(++avd_dg_number),而真正的邏輯卷的資訊其實位于block 1及以後。

$ kfed read /dev/oracleasm/disks/asmdisk5 aun=53 blkn=1 | more

kfvvde.volnm:                 acfs_vol1 ; 0x034: length=9

kfvvde.volfnum.number:              257 ; 0x4b8: 0x00000101

kfvvde.volfnum.incarn:        771971291 ; 0x4bc: 0x2e0358db

kfvvde.drlfnum.number:              256 ; 0x4c0: 0x00000100

kfvvde.drlfnum.incarn:        771971289 ; 0x4c4: 0x2e0358d9

kfvvde.volnum:                        1 ; 0x4c8: 0x0001

kfvvde.extentsz:                      8 ; 0x4cc: 0x00000008

kfvvde.volstate:                      2 ; 0x4d0: d=0 c=1 r=0

$ kfed read /dev/oracleasm/disks/asmdisk5 aun=53 blkn=2 | more

kfvvde.volnm:                 acfs_vol2 ; 0x034: length=9

kfvvde.volfnum.number:              259 ; 0x4b8: 0x00000103

kfvvde.volfnum.incarn:        771971303 ; 0x4bc: 0x2e0358e7

kfvvde.drlfnum.number:              258 ; 0x4c0: 0x00000102

kfvvde.drlfnum.incarn:        771971301 ; 0x4c4: 0x2e0358e5

kfvvde.volnum:                        2 ; 0x4c8: 0x0002

asm元資訊7号檔案block 1包含的是第一個邏輯卷的資訊(kfvvde.volnm: acfs_vol1),并且有兩個檔案關聯到這個邏輯卷。

· drl髒資料記錄區域檔案(kfvvde.drlfnum.number: 256)

· 邏輯卷檔案(kfvvde.volfnum.number: 257)

block 2包含第二個邏輯卷的資訊(kfvvde.volnm: acfs_vol2),并且有兩個檔案關聯到這個邏輯卷。

· drl髒資料記錄區域檔案(kfvvde.drlfnum.number: 258)

· 邏輯卷檔案(kfvvde.volfnum.number: 259)

這些都是特殊檔案,是以不會顯示在asmcmd ls指令的輸出和v$asm_alias視圖中。但是,你可以到v$asm_file中找到他們。

sql> select file_number "file #", bytes/1024/1024 "size (mb)", type

from v$asm_file

where group_number=2;

    file #  size (mb) type

---------- ---------- ----------

       256         17 asmvdrl

       257       2048 asmvol

       258         17 asmvdrl

       259       2048 asmvol

這時,可以在邏輯卷裝置上建立asm叢集檔案系統(acfs)。

# /sbin/mkfs -t acfs /dev/asm/acfs_vol1-159

mkfs.acfs: version                   = 11.2.0.3.0

mkfs.acfs: on-disk version           = 39.0

mkfs.acfs: volume                    = /dev/asm/acfs_vol1-159

mkfs.acfs: volume size               = 2147483648

mkfs.acfs: format complete.

# mkdir /acfs1

# mount -t acfs /dev/asm/acfs_vol1-159 /acfs1

# mount

/dev/mapper/volgroup00-logvol00 on / type ext3 (rw)

oracleasmfs on /dev/oracleasm type oracleasmfs (rw)

/dev/asm/acfs_vol1-159 on /acfs1 type acfs (rw)

$ asmcmd volinfo -g acfs acfs_vol1

 usage: acfs

 mountpath: /acfs1

這時候再看看邏輯卷目錄中是否包含挂載目錄:

$ kfed read /dev/oracleasm/disks/asmdisk6 aun=53 blkn=1 | grep mountpath

kfvvde.mountpath:                /acfs1 ; 0x0b4: length=6

确實如此。

一個磁盤組中可以配置一個或多個asm動态邏輯卷裝置。asm叢集檔案系統通過advm接口建構于asm磁盤組之上。advm跟資料庫一樣,也是asm的一個用戶端。

· asmvol:邏輯卷檔案,作為邏輯卷儲存設備的容器

· asmvdrl:包含髒資料記錄區域資訊的檔案。恢複鏡像資料時會用到此檔案。

<b>本文來自雲栖社群合作夥伴“dbgeek”</b>