いつの頃からかASMディスクグループの種類に「フレックス」とかいう謎の冗長性属性が選択できるようになっている。
これはいったい何なんだ、ということで少しいじって遊んでみている。
参考:Oracle ASMフレックス・ディスク・グループの管理
先に感想を述べておくが、やむを得ない事情がない限りは利用すべきではないだろう。同じディスクグループ内に冗長度が違うファイルが混在するということは障害発生時の状況把握を困難なものにし、運用を著しく難しいものにすることは明らか。もちろん構成を完璧に把握している優秀なDBAが存在するのであればよいが、そうでない現場が多い中でこの機能を使うのはリスクが高い。
フレックスディスクグループとは何なのか
ざっくり言えば、一つのディスクグループの中でデータベース毎に別々の冗長性設定を行ったり、使用可能なディスク容量を制限したりできるようにした冗長性属性のこと。複数のデータベースをASMディスクグループ上に作成する際、データベース毎に別々の冗長性を持たせたいというようなケースで、データベース毎にディスクグループを作るのではなく単一のディスクグループで運用できるようになる。
普通のディスクグループとの違い
構成する要素として大きく違うのがファイルグループと割り当て制限グループの存在。冗長性の設定はファイルグループに対して行い、クォータ制限は割り当て制限グループに対して行う。
フレックスディスクグループを作成すると、デフォルトで「GENERIC」という割り当て制限グループに、「DEFAULT_FILEGROUP」というファイルグループが作成される。さらに、DBCAでフレックスディスクグループ上にデータベースを作成すると、データベース名と同じ名前のファイルグループが自動的に作成され、データファイルなどはすべてそのファイルグループに紐づけられることになる。
このあたりの関係性は、EMで確認するとビジュアル的にわかりやすい。以下はFLXというディスクグループに「TEST」という名前のデータベースを作成した際に作成されたファイルグループの情報を表示したもの。
![](https://chiritsumon.net/lab/wp-content/uploads/2024/06/flexdg_em1-1024x495.png)
デフォルトの「GENERIC」割り当て制限グループに、「TEST」というファイルグループがぶら下がっていて、そこにデータファイルや制御ファイルが紐づいていることがわかる。冗長性の設定はREDOログ、バックアップセット、制御ファイルといったくくりで個別に行うことも可能な様子。
ちなみに、このディスクグループは以下の通り5つの障害グループで構成されているが、何も考えずに作成すると制御ファイル以外は「ミラー」という冗長性が設定されており、標準冗長性相当になる模様。
![](https://chiritsumon.net/lab/wp-content/uploads/2024/06/flexdg_em2-1024x810.png)
ファイルグループや割り当て制限グループの情報は、asmcmdコマンドで以下のように確認することもできる。
[grid@physrac1 ~]$ asmcmd lsfg
File Group Disk Group Quota Group Used Quota MB Client Name Client Type
DEFAULT_FILEGROUP FLX GENERIC 0
TEST FLX GENERIC 7336 TEST DATABASE
[grid@physrac1 ~]$ asmcmd lsqg
Group_Num Quotagroup_Num Quotagroup_Name Incarnation Used_Quota_MB Quota_Limit_MB
4 1 GENERIC 1 7336 0
また、v$asm_filegroup_property からファイルタイプごとの冗長性の設定などが確認可能。
SQL> set lin 1000
SQL> set pages 1000
SQL> col name for a20
SQL> col client_name for a10
SQL> col file_type for a30
SQL> col value for a20
SQL> select af.name, af.client_name, file_type, afp.name, value
2 from v$asm_filegroup_property afp inner join v$asm_filegroup af
3 on afp.group_number = af.group_number and afp.filegroup_number = af.filegroup_number
4 where af.name='TEST' and afp.name='REDUNDANCY'
5 order by afp.group_number, afp.filegroup_number;
NAME CLIENT_NAM FILE_TYPE NAME VALUE
-------------------- ---------- ------------------------------ -------------------- --------------------
TEST TEST CONTROLFILE REDUNDANCY HIGH
TEST TEST CONTAINER REDUNDANCY MIRROR
TEST TEST KEY_STORE REDUNDANCY MIRROR
TEST TEST INCR XTRANSPORT BACKUPSET REDUNDANCY MIRROR
TEST TEST AUDIT_SPILLFILES REDUNDANCY MIRROR
TEST TEST XTRANSPORT BACKUPSET REDUNDANCY MIRROR
TEST TEST FLASHFILE REDUNDANCY MIRROR
TEST TEST OCRBACKUP REDUNDANCY MIRROR
TEST TEST ASMVDRL REDUNDANCY MIRROR
TEST TEST ASMVOL REDUNDANCY MIRROR
TEST TEST OCRFILE REDUNDANCY MIRROR
TEST TEST VOTINGFILE REDUNDANCY MIRROR
TEST TEST AUTOBACKUP REDUNDANCY MIRROR
TEST TEST DUMPSET REDUNDANCY MIRROR
TEST TEST FLASHBACK REDUNDANCY MIRROR
TEST TEST CHANGETRACKING REDUNDANCY MIRROR
TEST TEST DATAGUARDCONFIG REDUNDANCY MIRROR
TEST TEST PARAMETERFILE REDUNDANCY MIRROR
TEST TEST BACKUPSET REDUNDANCY MIRROR
TEST TEST TEMPFILE REDUNDANCY MIRROR
TEST TEST ARCHIVELOG REDUNDANCY MIRROR
TEST TEST ONLINELOG REDUNDANCY MIRROR
TEST TEST DATAFILE REDUNDANCY MIRROR
TEST TEST AUTOLOGIN_KEY_STORE REDUNDANCY MIRROR
24 rows selected.
冗長性の変更
ファイルグループ全体の冗長性を変更する場合はASMインスタンスに接続して以下のように行える。
SQL> ALTER DISKGROUP FLX MODIFY FILEGROUP TEST SET 'REDUNDANCY' = 'HIGH';
Diskgroup altered.
SQL> select af.name, af.client_name, file_type, afp.name, value
2 from v$asm_filegroup_property afp inner join v$asm_filegroup af
3 on afp.group_number = af.group_number and afp.filegroup_number = af.filegroup_number
4 where af.name='TEST' and afp.name='REDUNDANCY'
5 order by afp.group_number, afp.filegroup_number;
NAME CLIENT_NAM FILE_TYPE NAME VALUE
-------------------- ---------- ------------------------------ -------------------- --------------------
TEST TEST CONTROLFILE REDUNDANCY HIGH
TEST TEST CONTAINER REDUNDANCY HIGH
TEST TEST KEY_STORE REDUNDANCY HIGH
TEST TEST INCR XTRANSPORT BACKUPSET REDUNDANCY HIGH
TEST TEST AUDIT_SPILLFILES REDUNDANCY HIGH
TEST TEST XTRANSPORT BACKUPSET REDUNDANCY HIGH
TEST TEST FLASHFILE REDUNDANCY HIGH
TEST TEST OCRBACKUP REDUNDANCY HIGH
TEST TEST ASMVDRL REDUNDANCY HIGH
TEST TEST ASMVOL REDUNDANCY HIGH
TEST TEST OCRFILE REDUNDANCY HIGH
TEST TEST VOTINGFILE REDUNDANCY HIGH
TEST TEST AUTOBACKUP REDUNDANCY HIGH
TEST TEST DUMPSET REDUNDANCY HIGH
TEST TEST FLASHBACK REDUNDANCY HIGH
TEST TEST CHANGETRACKING REDUNDANCY HIGH
TEST TEST DATAGUARDCONFIG REDUNDANCY HIGH
TEST TEST PARAMETERFILE REDUNDANCY HIGH
TEST TEST BACKUPSET REDUNDANCY HIGH
TEST TEST TEMPFILE REDUNDANCY HIGH
TEST TEST ARCHIVELOG REDUNDANCY HIGH
TEST TEST ONLINELOG REDUNDANCY HIGH
TEST TEST DATAFILE REDUNDANCY HIGH
TEST TEST AUTOLOGIN_KEY_STORE REDUNDANCY HIGH
24 rows selected.
属性変更後は自動的にリバランスが走り、物理的にも冗長度を変える動きが発生していることがわかる。
SQL> select * from v$asm_operation;
GROUP_NUMBER OPERATION PASS STATE POWER ACTUAL SOFAR EST_WORK EST_RATE EST_MINUTES ERROR_CODE CON_ID
------------ --------------- --------------------------- ------------ ---------- ---------- ---------- ---------- ---------- ----------- ---------- ----------
4 REBAL COMPACT WAIT 1 1 0 0 0 0 0
4 REBAL PREPARE WAIT 1 0
4 REBAL REBALANCE RUN 1 1 534 951 8748 0 0
4 REBAL REBUILD DONE 1 1 0 0 0 0 0
4 REBAL RESYNC DONE 1 1 0 0 0 0 0
事前にファイルグループを作る
データベース作成時に自動的にデータベース名と同じ名前でファイルグループが作られるが、事前に冗長性設定などを実施済みのファイルグループを作ることも可能。クライアント名にデータベース名を指定すればよい。
例えば、「TEST」という名前のデータベース用に「HIGH_FG」という名前のファイルグループを作り、冗長性を変更する設定も併せて行うなら以下のようになる。
SQL> ALTER DISKGROUP FLX ADD FILEGROUP HIGH_FG DATABASE TEST;
SQL> ALTER DISKGROUP FLX MODIFY FILEGROUP HIGH_FG SET 'REDUNDANCY'='HIGH';
この後、DBCAでデータベースを対象のフレックスディスクグループ上に作成すると、自動的に「HIGH_FG」というファイルグループにデータファイルなどが紐づく。
コメント