1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ADB-S のパッチ無影響テストを全自動化してみる⭕ (JPOUG TTN#15 発表資料)

Last updated at Posted at 2026-01-22

本記事は Japan Oracle User Group (JPOUG) の Tech Talk Night #15 で発表する際に使用する資料として作成しました。
通常の記事としては読みづらい・わかりづらい部分もあるかもしれませんが、ご容赦ください:bow:

Tech Talk Night #15 についてはこちら

はじめに

Oracle Autonomous AI Database Serverless (以降、ADB-S) は、オラクルにより週次でパッチが適用されます。
パッチ適用にかかるコストを節約できる反面、「悪い影響が出てしまうのではないか」という不安を抱く方が多いと思います。

この不安に対するソリューションとして、オラクルからは Real Application Testing (以降、RAT) の DB Replay と ADB-S の早期パッチを組み合わせて利用することが案内されていますが、これを毎度手動で行うのも手間なので、全自動化にトライしてみました。
実現方法や、トライした中での気付きなどをご説明・ご紹介します。

なお、TTN での発表に間に合うよう突貫で実現させたため (言い訳)、イケてない所多数あると思いますが、生暖かく見守っていただけると幸いです。

image.png

ADB-S のパッチ

本題へ入る前に、ADB-S のパッチと RAT について触れておきます。

前述の通り、ADB-S はオラクルにより週次でパッチが適用されます。
通常の OracleDB では一番早いサイクルでも月次の MRP (Monthly Recommended Patch) なので、大きな違いです。

また、利用者がパッチについて設定できるのは、パッチ適用方式を「定期 (Regular)」とするか「早期 (Early) 」とするかのみで、適用タイミングもオラクルに委ねることとなります。

↓ ADB-S の作成画面
image.png

↓ 定期 (Regular) と 早期 (Early) の違い

適用タイミングは ADB-S を作成後、OCIコンソールの「Autonomous AI Database 情報」から確認できます。

image.png

どういったロジックで適用タイミングが決まるか不明ですが、何度か ADB-S を作成した限りでは、適用タイミングは次の 3パターンでした。

  • 土曜 3:00~5:00 (JST: 12:00~14:00)
  • 土曜 9:00~11:00 (JST: 18:00~20:00)
  • 土曜 14:00~16:00 (JST: 23:00~25:00)

また、2025/11/25 に作成して利用し続けている ADB-S のパッチ履歴を確認すると、毎週必ずしもパッチ適用があるわけではないように見えます。

image.png

RAT

RAT は Oracle Database 11g から実装されているもので、DB を中心としたシステムの変更リスクを削減するための高品質テストオプションです。
RAT は、SQL Performance Analyzer (以降、SPA) と DB Replay の 2つの機能で構成されています。

SPA

SPA は、システム変更前後で SQL単位の比較を実施しレポートを生成します。多数の SQL を効率よくテストし、実行計画や性能の変化を確認することができます。

DB Replay

DB Replay は、本番環境などで実際のワークロードを取得し、取得したワークロードをテスト環境などでリプレイして比較レポートを生成します。こちらは SQL単位ではなく、DB全体の性能に与える影響を包括的に評価することができます。(今回使用するのはこちらです)

全自動化

さて、本題の全自動化です。試行錯誤し、最終的には下記のイメージで全自動化を実現しました。OpenDataDB が本番DBだと思ってください。
実運用を考えると、オラクルによるパッチ適用が土曜の場合、①②を月曜~金曜に、
③④を土曜~日曜にスケジュールすることとなりそうです。

なお、以降の説明の中では ①②を 3:00, 4:00 (JST: 12:00, 13:00) に、
③を 3:20, 4:20 (JST: 12:20, 13:20) に、④を 3:45, 4:45 (JST: 12:45, 13:45) にスケジュールしています。

image.png

①Workload Capture

本番DB (ここでは OpenDataDB) のワークロードを取得します。
ワークロード取得にはDBMS_CLOUD_ADMIN.START_WORKLOAD_CAPTUREを使用し、
スケジュール実行するよう Oracle Scheduler にジョブ登録 (DBMS_SCHEDULER.CREATE_JOB) しました。
ここでは期間 (duration) を10分に指定していますが、テスト品質の観点ではピーク時間帯や重要処理を含む指定が推奨です。

BEGIN
  DBMS_SCHEDULER.CREATE_JOB(
    job_name        => 'WLCAP_FOR_DBREPLAY',
    job_type        => 'PLSQL_BLOCK',
    job_action      => q'[
      DECLARE
        wlcap_name VARCHAR2(17);
      BEGIN
        wlcap_name := 'WLCAP' || TO_CHAR(SYSTIMESTAMP, 'yyyymmddhh24mi');
        DBMS_CLOUD_ADMIN.START_WORKLOAD_CAPTURE(
          capture_name => wlcap_name,
          duration     => 10
        );
      END;
    ]',
    start_date      => SYSTIMESTAMP, 
    repeat_interval => 'FREQ=WEEKLY; BYDAY=THU; BYHOUR=3,4; BYMINUTE=0; BYSECOND=0',
    enabled         => TRUE,
    auto_drop       => FALSE
  );
