おさらい~DB Replayの手順概要~

こんにちは、まっつんです!
Oracle Real Application Testing を使ってみよう!その1
Oracle Real Application Testing を使ってみよう!その2
はいかがでしたか?

今回は実際にRATの機能のもう1つ、Database Replay (DB Replay) の手順を追っていきたいと思います。

これまでの2回分も是非ご覧ください!

その前に その1 にもお話ししたSPAの「主な手順概要」をおさらいしましょう。

主な手順概要

[DBR手順1] ワークロードのキャプチャ
– キャプチャした情報は、キャプチャファイルとしてファイルシステムに格納
[DBR手順2] キャプチャファイルのコピー
– コピーしたキャプチャファイルを、テスト環境側でリプレイ可能なフォーマットに変換
[DBR手順3] ワークロードのリプレイ
– コピー先環境でのワークロードの再現
[DBR手順4] リプレイが完了すると、各種レポートが生成される
– さまざまな観点でデータベース全体としてのパフォーマンス情報や負荷情報が比較して分析することができる

DB Replay では本番環境でキャプチャしたワークロードを、キャプチャファイル・リプレイファイルを介してテスト環境で再現していく流れとなります。

事前準備

今回も「本番環境」「テスト環境」の2つの環境を使用して検証していきたいと思います。

この検証ではどちらもCDB構成のデータベースを使用していますが、非CDBでも同様に実施可能です。
適宜読み替えていただければと思います。
また、「本番環境」「テスト環境」はともに論理構成は同じ(※)ものであることが前提です。
今回は検証用に、Oracle CloudOracle Base Database Service を使用しています。

※論理構成が同じとは、スキーマ・テーブル等構成・データが等しく、同じSQLで同じ結果が得られる環境という意味です。

今回のシナリオ

  • 保守期間終了に伴い本番環境のハードウェア更改を計画している。Oracle Databaseバージョンは 12c を 19c へバージョンアップする予定。
  • 現行環境では、CPU高騰やメモリ不足などが頻発するユーザーアクセス最頻時間帯があり、ハードウェア更新でどう改善するか確認しておきたい。
  • リソースとスケジュールの関係上、今回の検証には 19c のテスト環境(新ハード)だけ用意できており、検証はなるべくこの環境のみで完結させたい。

必要環境

  • Oracle Databaseインスタンス「本番環境」 … Oracle Database Enterprise Edition 12c (Oracle Base Database Service)を使用します。
  • Oracle Databaseインスタンス「テスト環境」 … Oracle Database Enterprise Edition 19c (Oracle Base Database Service)を使用します。
  • SQLの実行環境(SQL*PlusやSQL Developer)
  • 被検対象のスキーマ、SQL

[DBR手順1] ワークロードのキャプチャ

本番環境で、STS所有者として TCUSER という名前のユーザーを作成します。

conn / as sysdba
alter session set container=pdb1;
create user tcuser identified by tcuser;
grant connect, resource to tcuser;
alter user tcuser quota unlimited on users;

① キャプチャ前準備

キャプチャファイルが配置される先のディレクトリオブジェクトを作成します。
CDB環境の場合、ルートコンテナ(CDB$ROOT)で実行することに注意してください。

conn tcuser
create or replace directory cap_dir as '<任意のディレクトリ>';

② キャプチャ開始

キャプチャ前にキャプチャするワークロードをフィルタリングするフィルタ設定を行います。
ここでは TCUSER ユーザーでのワークロードに絞ったフィルタ設定をしています。

CDB$ROOTにSYSで接続して実行していることに注意ください。
ただし、Oracle Database 19c以降であれば、PDBに接続して実行することが可能になっています。

conn / as sysdba
begin
  DBMS_WORKLOAD_CAPTURE.ADD_FILTER(
    fname      => 'user_tcuser',    -- フィルタ名
    fattribute => 'USER',           -- フィルタを適用する必要がある属性
    fvalue     => 'TCUSER'          -- フィルタするユーザー名
  );
end;
/

以下のSQLでフィルタ設定がきちんとされたか確認できます。

col type for a10
col set_name for a10
col name for a20
col attribute for a10
col value for a10
select * from DBA_WORKLOAD_FILTERS;

TYPE               ID STATUS SET_NAME   NAME                 ATTRIBUTE  VALUE
---------- ---------- ------ ---------- -------------------- ---------- ----------
CAPTURE               NEW               USER_TCUSER          USER       TCUSER

キャプチャを開始します。
以降、指定された条件のワークロードがキャプチャされていきます
このキャプチャ実施前にはデータベース再起動しておくことが推奨されています

