おらくるのいる生活

OracleのDBAとしての、障害対応やらパフォーマンス・チューニングやらの日々を綴っています

kfodとkfedについて

今回はASMを使用する環境で知っておくと便利なコマンド、 kfodとkfedをご紹介します。 

 

  

kfkodとは

KFOD =Kernel Files Osm Disk
ASMディスクヘッダが正常か、ASMディスクとして使用可能かを検証するコマンド。
インストール時にOUI、DBCA、ASMCAなどによって使用されている。
10.2以降で使用可能。

kfedとは

KFED =Kernel Files metadata EDitor
ASMディスクヘッダを可視化するコマンド。
ASMディスクヘッダを分析し、破損している場合の修正なども行える。
11.1以降で使用可能。

 OSレベルで実行されるコマンドなのて、ASMディスクがマウントしていない・ASMインスタンスが起動していない・CRSまはたOHASが起動していない状態でも使用可能です。
と言うより、ASMディスクがマウントできない時、GridInfrastructureが正常にインストールできない時、或いはインストール前の検証に使用します。

※kfodはCSSと通信しているので、CSS停止時に実行するとKFOD-00301が発生しますが、ヘッダへのアクセス可能性はチェックできます。

 

基本的な使い方は以下の通りです。
GridInfrastructureインストール時に、GI_HOME/binの下にインストールされるので、そこにPATHを通します。
※旧バージョン(10.2)ではASM_HOME/binの下。

kfodをGridInfrastructureのインストール前に使用する場合は、インストールディレクトリの以下の場所に格納されているkfodを使用します。
/grid/stage/ext/bin
また、インストール前に使用する時は、LD_LIBRARY_PATHを以下のように設定する必要があります。
LD_LIBRARY_PATH=/grid/stage/ext/lib

※kfedはインストール前には使用できません。

 

以下、具体的な実行例です。

ASMとして使用可能なデバイスを検出します。
RACでASMLibを使用しているケースの例

$ kfod disks=all
Disk Size Path
==============================================
1: 804732 Mb ORCL:DATA
2: 836403 Mb ORCL:REDO
ORACLE_SID ORACLE_HOME
==============================================
+ASM1 /oracle/product/11.1.0.6/asm
+ASM2 /oracle/product/11.1.0.6/asm

※シングルインスタンスでASMLibを使用していないケースの例

$ kfod a='/dev/asm*' di=all
--------------------------------------------------------------------------------
Disk Size Path User Group
================================================
1: 2353 Mb /dev/asmdisk1_udev_p1 oracle oinstall
2: 2353 Mb /dev/asmdisk1_udev_p2 oracle oinstall
3: 4706 Mb /dev/asmdisk1_udev_p3 oracle oinstall
4: 823 Mb /dev/asmdisk1_udev_p4 oracle oinstall
--------------------------------------------------------------------------------
ORACLE_SID ORACLE_HOME
=================================================
+ASM /u01/app/11.2.0/grid_1

ここで出力されないデバイスは、ASMとして使用できないので、イントール前のチェックに使えますね。


ディスクグループとディスク統計のチェックをしてみます。

$ kfod ds=true di=all
--------------------------------------------------------------------------------
Disk Size Path Disk Group User Group
=================================================

1: 2353 Mb /dev/asmdisk1_udev_p1 DATA_DG1 oracle oinstall
2: 2353 Mb /dev/asmdisk1_udev_p2 DATA_DG1 oracle oinstall
3: 4706 Mb /dev/asmdisk1_udev_p3 DATA_DG1 oracle oinstall
4: 823 Mb /dev/asmdisk1_udev_p4 ASM_DG1 oracle oinstall
--------------------------------------------------------------------------------
ORACLE_SID ORACLE_HOME
=================================================
+ASM /u01/app/11.2.0/grid_1

 RACでディスクヘッダステータスのチェックをするとこんな感じになりますす。

$ kfod asm_diskstring='/dev/asm*' disks=all status=true
--------------------------------------------------------------------------------
Disk Size Header Path User Group
==================================================
1: 1100 Mb MEMBER /dev/asmdisk1_udev_p1 grid oinstall
2: 9139 Mb MEMBER /dev/asmdisk1_udev_p2 grid oinstall
--------------------------------------------------------------------------------
ORACLE_SID ORACLE_HOME
==================================================
+ASM1 /u01/app/12.1.0/grid_1

+ASM2 /u01/app/12.1.0/grid_1

 

次にkfedを使ってみます。

ヘッダ情報がずらずらと出てきます。

$ kfed dev=/dev/asmdisk1_udev_p3 op=READ

kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 0 ; 0x004: blk=0
kfbh.block.obj: 2147483650 ; 0x008: disk=2
kfbh.check: 1472974655 ; 0x00c: 0x57cbcf3f
kfbh.fcn.base: 0 ; 0x010: 0x00000000
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfdhdb.driver.provstr: ORCLDISK2 ; 0×000: length=3
(略)
kfdhdb.ub4spare[53]: 0 ; 0x1d0: 0x00000000
kfdhdb.acdb.aba.seq: 0 ; 0x1d4: 0x00000000
kfdhdb.acdb.aba.blk: 0 ; 0x1d8: 0x00000000
kfdhdb.acdb.ents: 0 ; 0x1dc: 0x0000
kfdhdb.acdb.ub2spare: 0 ; 0x1de: 0x0000

主な見どころは以下の通りです。

kfdhdb.hdrsts - ディスクのステータス
kfdhdb.dskname - ディスク名
kfdhdb.grpname - ディスクグループ名
kfdhdb.fgname - 冗長化している場合のfailure group名
kfdhdb.secsize - セクタサイズ
kfdhdb.blksize - ブロックサイズ
kfdhdb.ausize - AUアロケーション・ユニット)サイズ

見どころだけ絞ってみると、以下の通りになります。

$ kfed dev=/dev/asmdisk1_udev_p3 op=READ |egrep -i "kfdhdb.hdrsts|kfdhdb.dskname|kfdhdb.grpname|kfdhdb.fgname|kfdhdb.secsize|kfdhdb.blksize|kkfdhdb.driver.provstr|kfdhdb.ausize"

kfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBER
kfdhdb.dskname: DATA_DG1_0002 ; 0x028: length=13
kfdhdb.grpname: DATA_DG1 ; 0x048: length=8
kfdhdb.fgname: DATA_DG1_0002 ; 0x068: length=13
kfdhdb.secsize: 512 ; 0x0b8: 0x0200
kfdhdb.blksize: 4096 ; 0x0ba: 0x1000
kfdhdb.ausize: 1048576 ; 0x0bc: 0x00100000

ASMディスクではないディスクに使用すると、以下のエラーが発生します。

KFED-00322: Invalid content encountered during block traversal: [kfbtTraverseBlock][Invalid OSM block type][0]

また、AUサイズがデフォルト(1M)と異なる時は、以下の様にAUサイズを指定する必要があります。

$ kfed read /dev/raw/raw2 aus=4194304

 

以下、ケース別使用例を見ていきます。
ORA-15063が発生して、ASMディスクがマウントできないケースです。

$ asmcmd

ASMCMD> mount DATA
ORA-15032: not all alterations performed
ORA-15017: diskgroup “DATA” cannot be mounted
ORA-15063: ASM discovered an insufficient number of disks for diskgroup “DATA” (DBD ERROR: OCIStmtExecute)

SQL> alter diskgroup DATA mount;
alter diskgroup DATA mount
*
ERROR at line 1:
ORA-15032: not all alterations performed
ORA-15017: diskgroup “DATA” cannot be mounted
ORA-15063: ASM discovered an insufficient number of disks for diskgroup “DATA”

Kfodを使用して、ディスクへのアクセスと、ヘッダの状態を確認します。
2つのディスクのステータスがprovisionedとなっているが判ります。

$ kfod status=TRUE asm_diskstring='/dev/raw/raw*’ disk=all dscvgroup=TRUE

Disk Size Header Path Disk Group User Group
======================================================
1: 512000 Mb MEMBER /dev/raw/raw1 DATA ora11g dba
2: 512000 Mb PROVISIONED /dev/raw/raw2 DATA ora11g dba
3: 512000 Mb MEMBER /dev/raw/raw3 DATA ora11g dba
4: 512000 Mb PROVISIONED /dev/raw/raw4 DATA ora11g dba
5: 512000 Mb MEMBER /dev/raw/raw5 DATA ora11g dba
6: 512000 Mb MEMBER /dev/raw/raw6 DATA ora11g dba
ORACLE_SID ORACLE_HOME
======================================================
+ASM /oracle/grid11g

Kfedを使用して、ヘッダの状態を確認します。

$ kfed read /dev/raw/raw2

kfbh.endian: 1 ; 0×000: 0×01
kfbh.hard: 130 ; 0×001: 0×82
kfbh.type: 1 ; 0×002: KFBTYP_DISKHEAD
kfbh.datfmt: 1 ; 0×003: 0×01
kfbh.block.blk: 0 ; 0×004: blk=0
kfbh.block.obj: 2147483648 ; 0×008: disk=0
kfbh.check: 945480537 ; 0x00c: 0x385ae359
kfbh.fcn.base: 0 ; 0×010: 0×00000000
kfbh.fcn.wrap: 0 ; 0×014: 0×00000000
kfbh.spare1: 0 ; 0×018: 0×00000000
kfbh.spare2: 0 ; 0x01c: 0×00000000
kfdhdb.driver.provstr:ORCLDISK ; 0×000: length=32
(略)
kfdhdb.ub4spare[53]: 0 ; 0x1d0: 0×00000000
kfdhdb.acdb.aba.seq: 0 ; 0x1d4: 0×00000000
kfdhdb.acdb.aba.blk: 0 ; 0x1d8: 0×00000000
kfdhdb.acdb.ents: 0 ; 0x1dc: 0×0000
kfdhdb.acdb.ub2spare: 43605 ; 0x1de: 0xaa55