END;
/

DBMS_CLOUD_ADMIN.START_WORKLOAD_CAPTUREの詳細は下記をご参考

②Full Clone

①で取得したワークロードをリプレイする DB (ここでは CloneForReplay) を構築します。
適当な VMインスタンスに OCICLI をインストールし、OpenDataDB をソースとしてフルクローンを構築するシェル (oci_cre_clone.sh) を作成してスケジュール実行するよう cron に登録しました。
パッチ適用方式を早期パッチにするには、--maintenance-schedule-typeEARLYを指定します。

ワークロードをリプレイする環境のデータ断面は、ワークロードの取得を開始するタイミングと同一であることが望ましい為、①のスケジュールと同じ時刻を cron で設定します。

oci_cre_clone.sh
oci db autonomous-database create-from-clone --clone-type FULL --source-id ocid1.autonomousdatabase.oc1.ap-tokyo-1.xxx --compute-model ECPU --compute-count 2 --data-storage-size-in-tbs 1 --admin-password xxx --compartment-id ocid1.compartment.oc1..xxx --db-version 26ai --display-name clone_for_replay --db-name cloneforreplay --maintenance-schedule-type EARLY --query "data.id" --raw-output
cron
[opc@general-purpose ~]$ crontab -l
0 3,4 * * 4 ./oci_cre_clone.sh
[opc@general-purpose ~]$

create-from-cloneの詳細は下記をご参考

リフレッシュ可能クローンを使用しなかった理由

DB Replay と早期パッチの組み合わせに言及したオラクルのドキュメント等を見ていると、基本的にはフルクローンではなくリフレッシュ可能クローンを使用しています。
今回、なぜリフレッシュ可能クローンを使用しなかったかというと、リフレッシュ可能クローン上でワークロードをリプレイするにはソースDBからの切断という操作が必要ですが、切断コマンドを確認できなかった為です。(確認できたのは OCIコンソールからの操作のみ)

実運用を考えると、規模が小さければフルクローンでも問題ありませんが、規模が大きい・大きくなるDBではクローンに時間を要する可能性があるため、リフレッシュ可能クローンに分がありそうです。

試行錯誤した時には見つけられなかったWORKLOAD_AUTO_REPLAYを使うと、OCIコンソールからの操作不要で切断できそうなので、別途試してみようと思います。

③DB Replay

①で取得したワークロードを、②で構築した DB でリプレイします。

リプレイにはDBMS_CLOUD_ADMIN.REPLAY_WORKLOADを使用し、OpenDataDB の Oracle Scheduler にジョブ登録しました。
OpenDataDB の Oracle Scheduler にジョブ登録しておくことで、クローン先の CloneForReplay でも指定したスケジュールでジョブが実行されます。
OpenDataDB でリプレイが動かないよう、con_nameが 'CLONEFORREPLAY' と一致するか IF文でチェックしています。

BEGIN
  DBMS_SCHEDULER.CREATE_JOB(
    job_name        => 'DBREPLAY_FOR_EARLYPATCH',
    job_type        => 'PLSQL_BLOCK',
    job_action      => q'[
      DECLARE
        wlcap_name VARCHAR2(17);
      BEGIN
        select trim(name)
          into wlcap_name
          from dba_workload_captures
         order by start_time desc
         fetch first 1 rows only;
        IF sys_context('userenv','con_name') LIKE '%CLONEFORREPLAY' THEN
          DBMS_CLOUD_ADMIN.REPLAY_WORKLOAD(
            capture_name                => wlcap_name,
            replay_name                 => 'REPLAY_' || wlcap_name,
            capture_source_tenancy_ocid => 'ocid1.tenancy.oc1..xxx',
            capture_source_db_name      => 'OPENDATADB'
          );
        END IF;
      END;
    ]',
    start_date      => SYSTIMESTAMP, 
    repeat_interval => 'FREQ=WEEKLY; BYDAY=THU; BYHOUR=3,4; BYMINUTE=20; BYSECOND=0',
    enabled         => TRUE,
    auto_drop       => FALSE
  );