begin
  DBMS_WORKLOAD_CAPTURE.START_CAPTURE(
    name             => 'BASIC_CAPTURE1',   -- ワークロード名
    dir              => 'CAP_DIR',          -- ディレクトリオブジェクト名
    default_action   => 'EXCLUDE',          -- 
    capture_sts      => TRUE,               -- ワークロード取得と並行してSTS取得も開始
    sts_cap_interval => 10                  -- カーソル・キャッシュからのSQLセット取得の取得間隔(デフォルト300)
  );
end;
/

キャプチャが開始されると、上記でディレクトリオブジェクトに指定されたパスに以下のようなファイル・ディレクトリが作成されます。

ls -l <任意のディレクトリ>
合計 8
drwxr-xr-x 2 oracle asmadmin 4096  X月 XX XX:XX cap
drwxr-xr-x 3 oracle asmadmin 4096  X月 XX XX:XX capfiles
-rw-r--r-- 1 oracle asmadmin    0  X月 XX XX:XX wcr_cap_0000000000001.start

③ キャプチャ停止

キャプチャしたいワークロードが完了したら、以下のコマンドでキャプチャを停止します。
ここでは動作確認のため簡単なselect文やinsert文を数本実行後、キャプチャを停止しています。

begin
  DBMS_WORKLOAD_CAPTURE.FINISH_CAPTURE();
end;
/
ls -l <任意のディレクトリ>
合計 8
drwxr-xr-x 2 oracle asmadmin 4096  X月 XX XX:XX cap
drwxr-xr-x 3 oracle asmadmin 4096  X月 XX 15:XX capfiles

キャプチャを停止すると、wcr_cap_0000000000001.start というファイルは無くなっています

[DBR手順2] キャプチャファイルのコピー

④ キャプチャファイルのコピー

リプレイを別環境のデータベースサーバーで実行する場合は、
キャプチャディレクトリ以下のすべてのファイルを対象のデータベースサーバーへコピーします。
ここでは本番環境からテスト環境へ、ディレクトリオブジェクト cap_dir で指定されたディレクトリ配下をコピーしています。

特別な手順はないので、環境に合わせてコピーをしてください。

[DBR手順3] ワークロードのリプレイ

⑤ ワークロードの前処理

以降の作業はテスト環境にて実施します。
テスト環境で、本番環境と同様、コピーしてきたキャプチャディレクトリに対してディレクトリオブジェクトを設定します。

conn / as sysdba
create or replace directory cap_dir as '<任意のディレクトリ>';
begin
  DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE(
    capture_dir => 'CAP_DIR'    -- ディレクトリオブジェクト名
  );
end;
/
ls -l <任意のディレクトリ>
合計 12
drwxr-xr-x 2 oracle asmadmin 4096  X月 XX XX:XX cap
drwxr-xr-x 3 oracle asmadmin 4096  X月 XX XX:XX capfiles
drwxr-xr-x 3 oracle asmadmin 4096  X月 XX XX:XX pp19.16.0.0.0

⑥ (オプション)ワークロードの前処理後の作業

DB Replay を実行する本体は、$ORACLE_HOME/bin/wrc というコマンドで起動されるリプレイクライアントが実施します。
前処理として下記のコマンドを実行すると、取得済のワークロードのリプレイに必要なリプレイ・クライアントおよびホストの数を見積られます。
ここでは簡単なSQL群しかキャプチャしてなかったので「1個以上のリプレイクライアントを1個のCPUで実行」することが推奨されています。

wrc mode=calibrate replaydir=/home/oracle/capture

Workload Replay Client: Release 19.16.0.0.0 - Production on 火 X月 XX XX:XX:XX 2023

Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.

Report for Workload in: /home/oracle/capture
-----------------------

Recommendation:
Consider using at least 1 clients divided among 1 CPU(s)
You will need at least 3 MB of memory per client process.
If your machine(s) cannot match that number, consider using more clients.

Workload Characteristics:
- max concurrency: 1 sessions
- total number of sessions: 1

Assumptions:
- 1 client process per 100 concurrent sessions
- 4 client processes per CPU
- 256 KB of memory cache per concurrent session
- think time scale = 100
- connect time scale = 100
- synchronization = TRUE

⑦ リプレイ実施前準備

リプレイ実施前の処理を行っていきます。
キャプチャしたファイルと事前処理したファイル群が格納されているディレクトリを指定しリプレイを初期化します。

conn / as sysdba
begin
  DBMS_WORKLOAD_REPLAY.INITIALIZE_REPLAY(
    replay_name => 'BASIC_REPLAY1',
    replay_dir  => 'CAP_DIR'
  );
end;
/

ワークロードのリプレイをするにあたってユーザー・セッションが希望の方法でデータベースに接続できるように、取得された接続を新しい接続に再マップすることができます。
以下のクエリでキャプチャされた接続文字列が表示されます。
ここではテスト環境内の接続(HOST=dbsys19)である

