ASMの高速ミラー再同期とは、ディスクパスの障害時にディスクをDROPしてしまうのではなく、一時的に対象のディスクをオフラインにすることで無駄なリバランスの発生を防ぐための機能である。
この機能を使うためには、ディスクグループの互換性属性を11.1以上にする必要がある。ところが、Grid Infrastructureインストール時に作成されたディスクグループや、ASMCAで作成したディスクグループでは compatible.rdbms が 10.1 に設定されており、要件を満たさない状態になっている。compatible.asm などは 19.0 なのに、なぜか一つだけ異様に低い互換性属性になるという謎仕様。
SQL> select ad.name group_name, aa.name attribute_name, value from v$asm_diskgroup ad inner join v$asm_attribute aa on ad.group_number = aa.group_number where aa.name like '%compatible%';
GROUP_NAME ATTRIBUTE_NAME VALUE
----------- ------------------ -----------
DATA compatible.asm 19.0.0.0.0
DATA compatible.rdbms 10.1.0.0.0
DATA compatible.advm 19.0.0.0.0
FRA compatible.asm 19.0.0.0.0
FRA compatible.rdbms 10.1.0.0.0
FRA compatible.advm 19.0.0.0.0
OCR compatible.asm 19.0.0.0.0
OCR compatible.rdbms 10.1.0.0.0
OCR compatible.advm 19.0.0.0.0
高速ミラー再同期が無効な場合
例えば、3つの障害グループ(FG1、FG2、FG3)で構成されるディスクグループがあったとして、このうちの一つの障害グループ(FG1)に紐づくストレージとの接続が切れた場合を考える。上記互換性属性のままだと、ストレージが切断されることでその障害グループのディスクすべてがDROPされてしまう。
正常時
SQL> select GROUP_NUMBER, DISK_NUMBER, HEADER_STATUS, STATE, PATH, NAME, FAILGROUP from V$ASM_DISK order by 1, 2;
GROUP_NUMBER DISK_NUMBER HEADER_S STATE PATH NAME FAI
------------ ----------- -------- -------- -------------------- ----------------- ---
1 0 MEMBER NORMAL AFD:DATA1_1 DATA1_1 FG1
1 1 MEMBER NORMAL AFD:DATA1_2 DATA1_2 FG1
1 2 MEMBER NORMAL AFD:DATA2_1 DATA2_1 FG2
1 3 MEMBER NORMAL AFD:DATA2_2 DATA2_2 FG2
1 4 MEMBER NORMAL AFD:DATA3_1 DATA3_1 FG3
1 5 MEMBER NORMAL AFD:DATA3_2 DATA3_2 FG3
2 0 MEMBER NORMAL AFD:FRA1_1 FRA1_1 FG1
2 1 MEMBER NORMAL AFD:FRA1_2 FRA1_2 FG1
2 2 MEMBER NORMAL AFD:FRA2_1 FRA2_1 FG2
2 3 MEMBER NORMAL AFD:FRA2_2 FRA2_2 FG2
2 4 MEMBER NORMAL AFD:FRA3_1 FRA3_1 FG3
2 5 MEMBER NORMAL AFD:FRA3_2 FRA3_2 FG3
3 0 MEMBER NORMAL AFD:OCR1_1 OCR1_1 FG1
3 1 MEMBER NORMAL AFD:OCR1_2 OCR1_2 FG1
3 2 MEMBER NORMAL AFD:OCR2_1 OCR2_1 FG2
3 3 MEMBER NORMAL AFD:OCR2_2 OCR2_2 FG2
3 4 MEMBER NORMAL AFD:OCR3_1 OCR3_1 FG3
3 5 MEMBER NORMAL AFD:OCR3_2 OCR3_2 FG3
ディスク切断後
SQL> select GROUP_NUMBER, DISK_NUMBER, HEADER_STATUS, STATE, PATH, NAME, FAILGROUP from V$ASM_DISK order by 1, 2;
GROUP_NUMBER DISK_NUMBER HEADER_S STATE PATH NAME FAI
------------ ----------- -------- -------- -------------------- ----------------- ---
0 0 UNKNOWN NORMAL AFD:DATA1_1
0 1 UNKNOWN NORMAL AFD:OCR1_1
0 2 UNKNOWN NORMAL AFD:OCR1_2
0 3 UNKNOWN NORMAL AFD:FRA1_2
0 4 UNKNOWN NORMAL AFD:DATA1_2
0 5 UNKNOWN NORMAL AFD:FRA1_1
1 2 MEMBER NORMAL AFD:DATA2_1 DATA2_1 FG2
1 3 MEMBER NORMAL AFD:DATA2_2 DATA2_2 FG2
1 4 MEMBER NORMAL AFD:DATA3_1 DATA3_1 FG3
1 5 MEMBER NORMAL AFD:DATA3_2 DATA3_2 FG3
2 0 UNKNOWN NORMAL FRA1_1 FG1
2 1 UNKNOWN NORMAL FRA1_2 FG1
2 2 MEMBER NORMAL AFD:FRA2_1 FRA2_1 FG2
2 3 MEMBER NORMAL AFD:FRA2_2 FRA2_2 FG2
2 4 MEMBER NORMAL AFD:FRA3_1 FRA3_1 FG3
2 5 MEMBER NORMAL AFD:FRA3_2 FRA3_2 FG3
3 0 UNKNOWN FORCING _DROPPED_0000_OCR FG1
3 2 MEMBER NORMAL AFD:OCR2_1 OCR2_1 FG2
3 3 MEMBER NORMAL AFD:OCR2_2 OCR2_2 FG2
3 4 MEMBER NORMAL AFD:OCR3_1 OCR3_1 FG3
3 5 MEMBER NORMAL AFD:OCR3_2 OCR3_2 FG3
ディスクグループに属したままになっているディスクとそうでないディスクが混在しているのが謎なのだが…。どうもDROP時のリバランスがORA-59048 で失敗しており、それに起因する可能性はある。
SQL> select * from v$asm_operation;
GROUP_NUMBER OPERATION PASS STATE POWER ACTUAL SOFAR EST_WORK EST_RATE EST_MINUTES ERROR_CODE CON_ID
------------ --------------- --------------------------- -------- ---------- ---------- ---------- ---------- ---------- ----------- ---------- ----------
3 REBAL COMPACT WAIT 1 0
3 REBAL REBALANCE ERRS 1 ORA-59048 0
3 REBAL REBUILD WAIT 1 0
3 REBAL RESYNC WAIT 1 0
いずれにせよ、こうなってしまうとディスクそのものが正常だったとしても再度追加して復旧させなければならない。その際、ディスクのヘッダにディスクグループのメンバーであるという情報が残ってしまっているのでそれを削除したり、ASMFDを使っている場合は再度ラベル付けしたりする必要もある。
ディスクヘッダのクリア
$ asmcmd afd_lsdsk
--------------------------------------------------------------------------------
Label Filtering Path
================================================================================
DATA1_1 ENABLED /dev/sdp
DATA1_2 ENABLED /dev/sdo
DATA2_1 ENABLED /dev/sdi
DATA2_2 ENABLED /dev/sdj
DATA3_1 ENABLED /dev/sdk
DATA3_2 ENABLED /dev/sdm
FRA1_1 ENABLED /dev/sdd
FRA1_2 ENABLED /dev/sdc
FRA2_1 ENABLED /dev/sdl
FRA2_2 ENABLED /dev/sds
FRA3_1 ENABLED /dev/sdn
FRA3_2 ENABLED /dev/sdr
OCR1_1 ENABLED /dev/sdb
OCR1_2 ENABLED /dev/sdq
OCR2_1 ENABLED /dev/sde
OCR2_2 ENABLED /dev/sdf
OCR3_1 ENABLED /dev/sdg
OCR3_2 ENABLED /dev/sdh
dd if=/dev/zero of=/dev/sdp count=10
dd if=/dev/zero of=/dev/sdo count=10
dd if=/dev/zero of=/dev/sdd count=10
dd if=/dev/zero of=/dev/sdc count=10
dd if=/dev/zero of=/dev/sdb count=10
dd if=/dev/zero of=/dev/sdq count=10
ASMFDのリフレッシュと再ラベル付け
asmcmd afd_refresh --all
asmcmd afd_label OCR1_1 /dev/sdb
asmcmd afd_label OCR1_2 /dev/sdq
asmcmd afd_label DATA1_1 /dev/sdp
asmcmd afd_label DATA1_2 /dev/sdo
asmcmd afd_label FRA1_1 /dev/sdd
asmcmd afd_label FRA1_2 /dev/sdc
ディスクグループへのディスクの追加
SQL> alter diskgroup OCR add failgroup FG1 disk 'AFD:OCR1_1', 'AFD:OCR1_2' rebalance power 1024;
Diskgroup altered.
SQL> alter diskgroup DATA add failgroup FG1 disk 'AFD:DATA1_1', 'AFD:DATA1_2' rebalance power 1024;
Diskgroup altered.
SQL> alter diskgroup FRA add failgroup FG1 disk 'AFD:FRA1_1', 'AFD:FRA1_2' rebalance power 1024;
alter diskgroup FRA add failgroup FG1 disk 'AFD:FRA1_1', 'AFD:FRA1_2' rebalance power 1024
*
ERROR at line 1:
ORA-15032: not all alterations performed
ORA-15020: discovered duplicate ASM disk "FRA1_2"
ORA-15020: discovered duplicate ASM disk "FRA1_1"
この時、なぜか一部のディスクはディスクヘッダをクリアしているにもかかわらず追加できないという問題が起こったりする。どうもディスクがDROPしきれていないことが原因らしい。
SQL> select GROUP_NUMBER, DISK_NUMBER, HEADER_STATUS, STATE, PATH, NAME, FAILGROUP from V$ASM_DISK order by 1, 2;
GROUP_NUMBER DISK_NUMBER HEADER_STATUS STATE PATH NAME FAI
------------ ----------- --------------- -------- -------------------- ----------------- ---
0 0 PROVISIONED NORMAL AFD:FRA1_2 ← こっちにあるのに
0 1 PROVISIONED NORMAL AFD:FRA1_1 ←
1 0 MEMBER NORMAL AFD:DATA1_1 DATA1_1 FG1
1 1 MEMBER NORMAL AFD:DATA1_2 DATA1_2 FG1
1 2 MEMBER NORMAL AFD:DATA2_1 DATA2_1 FG2
1 3 MEMBER NORMAL AFD:DATA2_2 DATA2_2 FG2
1 4 MEMBER NORMAL AFD:DATA3_1 DATA3_1 FG3
1 5 MEMBER NORMAL AFD:DATA3_2 DATA3_2 FG3
2 0 UNKNOWN NORMAL FRA1_1 FG1 ← こっちにも残っている
2 1 UNKNOWN NORMAL FRA1_2 FG1 ←
2 2 MEMBER NORMAL AFD:FRA2_1 FRA2_1 FG2
2 3 MEMBER NORMAL AFD:FRA2_2 FRA2_2 FG2
2 4 MEMBER NORMAL AFD:FRA3_1 FRA3_1 FG3
2 5 MEMBER NORMAL AFD:FRA3_2 FRA3_2 FG3
3 1 MEMBER NORMAL AFD:OCR1_1 OCR1_1 FG1
3 2 MEMBER NORMAL AFD:OCR2_1 OCR2_1 FG2
3 3 MEMBER NORMAL AFD:OCR2_2 OCR2_2 FG2
3 4 MEMBER NORMAL AFD:OCR3_1 OCR3_1 FG3
3 5 MEMBER NORMAL AFD:OCR3_2 OCR3_2 FG3
3 6 MEMBER NORMAL AFD:OCR1_2 OCR1_2 FG1
こういう場合、force オプションを付けて強制的にディスクをdropすれば、追加可能になるようだ。
SQL> alter diskgroup FRA drop disk FRA1_1 force;
Diskgroup altered.
SQL> alter diskgroup FRA drop disk FRA1_2 force;
Diskgroup altered.
SQL> alter diskgroup FRA add failgroup FG1 disk 'AFD:FRA1_1', 'AFD:FRA1_2' rebalance power 1024;
Diskgroup altered.
高速ミラー再同期が有効な場合
比較として、高速ミラー再同期が有効な場合の動作も確認。事前に対象のディスクグループの compatible.rdbms を高い値に設定しておく。
ALTER DISKGROUP OCR SET ATTRIBUTE 'compatible.rdbms' = '12.2';
ALTER DISKGROUP DATA SET ATTRIBUTE 'compatible.rdbms' = '12.2';
ALTER DISKGROUP FRA SET ATTRIBUTE 'compatible.rdbms' = '12.2';
一部の障害グループのディスクにアクセスできなくなるとそれらのディスクはすべてオフラインになるが、V$ASM_DISK の REPAIR_TIMER 列からあとどれくらいでDROPされるかが確認できる。
SQL> select GROUP_NUMBER, DISK_NUMBER, HEADER_STATUS, STATE, PATH, NAME, FAILGROUP, REPAIR_TIMER from V$ASM_DISK order by 1, 2 ;
GROUP_NUMBER DISK_NUMBER HEADER_S STATE PATH NAME FAI REPAIR_TIMER
------------ ----------- -------- -------- -------------------- ----------------- --- ------------
0 0 UNKNOWN NORMAL AFD:DATA1_1 0
0 1 UNKNOWN NORMAL AFD:OCR1_1 0
0 2 UNKNOWN NORMAL AFD:OCR1_2 0
0 3 UNKNOWN NORMAL AFD:FRA1_2 0
0 4 UNKNOWN NORMAL AFD:DATA1_2 0
0 5 UNKNOWN NORMAL AFD:FRA1_1 0
1 0 UNKNOWN NORMAL DATA1_1 FG1 43069
1 1 UNKNOWN NORMAL DATA1_2 FG1 86271
1 2 MEMBER NORMAL AFD:DATA2_1 DATA2_1 FG2 0
1 3 MEMBER NORMAL AFD:DATA2_2 DATA2_2 FG2 0
1 4 MEMBER NORMAL AFD:DATA3_1 DATA3_1 FG3 0
1 5 MEMBER NORMAL AFD:DATA3_2 DATA3_2 FG3 0
2 0 UNKNOWN NORMAL FRA1_1 FG1 43069
2 1 UNKNOWN NORMAL FRA1_2 FG1 86271
2 2 MEMBER NORMAL AFD:FRA2_1 FRA2_1 FG2 0
2 3 MEMBER NORMAL AFD:FRA2_2 FRA2_2 FG2 0
2 4 MEMBER NORMAL AFD:FRA3_1 FRA3_1 FG3 0
2 5 MEMBER NORMAL AFD:FRA3_2 FRA3_2 FG3 0
3 1 UNKNOWN NORMAL OCR1_1 FG1 86269
3 2 MEMBER NORMAL AFD:OCR2_1 OCR2_1 FG2 0
3 3 MEMBER NORMAL AFD:OCR2_2 OCR2_2 FG2 0
3 4 MEMBER NORMAL AFD:OCR3_1 OCR3_1 FG3 0
3 5 MEMBER NORMAL AFD:OCR3_2 OCR3_2 FG3 0
3 6 UNKNOWN NORMAL OCR1_2 FG1 86269
$ asmcmd lsdg
State Type Rebal Sector Logical_Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name
MOUNTED HIGH N 512 512 4096 4194304 61440 48240 30720 5840 2 N DATA/
MOUNTED HIGH N 512 512 4096 4194304 122880 118260 61440 18940 2 N FRA/
MOUNTED NORMAL N 512 512 4096 4194304 12288 7988 4096 1946 2 Y OCR/
時間切れになる前にディスクを再接続したら、その障害グループを手動でオンラインにすれば復旧は完了する。
SQL> alter diskgroup OCR online disks in failgroup FG1;
Diskgroup altered.
SQL> alter diskgroup DATA online disks in failgroup FG1;
Diskgroup altered.
SQL> alter diskgroup FRA online disks in failgroup FG1;
Diskgroup altered.
SQL> select GROUP_NUMBER, DISK_NUMBER, HEADER_STATUS, STATE, PATH, NAME, FAILGROUP from V$ASM_DISK order by 1, 2;
GROUP_NUMBER DISK_NUMBER HEADER_STATUS STATE PATH NAME FAI
------------ ----------- --------------- -------- -------------------- ----------------- ---
1 0 MEMBER NORMAL AFD:DATA1_1 DATA1_1 FG1
1 1 MEMBER NORMAL AFD:DATA1_2 DATA1_2 FG1
1 2 MEMBER NORMAL AFD:DATA2_1 DATA2_1 FG2
1 3 MEMBER NORMAL AFD:DATA2_2 DATA2_2 FG2
1 4 MEMBER NORMAL AFD:DATA3_1 DATA3_1 FG3
1 5 MEMBER NORMAL AFD:DATA3_2 DATA3_2 FG3
2 0 MEMBER NORMAL AFD:FRA1_1 FRA1_1 FG1
2 1 MEMBER NORMAL AFD:FRA1_2 FRA1_2 FG1
2 2 MEMBER NORMAL AFD:FRA2_1 FRA2_1 FG2
2 3 MEMBER NORMAL AFD:FRA2_2 FRA2_2 FG2
2 4 MEMBER NORMAL AFD:FRA3_1 FRA3_1 FG3
2 5 MEMBER NORMAL AFD:FRA3_2 FRA3_2 FG3
3 1 MEMBER NORMAL AFD:OCR1_1 OCR1_1 FG1
3 2 MEMBER NORMAL AFD:OCR2_1 OCR2_1 FG2
3 3 MEMBER NORMAL AFD:OCR2_2 OCR2_2 FG2
3 4 MEMBER NORMAL AFD:OCR3_1 OCR3_1 FG3
3 5 MEMBER NORMAL AFD:OCR3_2 OCR3_2 FG3
3 6 MEMBER NORMAL AFD:OCR1_2 OCR1_2 FG1
コメント