Oracle ASM spfile in a disk group

eric0435發表於2017-01-16

從ASM 11.2開始,ASM spfile可以被儲存在ASM磁碟組中。的確,在新ASM安裝時,OUI會將ASM spfile儲存在磁碟組中。這對於Oracle Restart(單例項環境)與RAC環境是一樣的。在安裝時第一個建立的磁碟組就是儲存spfile的預設位置,但這不是必須的。spfile仍然可以儲存在檔案系統中,比如$ORACLE_HOME/dbs目錄。

ASMCMD命令的新功能
為了支援這個功能,ASMCMD增加了新的命令來備份,複製與遷移ASM spfile。這些命令是:
.spbackup:將一個ASM spfile備份到一個備份檔案中。這個備份檔案不是一種特定檔案型別並且不會被標識為一個spfile。

.spcopy:將一個ASM spfile檔案從原目錄複製到目標目錄中

.spmove:將一個ASM spfile檔案從原目錄遷移到目標目錄中並且自動更新GPnP profile。

SQL命令create pfile from spfile與create spfile from pfile對於儲存在磁碟組中的ASM spfile仍然有效。

儲存在磁碟組中的ASM spfile
在我的環境中,ASM spfile儲存在磁碟組crsdg中

[grid@jyrac1 trace]$ asmcmd find --type ASMPARAMETERFILE +CRSDG "*"
+CRSDG/jyrac-cluster/asmparameterfile/REGISTRY.253.928747387

從上面的結果可以看到,ASM spfile儲存在特定的目錄中,並且它的ASM檔案號為253,ASM spfile以一個註冊檔案儲存在磁碟組中,並且它的ASM後設資料檔案號總是253

可以使用sqlplus來檢視

SQL> show parameter spfile

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
spfile                               string                 +CRSDG/jyrac-cluster/asmparame
                                                            terfile/REGISTRY.253.928747387

備份ASM spfile檔案

[grid@jyrac1 trace]$ asmcmd spbackup +CRSDG/jyrac-cluster/asmparameterfile/REGISTRY.253.928747387 /home/grid/asmspfile.backup

檢視備份ASM spfile檔案的內容

[grid@jyrac1 ~]$ strings asmspfile.backup
+ASM1.__oracle_base='/u01/app/grid'#ORACLE_BASE set from in memory value
+ASM2.asm_diskgroups='ARCHDG','DATADG'#Manual Dismount
+ASM1.asm_diskgroups='ARCHDG','DATADG','ACFS'#Manual Mount
*.asm_power_limit=1
*.diagnostic_dest='/u01/app/grid'
*.instance_type='asm'
*.large_pool_size=12M
*.remote_login_passwordfile='EXCLUSIVE'

可以看到這是ASM spfile的一個副本,它包含了引數與相關注釋

ASM spfile查詢順序
因為ASM例項在啟動時需要讀取spfile檔案,如果spfile所在磁碟組不能mount,那麼ASM不僅不知道spfile儲存在那個磁碟組,而且也不知道ASM spfile查詢字串的值。當Oracle ASM例項搜尋一個初始化引數檔案時,它的搜尋順序為:
1.在Grid Plug and Play(GPnp) profile中指定的初始化引數檔案目錄
2.如果在GPnP profile中沒有指定,那麼搜尋順序將變為:
2.1.Oracle ASM例項home目錄中的spfile(比如:$ORACLE_HOME/dbs/spfile+ASM.ora)
2.2.Oracle ASM例項home目錄中的pfile

這裡並沒有告訴關於ASM查詢順序字串的任何資訊,但至少告訴我們了spfile與GPnp profile。下面是來自Exadata環境中的值:

[root@jyrac2 ~]# find / -name profile.xml
/u01/app/product/11.2.0/crs/gpnp/jyrac2/profiles/peer/profile.xml
/u01/app/product/11.2.0/crs/gpnp/profiles/peer/profile.xml
[grid@jyrac2 peer]$ gpnptool getpval -p=profile.xml -?

Oracle GPnP Tool
     getpval  Get value(s) from GPnP Profile
