ASM 翻譯系列第三十五彈:ASM 253號檔案——ASM spfile

沃趣科技發表於2017-02-28

原作者:Bane Radulovic

譯者:    邱大龍

稽核:    魏興華

DBGeeK社群聯合出品

原文連結:http://asmsupportguy.blogspot.sg/2014/03/asm-spfile-in-disk-group.html

ASM spfile in a disk group

從ASM版本11.2開始,ASM spfile可以儲存在ASM磁碟組裡。事實上,在安裝ASM時,OUI就已經把ASM spfile放在了磁碟組中。對於單例項環境和叢集環境都是這樣。在安裝過程中建立的第一個磁碟組是spfile的預設位置,但這不是必要的。ASM spfile還是可以放在檔案系統上,就是$ORACLE_HOME/dbs目錄下。

New ASMCMD commands

為支援該特性,ASMCMD引入了新的命令用來備份,複製和移動ASM spfile。這些命令如下:

  • spbackup -- 備份ASM spfile為備份檔案。備份檔案並不具有特殊的檔案型別 ,也不會被識別為spfile

  • spcopy -- 將ASM spfile從源位置複製到目標位置(不能複製spbackup出來的備份檔案)

  • spmove -- 將ASM spfile從源位置移動到目標位置並且自動更新GPnP profile檔案

CREATE PFILE FROM SPFILE和CREATE SPFILE FROM PFILE命令對於磁碟組中的spfile仍然可用。

ASM spfile in disk group DATA

在我的測試環境裡,ASM spfile位於DATA磁碟組。現在來找到它:

$ asmcmd find --type ASMPARAMETERFILE +DATA "*"

+DATA/ASM/ASMPARAMETERFILE/REGISTRY.253.822856169

可以看到,ASM spfile存放在一個特別的位置,它的ASM檔案號為253。儲存在磁碟組中的ASM spfile是作為ASM的後設資料檔案被管理,一直具有ASM後設資料檔案號253.

當然了,在sqlplus中可以看到相同的結果:

$ sqlplus / as sysasm

SQL> show parameter spfile

NAME TYPE VALUE

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

spfile string +DATA/ASM/ASMPARAMETERFILE/registry.253.822856169

SQL>

下面對ASM spfile做個備份:

$ asmcmd spbackup

+DATA/ASM/ASMPARAMETERFILE/REGISTRY.253.822856169

/tmp/ASMspfile.backup

下面檢視備份檔案的內容:

$ strings /tmp/ASMspfile.backup

+ASM.__oracle_base='/u01/app/grid'#ORACLE_BASE set from in memory

value

+ASM.asm_diskgroups='RECO','ACFS'#Manual Mount

*.asm_power_limit=1

*.large_pool_size=12M

*.remote_login_passwordfile='EXCLUSIVE'

可以看到,這就是一份ASM spfile的副本,內容包含了引數和相關的comment。

ASM spfile discovery

所以問題來了,當磁碟組還沒mount時,ASM例項怎麼讀取spfile來啟動呢?不僅如此,ASM不知道spfile位於哪個磁碟組,甚至於都不知道是否位於磁碟組上。再者,ASM例項也不知道ASM discovery string的值是什麼。

ASM Admin guide文件裡是這麼描述的:

當ASM例項尋找初始化引數檔案(即pfile或者spfile)時,將按照如下順序:

1. 由GPnP profile指定的引數檔案位置

2. 如果GPnP profile裡沒有指定,再按照下面順序尋找:

3. 

  • 位於ASM HOME目錄下的spfile,(比如  $ORACLE_HOME/dbs/spfile+ASM.ora)

  • 位於ASM HOME目錄下的pfile

這裡沒有提到和ASM discovery string有關的資訊,但是至少提到了spfile和GPnP profile。ASM discovery string也是位於GPnP profile裡的。下面是在Exadata環境中使用gpnptool命令獲得的引數值:

$ gpnptool getpval -p=profile.xml -asm_dis -o-