kfdhdb.acdb.ub2spareの0xaa55が破損している事が判ります。

Kfedを使用して、破損したヘッダを修復します。

念のため、予めバックアップを取得します。

$ dd if=/dev/raw/raw2 of=/tmp/DATA.dd bs=1M count=10

AUサイズを確認し、

$ kfed read /dev/raw/raw2 | grep ausize

修復を実行します。

$ kfed repair /dev/raw/raw2 aus=1048576

 

※修復を実行する際には、事前にOracle社サポートに確認を取ってから、実施して下さい。

 

ヘッダが破損している別の例です。

$ kfed read /dev/mapper/mpathe
kfbh.endian: 0 ; 0x000: 0x00
kfbh.hard: 0 ; 0x001: 0x00
kfbh.type: 0 ; 0x002: KFBTYP_INVALID
kfbh.datfmt: 0 ; 0x003: 0x00
kfbh.block.blk: 0 ; 0x004: blk=0
kfbh.block.obj: 0 ; 0x008: file=0
kfbh.check: 0 ; 0x00c: 0x00000000
kfbh.fcn.base: 0 ; 0x010: 0x00000000
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
7F0B46922400 00000000 00000000 00000000 00000000 [................]
Repeat 26 times
7F0B469225B0 00000000 00000000 00000000 00009A1D [................]
7F0B469225C0 FEEE0001 0001FFFF FFFF0000 00003E7F [.............>..]
7F0B469225D0 00000000 00000000 00000000 00000000 [................]
Repeat 1 times
7F0B469225F0 00000000 00000000 00000000 AA550000 [..............U.]
7F0B46922600 20494645 54524150 00010000 0000005C [EFI PART....\...]
7F0B46922610 61BAE647 00000000 00000001 00000000 [G..a............]
7F0B46922620 3E7FFFFF 00000000 00000022 00000000 [...>....".......]
7F0B46922630 3E7FFFDE 00000000 234EED11 4FB5F1FC [...>......N#...O]
7F0B46922640 E49A8493 8FF0260A 00000002 00000000 [.....&..........]
7F0B46922650 00000080 00000080 AB54D286 00000000 [..........T.....]
7F0B46922660 00000000 00000000 00000000 00000000 [................]
Repeat 217 times
KFED-00322: Invalid content encountered during block traversal: [kfbtTraverseBlock][Invalid OSM block type][0]

この時の状態をkfodで確認すると、Statusがcandidateになっているのが判ります。

$ kfod status=TRUE asm_diskstring='/dev/mapper/*' disk=all dscvgroup=TRUE

--------------------------------------------------------------------------------------------
Disk Size Header Path Disk Group User Group
======================================================
1: 512000 Mb CANDIDATE /dev/mapper/mpathe # grid oinstall
---------------------------------------------------------------------------------------------
ORACLE_SID ORACLE_HOME
======================================================
+ASM /u01/app/grid/product/11.2.0/grid

修復を実行します。

$ kfed repair /dev/mapper/mpathe

$ kfod status=TRUE asm_diskstring='/dev/mapper/*' disk=all dscvgroup=TRUE
--------------------------------------------------------------------------------------------
Disk Size Header Path Disk Group User Group
======================================================
1: 512000 Mb MEMBER /dev/mapper/mpathe # grid oinstall
---------------------------------------------------------------------------------------------
ORACLE_SID ORACLE_HOME
======================================================
+ASM /u01/app/grid/product/11.2.0/grid

ステータスがCANDIDATE⇒MEMBERに変わっていますね。


RAC環境で、ディスク共有がうまくいっていない為にインストールでエラーとなるケースです。

全ノードで実行する事で、ディスク共有がなされているか判断します。

$ kfed dev=/dev/asmdisk1_udev_p1 op=READ | egrep "kfdhdb.vf|ausize"
kfdhdb.ausize: 1048576 ; 0x0bc: 0x00100000
kfdhdb.vfstart: 224 ; 0x0ec: 0x000000e0
kfdhdb.vfend: 256 ; 0x0f0: 0x00000100

 kfdhdb.vfstartがVotingDisk開始位置、kfdhdb.vfendがVotingDisk終了位置なので、全ノードで上記コマンドを実行し、不一致があればディスク共有がされていない事が判ります。

VotingDiskの状態チェックではcrsctl query css votediskコマンドがありますが、これはcrsが起動していないと使えないので、インストールに失敗していたり、インストール後にディスク破損などの理由でcrsが起動しなくなった時にkfod,kfedが活躍します。


ASM関連で問題が発生した時、GridInfrastructureのインストールがうまく行かない時など、ぜひ使ってみてください。

但しkfedのrepair(修復)を実行する時には、事前にOracle社サポートに確認を取るを忘れずに。