Usage: 
 "gpnptool getpval ", where switches are: 
    -prf                  Profile Tag: , optional
    -[id:]prf_cn          Profile Tag: ">, optional
    -[id:]prf_pa          Profile Tag: ">, optional
    -[id:]prf_sq          Profile Tag: ">, optional
    -[id:]prf_cid         Profile Tag: ">, optional
    -[pid:]nets           Profile Tag:  children of , optional
    -[pid:]haip           Profile Tag:  children of , optional
    -[id:]haip_ma         Profile Tag: ">, optional
    -[id:]haip_bm         Profile Tag: ">, optional
    -[id:]haip_s          Profile Tag: ">, optional
    -[pid:]hnet           Profile Tag:  children of , optional
    -[id:]hnet_nm         Profile Tag: ">, optional
    -[pid:]net            Profile Tag:  children of , optional
    -[id:]net_ip          Profile Tag: ">, optional
    -[id:]net_use         Profile Tag: ">, optional
    -[id:]net_nt          Profile Tag: ">, optional
    -[id:]net_aip         Profile Tag: ">, optional
    -[id:]net_ada         Profile Tag: ">, optional
    -[pid:]asm            Profile Tag:  children of , optional
    -[id:]asm_dis         Profile Tag: ">, optional
    -[id:]asm_spf         Profile Tag: ">, optional
    -[id:]asm_uid         Profile Tag: ">, optional
    -[pid:]css            Profile Tag:  children of , optional
    -[id:]css_dis         Profile Tag: ">, optional
    -[id:]css_ld          Profile Tag: ">, optional
    -[id:]css_cin         Profile Tag: ">, optional
    -[id:]css_cuv         Profile Tag: ">, optional
    -[pid:]ocr            Profile Tag:  children of , optional
    -[id:]ocr_oid         Profile Tag: ">, optional
    -rmws                 Remove whitespace from xml, optional
    -fmt[=0,2]            Format profile. Value is ident level,step, optional
    -p[=profile.xml]      GPnP profile name
    -o[=gpnptool.out]     Output result to a file, optional
    -o-                   Output result to stdout
    -ovr                  Overwrite output file, if exists, optional
    -t[=3]                Trace level (min..max=0..7), optional
    -f=              Command file name, optional
    -?                    Print verb help and exit


[grid@jyrac2 peer]$ gpnptool getpval -p=profile.xml -asm_dis -o-

[grid@jyrac2 peer]$ gpnptool getpval -p=profile.xml -asm_spf -o-
+CRSDG/jyrac-cluster/asmparameterfile/spfileasm.ora

在單例項環境中沒有GPnP profile,因此為了支援在磁碟組中儲存ASM spfile

[grid@jyrac1 ~]$ crsctl stat res ora.asm -p | egrep "ASM_DISKSTRING|SPFILE"
ASM_DISKSTRING=
SPFILE=+DATA/ASM/ASMPARAMETERFILE/registry.253.822856169

現在知道ASM在什麼目錄查詢ASM磁碟與spfile。但磁碟組不能被mount,ASM例項沒有啟動時,ASM如何讀取spfile呢,答案就在ASM磁碟頭中。為了支援在磁碟組中儲存ASM spfile,在ASM磁碟頭中增加了兩個欄位:
.kfdhdb.spfile:ASM spfile的AU號
.kfdhdb.spfflg:ASM spfile標記,如果為1,ASM spfile將儲存在kfdhdb.spfile所指示的AU中。

作為磁碟發現操作的一部分,ASM例項將讀取磁碟頭並查詢spfile資訊。一旦它查詢到磁碟儲存了spfile,它將可以讀取真實的初始化引數。

下面先來檢查我環境中的磁碟組CRSDG的狀態與冗餘型別

[grid@jyrac1 ~]$ asmcmd lsdg -g CRSDG  | cut -c1-26
Inst_ID  State    Type    
      1  MOUNTED  EXTERN  
      2  MOUNTED  EXTERN  

磁碟組CRSDG被mount並且磁碟組為外部冗餘。這意味著ASM spfile不會有映象副本,因此我們只能看到一個磁碟有kfdhdb.spfile與fkdhdb.spfflg欄位。例如:

[grid@jyrac1 ~]$ asmcmd lsdsk -G CRSDG --suppressheader
/dev/raw/raw1
/dev/raw/raw8
[grid@jyrac1 ~]$ kfed read /dev/raw/raw1 | grep spf
kfdhdb.spfile:                        0 ; 0x0f4: 0x00000000
kfdhdb.spfflg:                        0 ; 0x0f8: 0x00000000
[grid@jyrac1 ~]$ kfed read /dev/raw/raw8 | grep spf
kfdhdb.spfile:                       30 ; 0x0f4: 0x0000001e
kfdhdb.spfflg:                        1 ; 0x0f8: 0x00000001

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

GROUP_NUMBER DISK_NUMBER NAME                                                         PATH
------------ ----------- ------------------------------------------------------------ --------------------------------------------------
           2           1 CRSDG_0001                                                   /dev/raw/raw8
           2           0 CRSDG_0000                                                   /dev/raw/raw1

可以看到只有一個磁碟上儲存了ASM spfile檔案

