Oracle DatabaseのRACには Dynamic Resource Mastering (DRM) という機能があります。
Oracle Databaseではデータアクセスする際に該当データをバッファキャッシュ上にキャッシュします。
RACでは複数あるノードのどれか1つにキャッシュされますが、そのキャッシュ先ノードを動的に変更できるのがDRMです。
DRMを使うことで、より対象データにアクセスする頻度が高いノードにキャッシュを移せますので、データ取得の効率が向上します。
英語になりますが詳しくは下記MOSドキュメントを参照ください。
DRM - Dynamic Resource management (Doc ID 390483.1)
ちなみにDRMという略語は Dynamic Re-mastering という機能の略称でも使われていますが、こちらは別物ですのでご注意ください。
Dynamic Re-masteringについては下記がご参考になります。
https://blogs.oracle.com/otnjp/post/tsushima-hakushi-79
とあるきっかけで前者のDRMの動作確認をする機会がありましたので、その際のコマンドとログを残しておきます。
環境概要
動作確認した環境の概要は以下の通りです。
- OS: Oracle Linux 7.9
- DBバージョン: 19c (19.3)
- DB構成: 2ノードRAC(CDB構成)
確認手順
適当な一般のDBユーザでPDBにログインし、テーブルを作成します。
ノードはどちらでも大丈夫です。
create table test_easy(col1 number, col2 number, col3 varchar2(20));
begin
for i in 1..10000 loop
insert into test_easy values(i, mod(i,5), 'dummy');
end loop;
end;
/
作成したテーブルのオブジェクトIDを確認し、メモしておきます。
select object_id, owner, object_type from dba_objects where object_name='TEST_EASY' and object_type='TABLE';
sysでPDBにログインし、GV$GCSPFMASTER_INFO に問合せてDRMの実行状況を確認します。
この段階では結果は特に何も返ってきません。
select * from GV$GCSPFMASTER_INFO where DATA_OBJECT_ID=<メモしたオブジェクトID>;
ノード2に接続後、sysでPDBにログインして手動でDRMを実行します。
これでノード2がテーブル「test_easy」のキャッシュにおけるマスターとなります。
oradebug setmypid
oradebug lkdebug -m pkey <メモしたオブジェクトID> 1
再度 GV$GCSPFMASTER_INFO に問合せると以下のように返ってきます。
テーブル「test_easy」のキャッシュについて、マスターがノード2上のインスタンスになっていると分かります。
select * from GV$GCSPFMASTER_INFO where DATA_OBJECT_ID=<メモしたオブジェクトID>;
INST_ID FILE_ID DATA_OBJECT_ID GC_MASTERING_PO CURRENT_MASTER PREVIOUS_MASTER REMASTER_CNT ...
---------- ---------- -------------- --------------- -------------- --------------- ------------
1 0 <object id> Affinity 2 32767 1
ちなみに「PREVIOUS_MASTER」のカラムには今の状態になる直前までマスターだったインスタンスの番号が通常入ります。
ですが対象オブジェクトに対して初めてDRMが実行された場合は、上記のように PREVIOUS_MASTER に「32767」が入るようです。
ここまでDRMの動作状況を GV$GCSPFMASTER_INFO で確認して来ましたが、LMDのトレースファイルからも確認できます。
LMDのトレースファイルでは以下のように表記されます。
---ノード1の場合---
* received DRM start msg from 2 (cnt 1, last 1, rmno 2)
* (domid 1, numhv 0, addhv 0)
Rcvd DRM(2) AFFINITY Transfer pkey 1.4.4294967295 to 2 objscan 1
...(略)...
End DRM(2) for pkey transfer request(s) from 2
---ノード2の場合---
Begin DRM(2) (active 0)(swin 1) - AFFINITY transfer pkey 1.4.4294967295 to 2 objscan 1 req 0x90599fb0
...(略)...
* End DRM for pkey remastering request(s) (locally requested)
以上、簡単ですがDRMの手動実行による動作確認でした。