conn / as sysdba
select * from dba_workload_connection_map;

 REPLAY_ID CONN_ID SCHEDULE_CAP_ID CAPTURE_CONN REPLAY_CONN
 ---------- ---------- --------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------- 
 1 1 (DESCRIPTION=(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=pdb1.subnet.vcn.oraclevcn.com)(CID=(PROGRAM=sqlplus)(HOST=dbsys19)(USER=oracle)))(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.0.134)(PORT=1521)(HOSTNAME=dbsys19)))

上記 CONN_ID=1 の接続に対し、接続文字列 “PDB1” を指定します。

begin
  DBMS_WORKLOAD_REPLAY.REMAP_CONNECTION(
    connection_id     => 1,
    replay_connection => 'pdb1'
  );
end;
/

リプレイ実行時のパラメータを設定します。

begin
  DBMS_WORKLOAD_REPLAY.PREPARE_REPLAY(
    synchronization         => TRUE,
    connect_time_scale      => 100,
    think_time_scale        => 100,
    think_time_auto_correct => TRUE,
    capture_sts             => FALSE
  );
end;
/

⑧ リプレイ実施

以下のコマンドでリプレイクライアントを起動します。
複数クライアントを起動する場合は(それぞれ別ターミナルで)複数起動します。
「Wait for the replay to start」と出力された後、待機状態となり表示はここで止まります(プロンプトは返ってきません)。

wrc system/<パスワード> mode=replay replaydir=/home/oracle/capture

Workload Replay Client: Release 19.16.0.0.0 - Production on 火 X月 XX XX:XX:XX 2023

Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.


Wait for the replay to start (15:41:11)

別ターミナルから以下のコマンドを実行しリプレイを開始します。

begin
  DBMS_WORKLOAD_REPLAY.START_REPLAY;
end;
/

リプレイ中の進捗状況は以下のコマンドで確認します。

conn / as sysdba
col name for a25
col status for a15
alter session set nls_date_format='YY-MM-DD HH24:MI:SS';
select id, name, start_time, status from dba_workload_replays;

        ID NAME                      START_TIME        STATUS
---------- ------------------------- ----------------- ---------------
         1 BASIC_REPLAY1             XX-XX-XX XX:XX:XX IN PROGRESS

リプレイが完了すると上記クエリ結果は、STATUS列が “COMPLETED” に変わります。

        ID NAME                      START_TIME        STATUS
---------- ------------------------- ----------------- ---------------
         1 BASIC_REPLAY1             23-01-10 06:42:52 COMPLETED

リプレイクライアント側の画面では以下のように表示され、プロンプトに返ります。

Wait for the replay to start (15:41:11)
Replay client 1 started (15:42:52)          <- START_REPLAY後に表示される
Replay client 1 finished (15:45:20)         <- COMPLETED後しばらくしてから表示される

ワークロード再現の結果、更新処理などを行っていた場合はちゃんと更新されているか確認してください。

⑨ リプレイのレポート作成

以下のコマンドで、直近のリプレイ結果のIDを確認します。

set echo on pages 50000 lin 200 long 10000000 trimspool off
col report for a140
select id, name, start_time, status from (
  select id, name, start_time, status, rank() over(order by start_time DESC) rank
  from dba_workload_replays
)
where rank=1;

        ID NAME                      START_TIME        STATUS
---------- ------------------------- ----------------- ---------------
         1 BASIC_REPLAY1             23-01-10 06:42:52 COMPLETED

上記で調べたIDを指定し、以下のコマンドを実行することで spool 先にレポートを出力します。

spool /home/oracle/dbreplay_basic.html
select dbms_workload_replay.report( &replayID, 'HTML') report from dual;
Enter value for replayid: 1 <- 上記の検索結果で確認したリプレイIDを入力

出力されたレポートは以下のような形式です。(実際にはもっと長いです)
レポートでは、キャプチャ時とリプレイ時の性能がどう変化したか、性能統計情報とともに非常に詳細に説明されています。
今回はあくまでサンプルSQLの実行のみで大がかりな負荷はかけていませんでしたので詳細は割愛します。

最後に

いかがでしたでしょうか。
ここでは動作確認のため非常に簡単なワークロードのリプレイを実行していますが大規模で複雑なトランザクション・セッションのワークロードほど本ツールは有効活用できるのではないでしょうか。

以上で全3回に渡る、Oracle Real Application Testing (RAT) の機能紹介を終わりたいと思います。
RATの概要・魅力について少しでも理解の一助としていただければ幸いです。

Oracle Real Application Testing を使ってみよう!その1
Oracle Real Application Testing を使ってみよう!その2
も是非ご覧下さいね!

投稿者プロフィール

まっつん
まっつん
株式会社システムサポート インフラソリューション事業部に在籍するPlatinumホルダー。アプリケーション開発からOracleコンサルまで幅広く経験。当サイトの一部ビジュアルデザインも担当。現在ダイエット中。