END;
/

DBMS_CLOUD_ADMIN.REPLAY_WORKLOADの詳細は下記をご参考

リプレイDB に直接ジョブ登録しなかった理由

ADB-S に接続するにはクレデンシャル・ウォレットのダウンロードが必要ですが、このコマンドを確認できなかったためです。(確認できたのは OCIコンソールからの DL のみ)

クレデンシャル・ウォレットの詳細は下記をご参考

後日、チーム内で共有したところコマンドを確認できました (Hさん, Kさんに感謝 :pray:)
https://docs.oracle.com/en-us/iaas/tools/oci-cli/latest/oci_cli_docs/cmdref/db/autonomous-database/generate-wallet.html

④Delete

次回のリプレイに備え、②で構築した DB を削除します。
CloneForReplay の OCID を特定して削除するシェル (oci_del_clone.sh) を作成してスケジュール実行するよう cron に登録しました。
--display-name の指定だけでは、過去に構築した同名DB も抽出されてしまい OCID を一意に特定できないため、--lifecycle-state も指定しています。

oci_del_clone.sh
autonomous_database_id=$(oci db autonomous-database list --compartment-id ocid1.compartment.oc1..xxx --display-name clone_for_replay --lifecycle-state AVAILABLE --query "data[0].id" --raw-output)
oci db autonomous-database delete --autonomous-database-id $autonomous_database_id --force
echo $autonomous_database_id
[opc@general-purpose ~]$ crontab -l
0 3,4 * * 4 ./oci_cre_clone.sh
45 3,4 * * 4 ./oci_del_clone.sh
[opc@general-purpose ~]$

listの詳細は下記をご参考

deleteの詳細は下記をご参考

その他

本セクション冒頭のイメージ図には記載していませんが、リプレイ完了後にレポートをメールで受け取れるよう、設定を行います。
下記リンク先の「1. トピックの作成」「2. イベント・ルールの作成」を実施します。
なお、本設定を行うと、リプレイ完了時に加え「キャプチャの開始・完了」「リプレイの開始」の際にもメールが届きます。

テスト稼働

稼働させてみると、下記の通りメールが届きました。

image.png

メール本文はそれぞれ下記の通りです。