使用kfed工具來檢視磁碟/dev/raw/raw8上的30號AU所儲存的內容

[grid@jyrac1 ~]$ dd if=/dev/raw/raw8 bs=1048576 skip=30 count=1 | strings
+ASM1.__oracle_base='/u01/app/grid'#ORACLE_BASE set from in memory value
+ASM2.asm_diskgroups='ARCHDG','DATADG'#Manual Dismount
+ASM1.asm_diskgroups='ARCHDG','DATADG','ACFS'#Manual Mount
*.asm_power_limit=1
*.diagnostic_dest='/u01/app/grid'
*.instance_type='asm'
*.large_pool_size=12M
*.remote_login_passwordfile='EXCLUSIVE'
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.035288 seconds, 29.7 MB/s
KeMQ
jyrac-cluster/asmparameterfile/spfileasm.ora

磁碟/dev/raw/raw8上的30號AU的確是儲存的ASM spfile內容

ASM spfile別名塊
新的ASM磁碟頭有一個額外的欄位,它的後設資料塊型別為KFBTYP_ASMSPFALS,它用來描述ASM spfile別名。ASM spfile別名儲存在ASM spfile所在AU的最後一個塊中。下面來檢視磁碟/dev/raw/raw8上的30號AU的最一個塊255:

[grid@jyrac1 ~]$ kfed read /dev/raw/raw8 aun=30 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:                  1364026699 ; 0x00c: 0x514d654b
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfspbals.incarn:              928747387 ; 0x000: 0x375b8f7b
kfspbals.blksz:                     512 ; 0x004: 0x00000200
kfspbals.size:                        3 ; 0x008: 0x0003
kfspbals.path.len:                   44 ; 0x00a: 0x002c
kfspbals.path.buf:                      ; 0x00c: length=0

這個後設資料塊不大,大多數的條目都是塊頭資訊(欄位kfbh.*)。實際上ASM spfile別名資料(欄位kfspbals.*)只有幾個條目。spfile檔案的incarnation為928747387是檔名(REGISTRY.253.928747387)的一部分,ASM spfile的塊大小512 bytes並且檔案大小為3個塊。path資訊為空,意味著沒有真實的ASM spfile別名。

下面將建立ASM spfile別名,先使用現有的spfile來建立pfile,再使用pfile來建立spfile別名:

[grid@jyrac1 ~]$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='+CRSDG/jyrac-cluster/asmparameterfile/spfileasm.ora' from pfile='/tmp/pfile+ASM.ora';

File created.

SQL> exit

再次使用asmcmd檢視ASM spfile將會發現存在兩個條目

[grid@jyrac1 trace]$ asmcmd find --type ASMPARAMETERFILE +CRSDG "*"
+CRSDG/jyrac-cluster/asmparameterfile/REGISTRY.253.928747387
+CRSDG/jyrac-cluster/asmparameterfile/spfileasm.ora

現在可以看到ASM spfile本身(REGISTRY.253.928747387)與它的別名或連結檔案(spfileasm.ora)。檢視spfileasm.ora可以看到它確實是註冊檔案(REGISTRY.253.928747387)的別名

[grid@jyrac1 ~]$ asmcmd ls -l +CRSDG/jyrac-cluster/asmparameterfile/
Type              Redund  Striped  Time             Sys  Name
ASMPARAMETERFILE  UNPROT  COARSE   JAN 12 16:00:00  Y    REGISTRY.253.928745345
                                                    N    spfileasm.ora => +CRSDG/jyrac-cluster/asmparameterfile/REGISTRY.253.928745345

下面再次檢視磁碟/dev/raw/raw8上的30號AU的最一個塊255:

[grid@jyrac1 ~]$ kfed read /dev/raw/raw8 aun=30 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:                  1364026699 ; 0x00c: 0x514d654b
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfspbals.incarn:              928745345 ; 0x000: 0x375b8f7b
kfspbals.blksz:                     512 ; 0x004: 0x00000200
kfspbals.size:                        3 ; 0x008: 0x0003
kfspbals.path.len:                   44 ; 0x00a: 0x002c
kfspbals.path.buf:jyrac-cluster/asmparameterfile/spfileasm.ora ; 0x00c: length=44

現在可以看到別名檔名出現在ASM spfile別名塊中。並且出現了新的incarnation號來表示新的ASM spfile檔案的建立時間。

小結:
從ASM 11.2開始,ASM spfile可以被儲存在ASM磁碟組中。為了支援這個功能,ASMCMD增加了相關命令來進行管理,並且在ASM磁碟頭中增加了新的ASM後設資料結構。

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

相關文章