ASMCAで作ったディスクグループで高速ミラー再同期が動かないという罠

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

コメント