キャプチャ開始 (13:00)
{
  "eventType" : "com.oraclecloud.databaseservice.autonomous.database.information",
  "cloudEventsVersion" : "0.1",
  "eventTypeVersion" : "2.0",
  "source" : "DatabaseService",
  "eventTime" : "2026-01-15T04:00:09Z",
  "contentType" : "application/json",
  "data" : {
    "compartmentId" : "ocid1.compartment.oc1..xxx",
    "compartmentName" : "handson",
    "resourceName" : "OPENDATADB",
    "resourceId" : "OCID1.AUTONOMOUSDATABASE.OC1.AP-TOKYO-1.xxx",
    "additionalDetails" : {
      "eventCategory" : "Incident",
      "eventName" : "WorkloadCaptureBegin",  
      "dbName" : "OPENDATADB",
      "description" : "The workload capture WLCAP202601150400 has begun in OPENDATADB.",
      "workloadType" : "Data Warehouse",
      "autonomousDataType" : "Serverless"
    }
  },
  "eventID" : "3691bf9f-3e1d-47db-9f07-1e64daabe07a",
  "extensions" : {
    "compartmentId" : "ocid1.compartment.oc1..xxx"
  }
}
キャプチャ完了 (13:18)
{
  "eventType" : "com.oraclecloud.databaseservice.autonomous.database.information",
  "cloudEventsVersion" : "0.1",
  "eventTypeVersion" : "2.0",
  "source" : "DatabaseService",
  "eventTime" : "2026-01-15T04:18:08Z",
  "contentType" : "application/json",
  "data" : {
    "compartmentId" : "ocid1.compartment.oc1..xxx",
    "compartmentName" : "handson",
    "resourceName" : "OPENDATADB",
    "resourceId" : "OCID1.AUTONOMOUSDATABASE.OC1.AP-TOKYO-1.xxx",
    "additionalDetails" : {
      "captureDownloadURL" : "https://objectstorage.ap-tokyo-1.oraclecloud.com/p/xxx/n/dwcsprod/b/adb_capture_replay/o/xxx/CAP_48609E12B08A/adb_capture_report.zip",
      "eventCategory" : "Incident",
      "eventName" : "WorkloadCaptureEnd",  
      "dbName" : "OPENDATADB",
      "description" : "The workload WLCAP202601150400 has been successfully captured in OPENDATADB. You can use the URL provided in captureDownloadURL field to download the capture reports. The URL will be valid for 7 days.",
      "workloadType" : "Data Warehouse",
      "autonomousDataType" : "Serverless"
    }
  },
  "eventID" : "c9554a7a-c8c3-4194-aa26-608c9b71b4af",
  "extensions" : {
    "compartmentId" : "ocid1.compartment.oc1..xxx"
  }
}
リプレイ開始 (13:20)
{
  "eventType" : "com.oraclecloud.databaseservice.autonomous.database.information",
  "cloudEventsVersion" : "0.1",
  "eventTypeVersion" : "2.0",
  "source" : "DatabaseService",
  "eventTime" : "2026-01-15T04:20:01Z",
  "contentType" : "application/json",
  "data" : {
    "compartmentId" : "ocid1.compartment.oc1..xxx",
    "compartmentName" : "handson",
    "resourceName" : "CLONEFORREPLAY",
    "resourceId" : "OCID1.AUTONOMOUSDATABASE.OC1.AP-TOKYO-1.xxx",
    "additionalDetails" : {
      "eventCategory" : "Incident",
      "eventName" : "WorkloadReplayBegin",  
      "dbName" : "CLONEFORREPLAY",
      "description" : "The workload replay has begun in REPLAY_WLCAP202601150400.",
      "workloadType" : "Data Warehouse",
      "autonomousDataType" : "Serverless"
    }
  },
  "eventID" : "c7cc85f1-cb58-48d3-aa5a-90f71cd9d9b8",
  "extensions" : {
    "compartmentId" : "ocid1.compartment.oc1..xxx"
  }
}
リプレイ完了 (13:33)
{
  "eventType" : "com.oraclecloud.databaseservice.autonomous.database.information",
  "cloudEventsVersion" : "0.1",
  "eventTypeVersion" : "2.0",
  "source" : "DatabaseService",
  "eventTime" : "2026-01-15T04:33:34Z",
  "contentType" : "application/json",
  "data" : {
    "compartmentId" : "ocid1.compartment.oc1..xxx",
    "compartmentName" : "handson",
    "resourceName" : "CLONEFORREPLAY",
    "resourceId" : "OCID1.AUTONOMOUSDATABASE.OC1.AP-TOKYO-1.xxx",
    "additionalDetails" : {
      "replayDownloadURL" : "https://objectstorage.ap-tokyo-1.oraclecloud.com/p/xxx/n/dwcsprod/b/adb_capture_replay/o/xxx/CAP_48609E12B08A/adb_replay_report.zip",  
      "eventCategory" : "Incident",
      "eventName" : "WorkloadReplayEnd",  
      "dbName" : "CLONEFORREPLAY",
      "description" : "The workload REPLAY_WLCAP202601150400 has been successfully replayed in CLONEFORREPLAY. You can use the URL provided in replayDownloadURL field to download the replay reports. The URL will be valid for 7 days.",
      "workloadType" : "Data Warehouse",
      "autonomousDataType" : "Serverless"
    }
  },
  "eventID" : "0710d2b7-b082-4640-b80d-26d063ebe762",
  "extensions" : {
    "compartmentId" : "ocid1.compartment.oc1..xxx"
  }
}

リプレイ完了メールのreplayDownloadURLに記載の URL にアクセスすると、zip で固められたレポートを DL できます。
目論見通り、OpenDataDB でキャプチャしたワークロードが、CloneForReplay でリプレイされていることがわかります。
Database Version は記載されていますが、ADB のバージョン (ADBS-xx.x.x.x) は記載されていないので、今後のアップデートに期待です :smiley:
今回は時間の関係で出来ませんでしたが、生成AI によるレポートの評価まで自動化することも、別途試してみようと思います。

image.png

以上、ADB-S のパッチ無影響テスト全自動化でした。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?