o/*/*

$ gpnptool getpval -p=profile.xml -asm_spf -o-

+DBFS_DG/spfileASM.ora

在單例項環境中,沒有GPnP profile,這些資訊位於ASM資源(ora.asm)中,儲存在OLR中。 下面是一個單例項的例子:

$ crsctl stat res ora.asm -p | egrep "ASM_DISKSTRING|SPFILE"

ASM_DISKSTRING=

SPFILE=+DATA/ASM/ASMPARAMETERFILE/registry.253.822856169

到目前為止,我們知道了ASM如何獲得ASM磁碟和spfile的位置。但是磁碟組還沒有mount時,ASM怎麼讀取spfile呢?

奧秘就在ASM磁碟頭裡。為了支援spfile儲存在ASM磁碟組中,磁碟頭中增加了兩個條目:

  • kfdhdb.spfile - ASM spfile所在AU號

  • kfdhdb.spfflg - ASM spfile的標誌位。如果值為1,那麼ASM spfile就位於這個磁碟,AU號由kfdhdb.spfile指明。

在發現磁碟的過程中,ASM例項讀取磁碟頭,尋找spfile的相關資訊。找到儲存spfile的磁碟後,就可以讀取初始引數檔案。

下面在我的測試磁碟組DATA中做個演示,首先檢查磁碟組狀態和冗餘型別 

$ asmcmd lsdg -g DATA | cut -c1-26 Inst_ID State Type

1 MOUNTED NORMAL

可以看到磁碟組是mount狀態,冗餘型別是normal。也就是說ASM spfile會有兩副本。那麼我們會看到兩個磁碟設定了kfdhdb.spfile和kfdhdb.spfflg的值。下面驗證一下:

$ for disk in `asmcmd lsdsk -G DATA --suppressheader`

> do

> echo $disk

> kfed read $disk | grep spf

> done

/dev/sdc1

kfdhdb.spfile: 46 ; 0x0f4: 0x0000002e

kfdhdb.spfflg: 1 ; 0x0f8: 0x00000001

/dev/sdd1

kfdhdb.spfile: 2212 ; 0x0f4: 0x000008a4

kfdhdb.spfflg: 1 ; 0x0f8: 0x00000001

/dev/sde1

kfdhdb.spfile: 0 ; 0x0f4: 0x00000000

kfdhdb.spfflg: 0 ; 0x0f8: 0x00000000

可以看到,確實有兩個磁碟儲存了ASM spfile。下面看一下磁碟/dev/sdc1 46號AU的內容:

$ dd if=/dev/sdc1 bs=1048576 skip=46 count=1 | strings

+ASM.__oracle_base='/u01/app/grid'#ORACLE_BASE set from in memory value

+ASM.asm_diskgroups='RECO','ACFS'#Manual Mount

*.asm_power_limit=1

*.large_pool_size=12M

*.remote_login_passwordfile='EXCLUSIVE'

1+0 records in

1+0 records out

1048576 bytes (1.0 MB) copied, 0.0352732 s, 29.7 MB/s

磁碟/dev/sdc1的46號AU就是我們要找的ASM spfile。

ASM spfile alias block

除了以上兩個條目,還增加了一個新的後設資料塊型別 - KFBTYP_ASMSPFALS。它用來描述ASM spfile別名,位於ASM spfile的最後一個塊。 下面看一下46號AU的最後一個塊:

$ kfed read /dev/sdc1 aun=46 blkn=255

kfbh.endian: 1 ; 0x000: 0x01

kfbh.hard: 130 ; 0x001: 0x82

kfbh.type: 27 ; 0x002: KFBTYP_ASMSPFALS

kfbh.datfmt: 1 ; 0x003: 0x01

kfbh.block.blk: 255 ; 0x004: blk=255

kfbh.block.obj: 253 ; 0x008: file=253

kfbh.check: 806373865 ; 0x00c: 0x301049e9

kfbh.fcn.base: 0 ; 0x010: 0x00000000

kfbh.fcn.wrap: 0 ; 0x014: 0x00000000

kfbh.spare1: 0 ; 0x018: 0x00000000

kfbh.spare2: 0 ; 0x01c: 0x00000000

kfspbals.incarn: 822856169 ; 0x000: 0x310bc9e9

kfspbals.blksz: 512 ; 0x004: 0x00000200

kfspbals.size: 3 ; 0x008: 0x0003

kfspbals.path.len: 0 ; 0x00a: 0x0000

kfspbals.path.buf: ; 0x00c: length=0

這個後設資料塊裡沒有很多資訊。大多數條目是塊頭資訊(以kfbh開頭的條目)。真正的ASM spfile別名的資料(以kfspbals開頭的條目)只有幾條。spfile file版本號是檔名(REGISTRY.253.822856169)的一部分,塊大小為512位元組,檔案大小是3個塊。以上輸出中路徑相關條目的資訊為空,是指不存在ASM spfile別名。

下面建立一個spfile別名。首先從現有的spfile建立一個pfile,然後根據該pfile建立一個spfile別名:

$ sqlplus / as sysasm

SQL> create pfile='/tmp/pfile+ASM.ora' from spfile;

File created.

SQL> shutdown abort;

ASM instance shutdown

SQL> startup pfile='/tmp/pfile+ASM.ora';

ASM instance started

Total System Global Area 1135747072 bytes

Fixed Size 2297344 bytes

Variable Size 1108283904 bytes

ASM Cache 25165824 bytes

ASM diskgroups mounted

SQL> create spfile='+DATA/spfileASM.ora' from

pfile='/tmp/pfile+ASM.ora';

File created.

SQL> exit

再次定位ASM spfile會顯示兩條返回結果:

$ asmcmd find --type ASMPARAMETERFILE +DATA "*"

+DATA/ASM/ASMPARAMETERFILE/REGISTRY.253.843597139

+DATA/spfileASM.ora

可以看到ASM spfile本身和它的別名。下面確認下spfileASM.ora是別名檔案:

$ asmcmd ls -l +DATA/spfileASM.ora

Type             Redund Striped Time            Sys Name

ASMPARAMETERFILE MIRROR COARSE  MAR 30 20:00:00 N

spfileASM.ora =>

+DATA/ASM/ASMPARAMETERFILE/REGISTRY.253.843597139

下面再看下spfile別名塊的資訊:

$ kfed read /dev/sdc1 aun=46 blkn=255

kfbh.endian: 1 ; 0x000: 0x01

kfbh.hard: 130 ; 0x001: 0x82

kfbh.type: 27 ; 0x002: KFBTYP_ASMSPFALS

kfbh.datfmt: 1 ; 0x003: 0x01

kfbh.block.blk: 255 ; 0x004: blk=255

kfbh.block.obj: 253 ; 0x008: file=253

kfbh.check: 2065104480 ; 0x00c: 0x7b16fe60

kfbh.fcn.base: 0 ; 0x010: 0x00000000

kfbh.fcn.wrap: 0 ; 0x014: 0x00000000

kfbh.spare1: 0 ; 0x018: 0x00000000

kfbh.spare2: 0 ; 0x01c: 0x00000000

kfspbals.incarn: 843597139 ; 0x000: 0x32484553

kfspbals.blksz: 512 ; 0x004: 0x00000200

kfspbals.size: 3 ; 0x008: 0x0003

kfspbals.path.len: 13 ; 0x00a: 0x000d

kfspbals.path.buf: spfileASM.ora ; 0x00c: length=13

現在可以看到別名檔名的資訊了。由於新建了spfile,版本號也變了。

Conclusion

從ASM 11.2開始,ASM spfile可以儲存在磁碟組裡。同時為了支援該特性,新增了對應的ASMCMD命令,我們也有了新的ASM後設資料結構。


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

相關文章