- Oracle Cloud
- Oracle Database
- AWS
オラクルユーザー必見!Oracle AI Database@AWSとは?サービス概要とメリットを解説
OCIのOracle AI DatabaseをAWSから利用できる「Oracle AI Database@AWS」について、サービス概要と導入メリットをわかりやすく解説します。マルチクラウド環境でのオラクル活用に関心のある方は、ぜひご活用ください。
|
|
数年前からコンバージド・データベースの思想を掲げてきたOracle Databaseは、Oracle AI Database 26aiにおいて、いよいよAIネイティブなデータベースとしての色合いを強めています。
AIベクトル検索や生成AIとの連携によって、データベースは単にデータを格納・検索する基盤に留まらず、AIと連携しながら業務活用を支える実行基盤へと進化しつつあります。
その中でも注目したいのが、データベース内にAI Agentを構築できる『Select AI Agent』フレームワークです。
本記事では、このSelect AI Agentを題材に、Oracle AI Databaseが従来のRDBMSにとどまらず、生成AI活用の基盤としてどのように拡張されているのかを確認します。
今回は、オンプレミス環境のOracle AI DatabaseにDBMS_CLOUDパッケージファミリを導入し、Select AI Agentの実装と動作を検証した結果をもとに、その広がりを見ていきます。
なお、本記事は、導入から検証、実運用としての考察、まとめの順に説明していきます。
導入から検証の部分がやや長くなっていますので、Select AI Agentの意義や有用性から知りたい方は、「『Select AI Agent』を運用に組み込むには」章を先にお読みいただくのも有益です。
Index
『Select AI Agent』フレームワークは、自律型エージェント(AI Agent)を作成および管理するための仕組みです。
当初はOracle Cloud Infrastructure(以下、OCI)上のデータベースサービスである自律型データベース『Autonomous AI Database』向けに提供されていました。
Select AI Agentは、ユーザーのリクエストに対してLLMと連携した推論や、事前定義したツールを利用し、ReAct(Reasoning and Acting)型エージェントとして自律的に課題やタスクの解決を試みます。
事前定義できるツールは、RAG(Retrieval-Augmented Generation)やNL2SQL(Natural Language to SQL)などのAI技術はもちろん、ユーザーが作成したPL/SQLプロシージャやファンクション、外部REST APIなどさまざまで、課題解決に向けた柔軟な設計が期待できます。
Select AI Agentで構築するAI Agentは、DBMS_CLOUD_AI_AGENTパッケージで構築、管理します。
本記事では、このパッケージをオンプレミス環境のOracle AI Databaseへ導入し、AI Agentの管理やオーケストレーターとしての振る舞いも見ていきます。
DBMS_CLOUD_AI_AGENTパッケージを利用して、次のようにSelect AI Agentを実装し稼働させます。
| プロシージャ | 役割 |
| DBMS_CLOUD_AI_AGENT.CREATE_AGENT | Select AI Agentフレームワークに新しいAI Agentを登録します。 エージェントの役割や使用するAIプロファイルなどを定義します。 |
| DBMS_CLOUD_AI_AGENT.CREATE_TOOL | AI Agentがタスク実行中に使用するツールを登録します。 PL/SQLを使用するカスタムツールに加え、SQL、RAG、Web検索、通知(Email/Slack)の組み込みツールも登録できます。 |
| DBMS_CLOUD_AI_AGENT.CREATE_TASK | AI Agentが推論プロセスに含めることができるタスクを定義します。 タスクの指示内容や、実行時に使用できるツール、他タスクからの入力を定義します。 |
| DBMS_CLOUD_AI_AGENT.CREATE_TEAM | タスクを実行するために連携するAI Agentのチームを作成します。 どのエージェントにどのタスクを割り当てるかと、処理順序を定義します。 |
以下、Select AI Agentはフレームワークを、AI Agentはその上で構築される個々のエージェントを指します。
本検証では、AI Agentにアラートログを参照させ、クリティカルなエントリがある場合にDBAへ推奨事項を提示できるかを確認します。
アラートログの内容をLLMに解釈させるだけでは、生成される推奨事項の正確性に欠ける可能性が高いです。
そのため、今回はGitHubにMITライセンスで公開されているOracle DB SkillsというMarkdown集を参照元として回答を生成するよう、タスクを構成しました。
Oracle DB Skillsは、データベースの運用管理やアーキテクチャ、ベストプラクティスなど、Oracle AI Databaseに関する100以上の実践的なリファレンス・ガイドがまとめられたリポジトリです。
ライセンス条件および著作権表示の詳細は、リポジトリ内の記載をご参照ください。
リポジトリ:GitHub - engchina/oracle-db-skills-ja
(外部サイトに移動します)
ライセンス:LICENSE
(外部サイトに移動します)
著作権表示:Copyright (c) 2026 Kris Rice
リポジトリ内の説明や構成を見る限り、本来このリポジトリは各種AIエージェント向けスキル集としての利用が想定された内容と見受けられます。
本検証では、それをSelect AI Agent向けのナレッジソースとして応用しました。
また、単にツールやナレッジを用意してタスクを実行できるかだけでなく、エージェントがその実行結果をどう解釈し、どの時点でゴールに到達したと見なすか、という点も重要なポイントとしてあわせて見ていきます。
オンプレミス環境のOracle AI Databaseには、標準でDBMS_CLOUDパッケージファミリがインストールされていません。
従って、今回の検証の中核であるDBMS_CLOUD_AI_AGENTもデフォルトでは存在しません。
そのため、次のマニュアルを参考にパッケージを追加インストールしました。
Oracle AI Database 『データベース・ユーティリティ』 26ai(オラクル社のサイトに移動します)
20 DBMS_CLOUDパッケージ・ファミリ
検証で利用するKNAKAGAKIユーザーを作成し、必要な権限を付与します。
DBMS_CLOUDパッケージの実行権限の他、アラートログを参照するためにV$DIAG_ALERT_EXTビューの参照権限も付与しています。
SQL> conn sys/oracle@orcl_pdb as sysdba
接続されました。
SQL> grant CONNECT, RESOURCE, UNLIMITED TABLESPACE to KNAKAGAKI identified by pass;
権限付与が成功しました。
SQL> grant EXECUTE on DBMS_CLOUD to KNAKAGAKI;
権限付与が成功しました。
SQL> grant EXECUTE on DBMS_CLOUD_AI to KNAKAGAKI;
権限付与が成功しました。
SQL> grant EXECUTE on DBMS_CLOUD_AI_AGENT to KNAKAGAKI;
権限付与が成功しました。
--アラートログのフェッチをするために以下オブジェクト権限も与えます
SQL> grant SELECT on V_$DIAG_ALERT_EXT to KNAKAGAKI;
権限付与が成功しました。
DBMS_CLOUDパッケージファミリは、共通ユーザC##CLOUD$SERVICEが所有します。
そのC##CLOUD$SERVICEを以下の手順で作成しています。
[oracle@Lin97 ~]$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl \ > -u sys/oracle \ > -force_pdb_mode 'READ WRITE' \ > -b dbms_cloud_install \ > -d $ORACLE_HOME/rdbms/admin/ \ > -l $HOME/tmp \ > catclouduser.sql
続いて、上の手順で作ったスキーマにDBMS_CLOUDパッケージファミリをインストールします。
[oracle@Lin97 ~]$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl \ > -u sys/oracle \ > -force_pdb_mode 'READ WRITE' \ > -b dbms_cloud_install \ > -d $ORACLE_HOME/rdbms/admin/ \ > -l $HOME/tmp \ > dbms_cloud_install.sql
上記2つのスクリプトの実行後、CDB$ROOTに接続し、各コンテナに「DBMS_CLOUD」から始まるオブジェクトが作成されていることを確認してください。
SQL> conn / as sysdba 接続されました。 SQL> select CON_ID,count(*) from CDB_OBJECTS 2 where OBJECT_NAME like 'DBMS_CLOUD%' 3 group by CON_ID order by 1; CON_ID COUNT(*) ---------- ---------- 1 72 3 72
DBMS_CLOUDパッケージファミリを使用してデータベースサーバー外部へ通信するためには、オラクル社の提供する証明書を含むSSL Wallet(SSL/TLS通信用)をあらかじめ作成する必要があります。
証明書は次のOCIオブジェクト・ストレージに配置されていますので、適切な方法でダウンロードし、ウォレットへインポートしてください。
https://objectstorage.us-phoenix-1.oraclecloud.com/p/KB63IAuDCGhz_azOVQ07Qa_mxL3bGrFh1dtsltreRJPbmb-VwsH2aQ4Pur2ADBMA/n/adwcdemo/b/CERTS/o/dbc_certs.tar
任意の方法でオブジェクト・ストレージからdbc_certs.tarをダウンロードします。
[oracle@Lin97 ~]$ wget -P $HOME/dbc/ https://objectstorage.us-phoenix-1.oraclecloud.com/p/KB63IAuDCGhz_azOVQ07Qa_mxL3bGrFh1dtsltreRJPbmb-VwsH2aQ4Pur2ADBMA/n/adwcdemo/b/CERTS/o/dbc_certs.tar
ダウンロードしたtarを展開します。
[oracle@Lin97 ~]$ tar -xvf ~/dbc/dbc_certs.tar -C ~/dbc
orapkiコマンドにて、Walletを作成します。
ウォレットのディレクトリは任意の配置先で問題ありませんが、管理性を意識した配置とする方が良いでしょう。
[oracle@Lin97 ~]$ mkdir -p /u01/app/oracle/admin/orcl/dbms_cloud_ssl
[oracle@Lin97 ~]$ orapki wallet create -wallet $ORACLE_BASE/admin/orcl/dbms_cloud_ssl -pwd xxxxxxxxxx -auto_login
Oracle PKI Tool Release 23.26.2.0.0DBRU - Production
23.26.2.0.0DBRU: バージョン{1}
Copyright (c) 2004, 2026, Oracle and/or its affiliates. All rights reserved.
Warning: For security reasons, passwords must have at least 16 characters.
操作は正常に完了しました。
前の手順で作成したウォレットへ、ダウンロードした証明書群をインポートしていきます。
2-2.の作業では、多数の証明書が展開されるため、次のようなループでインポートすると効率的です。
[oracle@Lin97 ~]$ for i in $(ls ~/dbc/*cer)
> do
> orapki wallet add -wallet $ORACLE_BASE/admin/orcl/dbms_cloud_ssl -trusted_cert -cert $i -pwd xxxxxxxxxx
> done
Oracle PKI Tool Release 23.26.2.0.0DBRU - Production
23.26.2.0.0DBRU: バージョン{1}
Copyright (c) 2004, 2026, Oracle and/or its affiliates. All rights reserved.
操作は正常に完了しました。
・・・省略・・・
Oracle PKI Tool Release 23.26.2.0.0DBRU - Production
23.26.2.0.0DBRU: バージョン{1}
Copyright (c) 2004, 2026, Oracle and/or its affiliates. All rights reserved.
操作は正常に完了しました。
orapkiコマンドにて、証明書が格納されたことを確認してください。
[oracle@Lin97 ~]$ orapki wallet display -wallet $ORACLE_BASE/admin/orcl/dbms_cloud_ssl
Oracle PKI Tool Release 23.26.2.0.0DBRU - Production
23.26.2.0.0DBRU: バージョン{1}
Copyright (c) 2004, 2026, Oracle and/or its affiliates. All rights reserved.
Requested Certificates:
User Certificates:
Trusted Certificates:
Subject: OU=ePKI Root Certification Authority,O=Chunghwa Telecom Co.\, Ltd.,C=TW
Subject: CN=Certum CA,O=Unizeto Sp. z o.o.,C=PL
Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány,OU=Tanúsítványkiadók (Certification Services),O=NetLock Kft.,L=Budapest,C=HU
Subject: CN=UTN-USERFirst-Client Authentication and Email,OU=http://www.usertrust.com,O=The USERTRUST Network,L=Salt Lake City,ST=UT,C=US
・・・省略・・・
DBMS_CLOUDは内部でUTL_HTTPを利用したRESTコールを発行するため、データベースから外部通信を許可するためのACEを構成する必要があります。
次のマニュアルに、セットアップのためのテンプレートスクリプトが公開されています。
こちらを参考に環境依存の変数値をお使いの環境値に書き換えたうえでご利用ください。
Oracle AI Database 『データベース・ユーティリティ』 26ai(オラクル社のサイトに移動します)
20.4 DBMS_CLOUDの場合のACEを使用したデータベースの構成
20.5 DBMS_CLOUDの構成の確認
20.6.2 DBMS_CLOUDを使用するためのユーザーまたはロールに対するACEの構成
20.6.3 DBMS_CLOUDを使用するためのユーザーおよびロールの設定の確認
C##CLOUD$SERVICEのACEを構成するためのSQLスクリプトを作成します。
[oracle@Lin97 ~]$ vi ~/dbc/dbc_aces.sql
@$ORACLE_HOME/rdbms/admin/sqlsessstart.sql
-- you must not change the owner of the functionality to avoid future issues
define clouduser=C##CLOUD$SERVICE
-- CUSTOMER SPECIFIC SETUP, NEEDS TO BE PROVIDED BY THE CUSTOMER-- - SSL Wallet directory
define sslwalletdir=/u01/app/oracle/admin/orcl/dbms_cloud_ssl
---- UNCOMMENT AND SET THE PROXY SETTINGS VARIABLES IF YOUR ENVIRONMENT NEEDS PROXYS--
define proxy_uri=http://xxx.xxx.xxx.xxx:xx
define proxy_host=xxx.xxx.xxx.xxx
define proxy_low_port=xx
define proxy_high_port=xx
-- Create New ACL / ACE s
begin
-- Allow all hosts for HTTP/HTTP_PROXY
dbms_network_acl_admin.append_host_ace(
host =>'*',
lower_port => 443,
upper_port => 443,
ace => xs$ace_type(
privilege_list => xs$name_list('http', 'http_proxy'),
principal_name => upper('&clouduser'),
principal_type => xs_acl.ptype_db
)
);
--
-- UNCOMMENT THE PROXY SETTINGS SECTION IF YOUR ENVIRONMENT NEEDS PROXYS
--
-- Allow Proxy for HTTP/HTTP_PROXY
dbms_network_acl_admin.append_host_ace(
host =>'&proxy_host',
lower_port => &proxy_low_port,
upper_port => &proxy_high_port,
ace => xs$ace_type(
privilege_list => xs$name_list('http', 'http_proxy'),
principal_name => upper('&clouduser'),
principal_type => xs_acl.ptype_db));
--
-- END PROXY SECTION
--
-- Allow wallet access
dbms_network_acl_admin.append_wallet_ace(
wallet_path => 'file:&sslwalletdir',
ace => xs$ace_type(
privilege_list =>xs$name_list('use_client_certificates', 'use_passwords'),
principal_name => upper('&clouduser'),
principal_type => xs_acl.ptype_db));
end;
/
-- Setting SSL_WALLET database property
begin
if sys_context('userenv', 'con_name') = 'CDB$ROOT' then
execute immediate 'alter database property set ssl_wallet=''&sslwalletdir''';
--
-- UNCOMMENT THE FOLLOWING COMMAND IF YOU ARE USING A PROXY
--
execute immediate 'alter database property set http_proxy=''&proxy_uri''';
end if;
end;
/
@$ORACLE_HOME/rdbms/admin/sqlsessend.sql
このスクリプト(dbc_aces.sql)を、CDB$ROOTにSYSユーザーで接続のうえ実行してください。
SQL> conn / as sysdba
接続されました。
SQL> @@$HOME/dbc/dbc_aces.sql
セッションが変更されました。
旧 9: principal_name => upper('&clouduser'),
新 9: principal_name => upper('C##CLOUD$SERVICE'),
旧 18: host =>'&proxy_host',
新 18: host =>'xxx.xxx.xxx.xxx',
旧 19: lower_port => &proxy_low_port,
新 19: lower_port => xx,
旧 20: upper_port => &proxy_high_port,
新 20: upper_port => xx,
旧 23: principal_name => upper('&clouduser'),
新 23: principal_name => upper('C##CLOUD$SERVICE'),
旧 31: wallet_path => 'file:&sslwalletdir',
新 31: wallet_path => 'file:/u01/app/oracle/admin/orcl/dbms_cloud_ssl',
旧 34: principal_name => upper('&clouduser'),
新 34: principal_name => upper('C##CLOUD$SERVICE'),
PL/SQLプロシージャが正常に完了しました。
旧 3: execute immediate 'alter database property set ssl_wallet=''&sslwalletdir''';
新 3: execute immediate 'alter database property set ssl_wallet=''/u01/app/oracle/admin/orcl/dbms_cloud_ssl''';
旧 7: execute immediate 'alter database property set http_proxy=''&proxy_uri''';
新 7: execute immediate 'alter database property set http_proxy=''http://xxx.xxx.xxx.xxx:xx''';
PL/SQLプロシージャが正常に完了しました。
セッションが変更されました。
次に、前の手順で正しくC##CLOUD$SERVICEのACEが構成されたかを検証するスクリプトを作成します。
[oracle@Lin97 ~]$ vi ~/dbc/dbc_check.sql
define clouduser=C##CLOUD$SERVICE
-- CUSTOMER SPECIFIC SETUP, NEEDS TO BE PROVIDED BY THE CUSTOMER
-- - SSL Wallet directory and password
define sslwalletdir=/u01/app/oracle/admin/orcl/dbms_cloud_ssl
define sslwalletpwd=xxxxxxxxxx
-- In environments w/ a proxy, you need to set the proxy in the verification code
define proxy_uri=http://xxx.xxx.xxx.xxx:xx
-- create and run this procedure as owner of the ACLs, which is the future owner
-- of DBMS_CLOUD
CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2) AS
request_context UTL_HTTP.REQUEST_CONTEXT_KEY;
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
data VARCHAR2(32767) default null;
err_num NUMBER default 0;
err_msg VARCHAR2(4000) default null;
BEGIN
-- Create a request context with its wallet and cookie table
request_context := UTL_HTTP.CREATE_REQUEST_CONTEXT(
wallet_path => 'file:&sslwalletdir',
wallet_password => '&sslwalletpwd');
-- Make a HTTP request using the private wallet and cookie
-- table in the request context
-- uncomment if proxy is required
UTL_HTTP.SET_PROXY('&proxy_uri', NULL);
req := UTL_HTTP.BEGIN_REQUEST(url => url,request_context => request_context);
resp := UTL_HTTP.GET_RESPONSE(req);
DBMS_OUTPUT.PUT_LINE('valid response');
EXCEPTION
WHEN OTHERS THEN
err_num := SQLCODE;
err_msg := SUBSTR(SQLERRM, 1, 3800);
DBMS_OUTPUT.PUT_LINE('possibly raised PLSQL/SQL error: ' ||err_num||' - '||err_msg);
UTL_HTTP.END_RESPONSE(resp);
data := UTL_HTTP.GET_DETAILED_SQLERRM ;
IF data IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE('possibly raised HTML error: ' ||data);
END IF;
END;
/
set serveroutput on
BEGIN
&clouduser..GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
END;
/
set serveroutput off
drop procedure &clouduser..GET_PAGE;
ACEの構成時と同様に、CDB$ROOTへSYSユーザーで接続のうえスクリプト(dbc_check.sql)を実行します。
スクリプト内では、事前に準備したWalletを利用してOCIオブジェクト・ストレージへHTTPSリクエストを投げる処理が記述されており、「valid response」と返れば正しく構成されていると判断できます。
SQL> conn / as sysdba
接続されました。
SQL> @@$HOME/dbc/dbc_check.sql
旧 1: CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2) AS
新 1: CREATE OR REPLACE PROCEDURE C##CLOUD$SERVICE.GET_PAGE(url IN VARCHAR2) AS
旧 13: wallet_path => 'file:&sslwalletdir',
新 13: wallet_path => 'file:/u01/app/oracle/admin/orcl/dbms_cloud_ssl',
旧 14: wallet_password => '&sslwalletpwd');
新 14: wallet_password => 'xxxxxxxxxx');
旧 20: UTL_HTTP.SET_PROXY('&proxy_uri', NULL);
新 20: UTL_HTTP.SET_PROXY('http://xxx.xxx.xxx.xxx:xx', NULL);
プロシージャが作成されました。
旧 2: &clouduser..GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
新 2: C##CLOUD$SERVICE.GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
valid response
PL/SQLプロシージャが正常に完了しました。
旧 1: drop procedure &clouduser..GET_PAGE
新 1: drop procedure C##CLOUD$SERVICE.GET_PAGE
プロシージャが削除されました。
検証用のKNAKAGAKIユーザにもACEを構成していきます。
[oracle@Lin97 ~]$ vi ~/dbc/user_aces.sql
@$ORACLE_HOME/rdbms/admin/sqlsessstart.sql
-- target sample user
define clouduser=KNAKAGAKI
-- CUSTOMER SPECIFIC SETUP, NEEDS TO BE PROVIDED BY THE CUSTOMER
-- - SSL Wallet directory
define sslwalletdir=/u01/app/oracle/admin/orcl/dbms_cloud_ssl
-- Proxy definition
define proxy_uri=http://xxx.xxx.xxx.xxx:xx
define proxy_host=xxx.xxx.xxx.xxx
define proxy_low_port=xx
define proxy_high_port=xx
-- Create New ACL / ACEs
begin
-- Allow all hosts for HTTP/HTTP_PROXY
dbms_network_acl_admin.append_host_ace(
host =>'*',
lower_port => 443,
upper_port => 443,
ace => xs$ace_type(
privilege_list => xs$name_list('http', 'http_proxy'),
principal_name => upper('&clouduser'),
principal_type => xs_acl.ptype_db));
--
-- UNCOMMENT THE PROXY SETTINGS SECTION IF YOUR ENVIRONMENT NEEDS PROXYS
--
-- Allow Proxy for HTTP/HTTP_PROXY
dbms_network_acl_admin.append_host_ace(
host =>'&proxy_host',
lower_port => &proxy_low_port,
upper_port => &proxy_high_port,
ace => xs$ace_type(
privilege_list => xs$name_list('http', 'http_proxy'),
principal_name => upper('&clouduser'),
principal_type => xs_acl.ptype_db));
-- END PROXY SECTION
--
-- Allow wallet access
dbms_network_acl_admin.append_wallet_ace(
wallet_path => 'file:&sslwalletdir',
ace => xs$ace_type(
privilege_list =>xs$name_list('use_client_certificates', 'use_passwords'),
principal_name => upper('&clouduser'),
principal_type => xs_acl.ptype_db));
end;
/
@$ORACLE_HOME/rdbms/admin/sqlsessend.sql
今回はKNAKAGAKIが存在する検証用のPDBへ接続し、スクリプト(user_aces.sql)を実行します。
SQL> conn / as sysdba
接続されました。
SQL> alter session set CONTAINER = ORCL_PDB;
セッションが変更されました。
SQL> @@$HOME/dbc/user_aces.sql
セッションが変更されました。
旧 9: principal_name => upper('&clouduser'),
新 9: principal_name => upper('KNAKAGAKI'),
旧 17: host =>'&proxy_host',
新 17: host =>'xxx.xxx.xxx.xxx',
旧 18: lower_port => &proxy_low_port,
新 18: lower_port => xx,
旧 19: upper_port => &proxy_high_port,
新 19: upper_port => xx,
旧 22: principal_name => upper('&clouduser'),
新 22: principal_name => upper('KNAKAGAKI'),
旧 30: wallet_path => 'file:&sslwalletdir',
新 30: wallet_path => 'file:/u01/app/oracle/admin/orcl/dbms_cloud_ssl',
旧 33: principal_name => upper('&clouduser'),
新 33: principal_name => upper('KNAKAGAKI'),
PL/SQLプロシージャが正常に完了しました。
セッションが変更されました。
KNAKAGAKIユーザーのACEが正しく構成されたかをチェックするために、手順3-2.で作成したdbc_check.sql内のチェック対象のユーザー名を書き換えます。
[oracle@Lin97 ~]$ sed -i.bak 's/^define clouduser=.*/define clouduser=KNAKAGAKI/' ~/dbc/dbc_check.sql
KNAKAGAKIユーザーが存在するPDBへSYSユーザーで接続のうえ、編集したスクリプト(dbc_check.sql)を実行します。
この実行でも「valid response」の結果が得られれば、ACEは正しく構成されています。
SQL> conn / as sysdba
接続されました。
SQL> alter session set CONTAINER = ORCL_PDB;
セッションが変更されました。
SQL> @@$HOME/dbc/dbc_check.sql
旧 1: CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2) AS
新 1: CREATE OR REPLACE PROCEDURE KNAKAGAKI.GET_PAGE(url IN VARCHAR2) AS
旧 13: wallet_path => 'file:&sslwalletdir',
新 13: wallet_path => 'file:/u01/app/oracle/admin/orcl/dbms_cloud_ssl',
旧 14: wallet_password => '&sslwalletpwd');
新 14: wallet_password => 'xxxxxxxxxx');
旧 20: UTL_HTTP.SET_PROXY('&proxy_uri', NULL);
新 20: UTL_HTTP.SET_PROXY('http://xxx.xxx.xxx.xxx:xx', NULL);
プロシージャが作成されました。
旧 2: &clouduser..GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
新 2: KNAKAGAKI.GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
valid response
PL/SQLプロシージャが正常に完了しました。
旧 1: drop procedure &clouduser..GET_PAGE
新 1: drop procedure KNAKAGAKI.GET_PAGE
プロシージャが削除されました。
今回の検証でAI Agentが推論に利用するLLMのプロバイダは、OCI Generative AI Serviceを選択しました。
OCIの他にも、さまざまなAIプロバイダ
のLLMとの連携が可能なため、利用環境にあわせた構成を選択できます。
まず、OCIユーザーの各種情報を確認し、APIキーを発行します。
次に、それらを用いてCredentialをデータベースに格納します。
SQL> conn knakagaki/pass@orcl_pdb 接続されました。 SQL> begin 2 DBMS_CLOUD.CREATE_CREDENTIAL( 3 CREDENTIAL_NAME => 'OCI_CRED', 4 USER_OCID => 'ocid1.user.oc1..xxxxxxxxxx', 5 TENANCY_OCID => 'ocid1.tenancy.oc1..xxxxxxxxxx', 6 PRIVATE_KEY => '-----BEGIN PRIVATE KEY----- 7 xxxxxxxxxx ・・・省略・・・ 33 -----END PRIVATE KEY-----', 34 FINGERPRINT => 'xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx' 35 ); 36 end; 37 / PL/SQLプロシージャが正常に完了しました。
次に、上の手順で登録したCredentialを使用して、Select AI Agentが使用するLLMのモデルを定義したAIプロファイルを作成します。
今回は処理の内容に応じてパラメータの小さいLLM、大きいLLMと使い分ける構成にしました。
SQL> begin 2 3 --ログのフェッチなど軽量処理用 4 DBMS_CLOUD_AI.CREATE_PROFILE( 5 PROFILE_NAME => 'GEMINI_FLASH_PROF', 6 ATTRIBUTES => '{ 7 "provider" : "oci", 8 "region" : "ap-osaka-1", 9 "model" : "google.gemini-2.5-flash", 10 "credential_name" : "OCI_CRED", 11 "oci_compartment_id" : "ocid1.compartment.oc1..xxxxxxxxxx" 12 }' 13 ); 14 15 --ナレッジとログの意味を総合的に推論する重量処理用 16 DBMS_CLOUD_AI.CREATE_PROFILE( 17 PROFILE_NAME => 'GEMINI_PRO_PROF', 18 ATTRIBUTES => '{ 19 "provider" : "oci", 20 "region" : "ap-osaka-1", 21 "model" : "google.gemini-2.5-pro", 22 "credential_name" : "OCI_CRED", 23 "oci_compartment_id" : "ocid1.compartment.oc1..xxxxxxxxxx" 24 }' 25 ); 26 27 end; 28 / PL/SQLプロシージャが正常に完了しました。
作成した各AIプロファイルをセッションにセットし、疎通を確認します。
自然言語でのやり取りが可能であれば設定完了です。
SQL> exec DBMS_CLOUD_AI.SET_PROFILE('GEMINI_FLASH_PROF');
PL/SQLプロシージャが正常に完了しました。
SQL> select AI Chat こんにちは。;
RESPONSE
--------------------------------------------------------------------------------
こんにちは!
何かお手伝いできますか?
それとも、何か質問がありますか?
SQL> exec DBMS_CLOUD_AI.SET_PROFILE('GEMINI_PRO_PROF');
PL/SQLプロシージャが正常に完了しました。
SQL> select AI Chat こんにちは。;
RESPONSE
--------------------------------------------------------------------------------
こんにちは!
何かお手伝いできることはありますか?
XMLファイルのアラートログを参照するV$DIAG_ALERT_EXTビューから、必要最低限の列を参照するためのビューオブジェクトAI_ALERT_CANDIDATES_Vを作成しました。
SQL> create view AI_ALERT_CANDIDATES_V as
2 select
3 RECORD_ID,
4 ORIGINATING_TIMESTAMP,
5 MESSAGE_TEXT
6 from
7 V$DIAG_ALERT_EXT;
ビューが作成されました。
AI Agentには、直近1時間のレコードを評価させるために、ツールから呼び出しができるPL/SQLファンクションを作成しました。
出力形式はCSV風となるようにしています。
SQL> create function GET_AI_ALERT_CANDIDATES
2 return CLOB
3 is
4 L_TEXT CLOB;
5
6 function CSV_ESC(P_TEXT in CLOB) return CLOB
7 is
8 begin
9 return '"'
10 || REPLACE(REPLACE(REPLACE(NVL(P_TEXT, TO_CLOB('')), '"', '""'), CHR(13), ' '), CHR(10), ' ')
11 || '"';
12 end;
13 begin
14 DBMS_LOB.CREATETEMPORARY(L_TEXT, true);
15
16 for R in (
17 select RECORD_ID,
18 ORIGINATING_TIMESTAMP,
19 MESSAGE_TEXT
20 from AI_ALERT_CANDIDATES_V
21 where ORIGINATING_TIMESTAMP >= SYSTIMESTAMP - NUMTODSINTERVAL(60, 'MINUTE')
22 order by RECORD_ID
23 )
24 loop
25 DBMS_LOB.APPEND(
26 L_TEXT,
27 CSV_ESC(TO_CLOB(TO_CHAR(R.RECORD_ID)))
28 || ','
29 || CSV_ESC(TO_CLOB(TO_CHAR(R.ORIGINATING_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM')))
30 || ','
31 || CSV_ESC(R.MESSAGE_TEXT)
32 || CHR(10)
33 );
34 end loop;
35
36 if DBMS_LOB.GETLENGTH(L_TEXT) = 0 then
37 DBMS_LOB.APPEND(L_TEXT, TO_CLOB('NO_DATA'));
38 end if;
39
40 return L_TEXT;
41 end;
42 /
ファンクションが作成されました。
次に、GitHub上のMarkdownファイルを取得するファンクションを作成しました。
引数には、ナレッジのルーティングを記述した「SKILL.md」または各種ナレッジファイルを指す相対パス(例:「skills/<category>/<file>.md」)を指定できます。
指定に応じて、対応するファイルを参照できます。
SQL> create function GET_GITHUB_RAW( 2 P_PATH in VARCHAR2 3 ) return CLOB 4 is 5 L_NORMPATH VARCHAR2(4000); 6 L_URL VARCHAR2(4000); 7 L_TEXT CLOB; 8 begin 9 L_NORMPATH := 10 case 11 when SUBSTR(P_PATH, 1, 1) = '/' then SUBSTR(P_PATH, 2) 12 else P_PATH 13 end; 14 15 if L_NORMPATH <> 'SKILL.md' 16 and not REGEXP_LIKE(L_NORMPATH, '^skills/[A-Za-z0-9_-]+/[A-Za-z0-9_.-]+\.md$') 17 then 18 raise_application_error(-20001, 'Invalid path format: ' || L_NORMPATH); 19 end if; 20 21 L_URL := 22 'https://raw.githubusercontent.com/engchina/oracle-db-skills-ja/main/' || L_NORMPATH; 23 24 L_TEXT := DBMS_VECTOR_CHAIN.UTL_TO_TEXT( 25 DBMS_CLOUD.GET_RESPONSE_RAW( 26 DBMS_CLOUD.SEND_REQUEST( 27 CREDENTIAL_NAME => null, 28 METHOD => 'GET', 29 URI => L_URL 30 ) 31 ) 32 ); 33 34 return NVL(L_TEXT, TO_CLOB('')); 35 end; 36 / ファンクションが作成されました。
最後に、GitHub上の各「skills/<category>/」ディレクトリ下にどのようなファイルが存在するかを一覧化するファンクションを作成しました。
SQL> create function GET_GITHUB_DIR_LIST( 2 P_DIR in VARCHAR2 3 ) return CLOB 4 is 5 L_URL VARCHAR2(4000); 6 L_TEXT CLOB; 7 L_NORMDIR VARCHAR2(4000); 8 L_REQDIR VARCHAR2(4000); 9 begin 10 L_NORMDIR := 11 case 12 when SUBSTR(P_DIR, 1, 1) = '/' then SUBSTR(P_DIR, 2) 13 else P_DIR 14 end; 15 16 if not REGEXP_LIKE(L_NORMDIR, '^skills/[A-Za-z0-9_-]+/?$') then 17 raise_application_error(-20002, 'Invalid directory format: ' || L_NORMDIR); 18 end if; 19 20 L_REQDIR := RTRIM(L_NORMDIR, '/'); 21 22 L_URL := 23 'https://api.github.com/repos/engchina/oracle-db-skills-ja/contents/' || L_REQDIR; 24 25 L_TEXT := DBMS_CLOUD.GET_RESPONSE_TEXT( 26 DBMS_CLOUD.SEND_REQUEST( 27 CREDENTIAL_NAME => null, 28 METHOD => 'GET', 29 URI => L_URL 30 ) 31 ); 32 33 return NVL(L_TEXT, TO_CLOB('')); 34 end; 35 / ファンクションが作成されました。
いよいよこの記事の本題であるAI Agentの構成です。
今回は3つのエージェントに1つずつのタスクを割り当てる構成にしました。
| エージェント | タスク | 処理の概要 |
| ALERT_LOG_TRIAGE | ALERT_TRIAGE_TASK | 直近1時間のアラートログエントリを取得し、クリティカルな出力であるかを判定する。 |
| KB_ROUTER | SKILL_ROOT_FETCH_TASK | SKILL.mdを参照し、アラートログのクリティカルな内容に対する推奨事項を生成するための、Markdownナレッジが配置されているディレクトリを選定する。 |
| ALERT_LOG_RECOMMENDER | RECOMMEND_TASK | Markdownファイルの内容を参考に、アラートログから読み取った事象に対する推奨事項を回答する。 |
|
AI Agentの処理イメージ |
エージェントに役割を定義し、使用するAIプロファイルを設定します。
SQL> begin 2 DBMS_CLOUD_AI_AGENT.CREATE_AGENT( 3 AGENT_NAME => 'ALERT_LOG_TRIAGE', 4 ATTRIBUTES => '{ 5 "profile_name" : "GEMINI_FLASH_PROF", 6 "role" : "あなたはOracle AI Databaseのアラートログをフェッチし内容を要約する、' || 7 'プロフェッショナルなデータベース管理者です。", 8 "enable_human_tool" : "false" 9 }' 10 ); 11 end; 12 / PL/SQLプロシージャが正常に完了しました。 SQL> begin 2 DBMS_CLOUD_AI_AGENT.CREATE_AGENT( 3 AGENT_NAME => 'KB_ROUTER', 4 ATTRIBUTES => '{ 5 "profile_name" : "GEMINI_FLASH_PROF", 6 "role" : "あなたはアラートログの内容を解釈し、後続アクションの要否を判断する' || 7 '技術エキスパートです。' || 8 'アクションが必要な場合、SKILL.mdから参照するべきカテゴリブランチを選択します。", 9 "enable_human_tool" : "false" 10 }' 11 ); 12 end; 13 / PL/SQLプロシージャが正常に完了しました。 SQL> begin 2 DBMS_CLOUD_AI_AGENT.CREATE_AGENT( 3 AGENT_NAME => 'ALERT_LOG_RECOMMENDER', 4 ATTRIBUTES => '{ 5 "profile_name" : "GEMINI_PRO_PROF", 6 "role" : "あなたはOracle AI Databaseに精通したプロフェッショナルなエンジニアです。' || 7 'アラートログの内容を解釈し、`skills/<category>/` ディレクトリ直下の ' || 8 '<file>.md から関連性の高いファイルを参照します。' || 9 'アラートログの解釈結果と選択済みのMarkdownファイルを根拠に、推奨事項を整理します。", 10 "enable_human_tool" : "false" 11 }' 12 ); 13 end; 14 / PL/SQLプロシージャが正常に完了しました。
今回ツールには、先に作成しておいたPL/SQLファンクションを定義しています。
引数入力が必要なファンクションには想定される値を例示します。
また、引数がないファンクションには「tool_inputs」に空配列を明示すると、LLMが混乱しません。
SQL> begin 2 DBMS_CLOUD_AI_AGENT.CREATE_TOOL( 3 TOOL_NAME => 'ALERT_SQL_TOOL', 4 ATTRIBUTES => '{ 5 "instruction" : "アラートログのエントリを取得するツールです。", 6 "function" : "GET_AI_ALERT_CANDIDATES", 7 "tool_inputs" : [] 8 }' 9 ); 10 end; 11 / PL/SQLプロシージャが正常に完了しました。 SQL> begin 2 DBMS_CLOUD_AI_AGENT.CREATE_TOOL( 3 TOOL_NAME => 'GET_GITHUB_TOOL', 4 ATTRIBUTES => '{ 5 "instruction" : "Markdownファイルを1件取得する。' || 6 'P_PATHには `SKILL.md` または `skills/<category>/<file>.md` のいずれかのみを指定する。", 7 "function" : "GET_GITHUB_RAW", 8 "tool_inputs" : [ 9 {"name":"P_PATH", "description":"取得対象の相対パス。例: SKILL.md, skills/admin/dataguard.md"} 10 ] 11 }' 12 ); 13 end; 14 / PL/SQLプロシージャが正常に完了しました。 SQL> begin 2 DBMS_CLOUD_AI_AGENT.CREATE_TOOL( 3 TOOL_NAME => 'SKILL_DIR_LIST_TOOL', 4 ATTRIBUTES => '{ 5 "instruction" : "`skills/<category>/` 配下のパス一覧をJSONフォーマットで取得する。' || 6 'P_DIR には `skills/<category>/` のみを指定する。", 7 "function" : "GET_GITHUB_DIR_LIST", 8 "tool_inputs" : [ 9 {"name":"P_DIR", "description":"ディレクトリのパス。例: skills/admin/"} 10 ] 11 }' 12 ); 13 end; 14 / PL/SQLプロシージャが正常に完了しました。
タスクには、エージェントが行う処理を詳細に定義します。
「instruction」のフィールドには、AIチャットツールに入力するプロンプトに近い文章を記述します。
また、ここではそのタスクが利用できるツールも配列で定義します。
SQL> begin 2 DBMS_CLOUD_AI_AGENT.CREATE_TASK( 3 TASK_NAME => 'ALERT_TRIAGE_TASK', 4 ATTRIBUTES => '{ 5 "instruction" : 6 "アラートログのエントリを解釈し、対処が必要な内容の場合追加ナレッジを参照します。' || 7 'ナレッジの参照が必要かどうかを判定してください。' || 8 'エントリがない場合は、「エントリがない」旨をレスポンスしてください 。' || 9 '出力は次の 3点を必ず含めてください。' || 10 '1. アラートログの要約 2. 判定結果 3. 判定理由。' || 11 '* アラートログにエントリがない場合の例: 1. エントリがありません。 2. 追加ナレッジの参照は不要です。 ' || 12 '3. エントリがないため。' || 13 '* アラートログにエントリがあるが正常動作の場合の例: 1. パーティションが追加されたエントリ。 ' || 14 '2. 追加ナレッジの参照は不要です。 3. 正常動作のため。' || 15 '* アラートログにクリティカルな記録がある場合の例: 1. TEMPテーブルスペースでORA-01652エラーが発生し、' || 16 'セッションが1MBのテンポラリスペースを確保できなかった。 ' || 17 '2. 追加ナレッジを参照し対処を検討します。 3. この問題は、領域管理の監視と診断の範囲に該当します。", 18 "tools" : ["ALERT_SQL_TOOL"], 19 "enable_human_tool" : "false" 20 }' 21 ); 22 end; 23 / PL/SQLプロシージャが正常に完了しました。 SQL> begin 2 DBMS_CLOUD_AI_AGENT.CREATE_TASK( 3 TASK_NAME => 'SKILL_ROOT_FETCH_TASK', 4 ATTRIBUTES => '{ 5 "instruction" : 6 "追加ナレッジの参照が必要な場合、P_PATH に `SKILL.md` を指定してGET_GITHUB_TOOLを一度だけ実行してください。' || 7 '後続のアクションで参照するべきファイルが配置された読み取り先のディレクトリ(`skills/<category>/`)を' || 8 'SKILL.md内の情報から選定してください。' || 9 '**必ずSKILL.mdに記述のディレクトリから選択し、存在しないディレクトリを捏造することは禁止します。**' || 10 '参照するべきディレクトリ候補が複数ある場合は、複数のディレクトリを選択してください。' || 11 '出力は次の 2点を必ず含めてください。' || 12 '1. アラートログの要約(`input` の内容を転記すること) 2. 選択した読み取り先のディレクトリ(`skills/<category>/`)' || 13 '* アラートログにクリティカルな記録がある場合の例(次の内容はあくまでも例示のため、実際のレスポンスは' || 14 '**必ずアラートログの内容に基づくこと** ): 1. TEMPテーブルスペースでORA-01652エラーが発生し、' || 15 'セッションが1MBのテンポラリスペースを確保できなかった。 2. `skills/<category>/`' || 16 '追加ナレッジの参照が不要な場合は、ツールは使用せず、追加ナレッジの参照が不要な旨をレスポンスしてください。", 17 "tools" : ["GET_GITHUB_TOOL"], 18 "input" : "ALERT_TRIAGE_TASK", 19 "enable_human_tool" : "false" 20 }' 21 ); 22 end; 23 / PL/SQLプロシージャが正常に完了しました。 SQL> begin 2 DBMS_CLOUD_AI_AGENT.CREATE_TASK( 3 TASK_NAME => 'RECOMMEND_TASK', 4 ATTRIBUTES => '{ 5 "instruction" : 6 "**1つでも** 追加ナレッジの参照が必要な場合、選定した `skills/<category>/` を P_DIR に指定して' || 7 'SKILL_DIR_LIST_TOOLを実行してください。' || 8 'アラートログの要約内容に対する推奨事項を検討するのに必要なMarkdownファイルを選択します。' || 9 'リストされたファイルのタイトルから適切なものを必ず `skills/<category>/<file>.md` の形式で選択してください。' || 10 '選択した `skills/<category>/<file>.md` を P_PATH に指定してGET_GITHUB_TOOLを実行してください。' || 11 '参照するべきMarkdownファイルが複数存在する場合、それぞれのファイルに対し **1回ずつ** ' || 12 'GET_GITHUB_TOOLを実行してください。' || 13 '**必ずアラートログの要約内容や、参照した場合はMarkdownの内容にのみ基づきレスポンスを生成してください。**' || 14 '参照したMarkdownの内容がアラートログの出力に対して有効でない場合は、必ずしも推奨生成のソースにする' || 15 '必要はありません。' || 16 '**存在しない内容を捏造してレスポンスを生成することは禁止します。**' || 17 '出力フォーマットは次を参考にしてください。' || 18 '* アラートログにエントリがない場合の例: 1. エントリがありません。 2. 追加ナレッジの参照は不要です。 ' || 19 '3. エントリがないため。' || 20 '* アラートログにエントリがあるが正常動作の場合の例: 1. パーティションが追加されたエントリ。 ' || 21 '2. 追加ナレッジの参照は不要です。 3. 正常動作のため。' || 22 '* アラートログにクリティカルな記録がある場合の例: 1. TEMPテーブルスペースでORA-01652エラーが発生し、' || 23 'セッションが1MBのテンポラリスペースを確保できなかった。 ' || 24 '2. 参照したMarkdownのパス(`skills/<category>/<file>.md`)。 3. Markdownの内容を踏まえた推奨アクション' || 25 '追加ナレッジの参照が不要な場合は、ツールは使用せず、追加ナレッジの参照が不要な旨をレスポンスしてください。", 26 "tools" : ["SKILL_DIR_LIST_TOOL", "GET_GITHUB_TOOL"], 27 "input" : "SKILL_ROOT_FETCH_TASK", 28 "enable_human_tool" : "false" 29 }' 30 ); 31 end; 32 / PL/SQLプロシージャが正常に完了しました。
最後に、エージェントをまとめてチームを構成します。
どのエージェントにどのタスクを担わせるのかをここで定義してください。
SQL> begin 2 DBMS_CLOUD_AI_AGENT.CREATE_TEAM( 3 TEAM_NAME => 'ALERT_GITHUB_RECOMMEND_TEAM', 4 ATTRIBUTES => '{ 5 "agents": [ 6 {"name":"ALERT_LOG_TRIAGE", "task":"ALERT_TRIAGE_TASK"}, 7 {"name":"KB_ROUTER", "task":"SKILL_ROOT_FETCH_TASK"}, 8 {"name":"ALERT_LOG_RECOMMENDER", "task":"RECOMMEND_TASK"} 9 ], 10 "process":"sequential" 11 }' 12 ); 13 end; 14 / PL/SQLプロシージャが正常に完了しました。
それでは、早速AI Agentにアラートログを解析してもらいましょう。
今回はアラートログにエントリがない場合にもしっかりと返答し、クリティカルなエントリを検出した場合には、ツールを駆使して推奨事項を生成できるかを確認しました。
GET_AI_ALERT_CANDIDATESファンクションを先にチェックしたところ、直近1時間のエントリがなく「NO_DATA」と返りました。
その場合にもAI Agentは正確に「アラートログにエントリがないため、推奨されるアクションはない」と結論づけました。
--Select AI Agentを使用する前に、セッションにTeamをセットします SQL> exec DBMS_CLOUD_AI_AGENT.SET_TEAM('ALERT_GITHUB_RECOMMEND_TEAM'); PL/SQLプロシージャが正常に完了しました。 SQL> select GET_AI_ALERT_CANDIDATES; GET_AI_ALERT_CANDIDATES -------------------------------------------------------------------------------- NO_DATA SQL> select AI Agent アラートログのエントリから、推奨されるアクションはありますか?; RESPONSE ------------------------------------------------------------------------------------ 1. アラートログにエントリがありません。 2. 追加ナレッジの参照は不要です。 3. エントリがないため、推奨されるアクションはありません。
続いて、統合監査を格納するテーブルにインターバル・パーティションが追加されたという記録があった場合です。
これはエラーであったり、深刻な警告を意味するメッセージではありませんが、AI Agentは推奨されるアクションはないとしっかり判断しました。
SQL> select GET_AI_ALERT_CANDIDATES; GET_AI_ALERT_CANDIDATES -------------------------------------------------------------------------------- "5379","2026-07-12 09:48:38.052000000 +09:00","TABLE AUDSYS.AUD$UNIFIED: ADDED INTERVAL PARTITION SYS_P3138 (4395) VALUES LESS THA N (TIMESTAMP' 2026-07-13 00:00:00') " SQL> select AI Agent アラートログのエントリから、推奨されるアクションはありますか?; RESPONSE -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1. AUDSYS.AUD$テーブルにインターバルパーティションSYS_P3138が追加されたエントリです。 2. 追加ナレッジの参照は不要です。 3. これはインターバルパーティションが自動的に作成されたことを示す正常な動作のため、推奨されるアクションはありません。
そして一番気になる、クリティカルなエントリが記録されていた場合の確認です。
今回は、UNDOセグメントが上書きされてしまい、読み取り一貫性が保てない旨のORA-01555エラーをサンプルに動作確認しました。
SQL> select GET_AI_ALERT_CANDIDATES; GET_AI_ALERT_CANDIDATES -------------------------------------------------------------------------------- "5379","2026-07-12 09:48:38.052000000 +09:00","TABLE AUDSYS.AUD$UNIFIED: ADDED INTERVAL PARTITION SYS_P3138 (4395) VALUES LESS THA N (TIMESTAMP' 2026-07-13 00:00:00') " "5387","2026-07-12 09:51:02.187000000 +09:00","select /*+ leading( a b) use_nl(b) */ a.c1, a.c2 from t1555 a, t1555 b order by a.c1, b.c1 " "5388","2026-07-12 09:51:02.788000000 +09:00","Errors in file /u01/app/or acle/diag/rdbms/orcl/orcl/trace/orcl_ora_576360.trc: ORA-01555: スナップショットが古すぎます: ロールバック・セグメント 番号20、名前""_SYSSMU20_1313488183$""が小さすぎます " SQL> select AI Agent アラートログのエントリから、推奨されるアクションはありますか?; RESPONSE -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1. アラートログには、`AUDSYS.AUD$UNIFIED`テーブルへのインターバルパーティション追加と、ORA-01555「スナップショットが古すぎます」エラーの2つのエントリが記録されています。 2. 参照したMarkdownのパス: `skills/performance/wait-events.md` 3. Markdownの内容を踏まえた推奨アクション: * **パーティション追加について**: `AUDSYS.AUD$UNIFIED`テーブルへのパーティション追加は、データベースの自動メンテナンス機能による正常な動作です。これに対するアクションは不要です。 * **ORA-01555エラーについて**: このエラーは、長時間実行されるクエリが必要とするUNDOデータが、他のトランザクションによって上書きされてしまった場合に発生します。これは調査と対策が必要です。 * **原因調査**: 1. エラーが発生した時間帯に長時間実行されていたSQLを特定します。`wait-events.md`に記載されているように、AWR (Automatic Workload Repository) レポートやASH (Active Session History) レポート の分析が有効です。特に、実行時間が長く、多くのブロックを読み取っているSQL(`db file sequential read` や `db file scattered read` イベントを多く発生させているSQL)が原因である可能性が高いです。 2. 以下のクエリで、エラー発生時にアクティブだったセッションとそのSQLを確認することも有効です。 ```sql -- エラー発生時刻周辺のASHデータを確認 SELECT sample_time, session_id, sql_id, event, time_waited FROM v$active_session_history WHERE sample_time BETWEEN ... AND ... ORDER BY sample_time; ``` * **対策**: 1. **UNDO保存期間の確認と調整**: 現在の `UNDO_RETENTION` パラメータの値を確認し、最も時間のかかるクエリの実行時間よりも長く設定することを検討します。ただし、UNDOテーブルスペースのサイズと のバランスが必要です。 ```sql SHOW PARAMETER UNDO_RETENTION; ``` 2. **UNDOテーブルスペースのサイズ**: UNDOテーブルスペースに十分な空き領域があるか確認します。不足している場合は、データファイルの追加を検討してください。自動拡張が有効になっているかも確認 します。 3. **クエリのチューニング**: 根本的な原因は、非効率な長時間実行クエリです。`wait-events.md`の「 ・・・省略・・・
ここまで具体的に回答できる点は、非常に興味深いのではないでしょうか。
クリティカルではないエントリについては静観可能と触れつつ、ORA-01555についてはUNDOセグメントが上書きされてしまったことが説明されています。
エラーの解釈について、切り口が待機イベント起因であるように読める点はやや断定的な印象も残りますが、LLMに参照させたMarkdownの内容に沿った説明にはなっていました。
また、提示された対策もUNDO_RETENTIONの調整や、UNDO表領域のサイジング、ロングランクエリに対するチューニングなど、いずれも一般的な調査・対処の方向性に沿うものでした。
タスクごとのデータの受け渡しなどは、DBMS_CLOUD_AI_AGENT履歴ビューから振り返ることができます。
Oracle Cloud Infrastructureドキュメント(オラクル社のサイトに移動します)
DBMS_CLOUD_AI_AGENT履歴ビュー
上記のORA-01555に対する推奨が生成されるまでの処理履歴を覗いてみましょう。
処理の実行履歴は、まずチームごとの履歴が参照できるXXX_AI_AGENT_TEAM_HISTORYから、実行ごとのIDである「TEAM_EXEC_ID」を確認します。
SQL> select * from USER_AI_AGENT_TEAM_HISTORY order by START_DATE; TEAM_EXEC_ID TEAM_NAME STATE START_DATE END_DATE CONVERSATION_ID ------------------------------------ ------------------------------ ---------- ----------------------------------- ----------------------------------- ------------------------------------ 566055EF-8143-CA5C-E063-12B0A8C02F79 ALERT_GITHUB_RECOMMEND_TEAM SUCCEEDED 26-07-12 09:53:05.945699 +09:00 26-07-12 09:53:41.920597 +09:00 566055EF-8116-CA5C-E063-12B0A8C02F79
各ツールの実行履歴を参照します。
先に控えた「TEAM_EXEC_ID」の値をキーに、XXX_AI_AGENT_TOOL_HISTORYを確認します。
SQL> select * from USER_AI_AGENT_TOOL_HISTORY 2 where TEAM_EXEC_ID='566055EF-8143-CA5C-E063-12B0A8C02F79' 3 order by TASK_ORDER; INVOCATION_ID TEAM_EXEC_ID TASK_ORDER TOOL_NAME AGENT_NAME TASK_NAME START_DATE ------------- ------------------------------------ ---------- -------------------- ------------------------------ ------------------------------ ----------------------------------- END_DATE INPUT OUTPUT TOOL_OUTPUT ----------------------------------- -------------------------------------------------- -------------------------------------------------------------------------------- --------------- 1044 566055EF-8143-CA5C-E063-12B0A8C02F79 0 ALERT_SQL_TOOL ALERT_LOG_TRIAGE ALERT_TRIAGE_TASK 26-07-12 09:53:07.245423 +09:00 26-07-12 09:53:07.346613 +09:00 {} {"status":"success","result":"\"5379\",\"2026-07-12 09:48:38.052000000 +09:00\ ",\"TABLE AUDSYS.AUD$UNIFIED: ADDED INTERVAL PARTITI ON SYS_P3138 (4395) VALUES LESS THAN (TIMESTAMP' 202 6-07-13 00:00:00') \"\n\"5387\",\"2026-07-12 09:51:0 2.187000000 +09:00\",\"select /*+ leading(a b) use_n l(b) */ a.c1, a.c2 from t1555 a, t1555 b or der by a.c1, b.c1 \"\n\"5388\",\"2026-07-12 09:51:0 2.788000000 +09:00\",\"Errors in file /u01/app/oracl e/diag/rdbms/orcl/orcl/trace/orcl_ora_576360.trc: OR A-01555: スナップショットが古すぎます: ロールバック・セグメント番 号20、名前\"\"_SYSSMU20_1313488183$\"\"が小さすぎます \"\n"} 1045 566055EF-8143-CA5C-E063-12B0A8C02F79 1 GET_GITHUB_TOOL KB_ROUTER SKILL_ROOT_FETCH_TASK 26-07-12 09:53:11.522956 +09:00 26-07-12 09:53:11.723762 +09:00 { "P_PATH": "SKILL.md" } {"status":"success","result":"--- name: oracle-db-skills description: SQL、PL/S QL、パフォーマンス・チューニング、セキュリティ、ORDS、SQL cl、移行など、102のOracle Databaseリファレンス・ガイドが含まれています。個々のスキル・ファイルをオンデマンドでロ ードし、Oracleの各トピックに関する専門的なガイダンスを得ることができます。 --- # Oracle DB ・・・省略・・・ 1046 566055EF-8143-CA5C-E063-12B0A8C02F79 2 SKILL_DIR_LIST_TOOL ALERT_LOG_RECOMMENDER RECOMMEND_TASK 26-07-12 09:53:20.647677 +09:00 26-07-12 09:53:21.108606 +09:00 { "P_DIR": "skills/performance/" } {"status":"success","result":"[{\"name\":\"ash-analysis.md\",\"path\":\"skills /performance/ash-analysis.md\",\"sha\":\"55c794879f8 ・・・省略・・・ 1047 566055EF-8143-CA5C-E063-12B0A8C02F79 2 GET_GITHUB_TOOL ALERT_LOG_RECOMMENDER RECOMMEND_TASK 26-07-12 09:53:31.790356 +09:00 26-07-12 09:53:32.005203 +09:00 { "P_PATH": "skills/performance/wait-events.md" } {"status":"success","result":"# 待機イベント (Wait Events) — 診断と根本原因の特定 ## 概要 Orac le の待機イベント・インフラストラクチャは、パフォーマンス 診断の基盤である。セッションが処理を続行できず、何らかのリ ・・・省略・・・
まずALERT_SQL_TOOLからアラートログのエントリを取得し、GET_GITHUB_TOOLの引数に「SKILL.md」を渡してMarkdownファイルを参照しています。
その後、SKILL.mdに記載されたディレクトリパス「skills/performance/」をSKILL_DIR_LIST_TOOLの引数に渡し、ディレクトリ配下に配置された「skills/performance/wait-events.md」をGET_GITHUB_TOOLに渡してMarkdownファイルを参照する流れが読み取れました。
そして、タスクごとにアウトプットされたコンテキストの流れを、XXX_AI_AGENT_TASK_HISTORYから確認できます。
各エージェント、各タスクでどのように処理したのかを振り返ることができるため、アウトプットされた内容を見つつDBMS_CLOUD_AI_AGENT.CREATE_TASKの「instruction」フィールドのプロンプトを調整することに活用できます。
SQL> select * from USER_AI_AGENT_TASK_HISTORY 2 where TEAM_EXEC_ID='566055EF-8143-CA5C-E063-12B0A8C02F79' 3 order by TASK_ORDER; TEAM_EXEC_ID TEAM_NAME TASK_ORDER AGENT_NAME TASK_NAME ------------------------------------ ------------------------------ ---------- ------------------------------ ------------------------------ CONVERSATION_PARAMS INPUT ------------------------------------------------------------ ---------------------------------------------------------------------- RESULT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- STATE START_DATE END_DATE ---------- ----------------------------------- ----------------------------------- 566055EF-8143-CA5C-E063-12B0A8C02F79 ALERT_GITHUB_RECOMMEND_TEAM 0 ALERT_LOG_TRIAGE ALERT_TRIAGE_TASK {"conversation_id":"566055EF-8144-CA5C-E063-12B0A8C02F79"} アラートログのエントリから、推奨されるアクションはありますか? 1. アラートログには、`AUDSYS.AUD$UNIFIED`テーブルへのインターバルパーティション追加と、ORA-01555「スナップショットが古すぎます」エラーの2つのエントリが記録されています。 2. 追加ナレッジを参照し対処を検討します。 3. ORA-01555エラーは、長時間実行されるクエリが必要とするUNDOデータが、他のトランザクションによって上書きされてしまった場合に発生する可能性があり、調査と対策が必要な問題であるため。 SUCCEEDED 26-07-12 09:53:06.016018 +09:00 26-07-12 09:53:08.930608 +09:00 566055EF-8143-CA5C-E063-12B0A8C02F79 ALERT_GITHUB_RECOMMEND_TEAM 1 KB_ROUTER SKILL_ROOT_FETCH_TASK {"conversation_id":"566055EF-8145-CA5C-E063-12B0A8C02F79"} アラートログのエントリから、推奨されるアクションはありますか? 1. アラートログには、`AUDSYS.AUD$UNIFIED`テーブルへのインターバルパーティション追加と、ORA-01555「スナップショットが古すぎます」エラーの2つのエントリが記録されています。 2. `skills/performance/`, `skills/monitoring/` SUCCEEDED 26-07-12 09:53:08.970670 +09:00 26-07-12 09:53:13.239320 +09:00 566055EF-8143-CA5C-E063-12B0A8C02F79 ALERT_GITHUB_RECOMMEND_TEAM 2 ALERT_LOG_RECOMMENDER RECOMMEND_TASK {"conversation_id":"566055EF-8146-CA5C-E063-12B0A8C02F79"} アラートログのエントリから、推奨されるアクションはありますか? 1. アラートログには、`AUDSYS.AUD$UNIFIED`テーブルへのインターバルパーティション追加と、ORA-01555「スナップショットが古すぎます」エラーの2つのエントリが記録されています。 2. 参照したMarkdownのパス: `skills/performance/wait-events.md` 3. Markdownの内容を踏まえた推奨アクション: * **パーティション追加について**: `AUDSYS.AUD$UNIFIED`テーブルへのパーティション追加は、データベースの自動メンテナンス機能による正常な動作です。これに対するアクションは不要です。 * **ORA-01555エラーについて**: このエラーは、長時間実行されるクエリが必要とするUNDOデータが、他のトランザクションによって上書きされてしまった場合に発生します。これは調査と対策が必要です。 * **原因調査**: 1. エラーが発生した時間帯に長時間実行されていたSQLを特定します。`wait-events.md`に記載されているように、AWR (Automatic Workload Repository) レポートやASH (Active Session History) レポート の分析が有効です。特に、実行時間が長く、多くのブロックを読み取っているSQL(`db file sequential read` や `db file scattered read` イベントを多く発生させているSQL)が原因である可能性が高いです。 2. 以下のクエリで、エラー発生時にアクティブだったセッションとそのSQLを確認することも有効です。 ```sql -- エラー発生時刻周辺のASHデータを確認 SELECT sample_time, session_id, sql_id, event, time_waited FROM v$active_session_history WHERE sample_time BETWEEN ... AND ... ORDER BY sample_time; ``` * **対策**: 1. **UNDO保存期間の確認と調整**: 現在の `UNDO_RETENTION` パラメータの値を確認し、最も時間のかかるクエリの実行時間よりも長く設定することを検討します。ただし、UNDOテーブルスペースのサイズと のバランスが必要です。 ```sql SHOW PARAMETER UNDO_RETENTION; ``` 2. **UNDOテーブルスペースのサイズ**: UNDOテーブルスペースに十分な空き領域があるか確認します。不足している場合は、データファイルの追加を検討してください。自動拡張が有効になっているかも確認 します。 3. **クエリのチューニング**: 根本的な原因は、非効率な長時間実行クエリです。`wait-events.md`の「 SUCCEEDED 26-07-12 09:53:13.280695 +09:00 26-07-12 09:53:41.910798 +09:00
今回、本記事の執筆にあたっての事前検証では、Select AI Agentの動作確認にとどまらず、これを実運用へどう落とし込めるかを考えるうえでも示唆の多い内容となりました。
特に、アラートログを起点とした初動支援という観点では、単にAIと会話できること以上に、ReAct型Agentの性格を踏まえて、どのようにゴールを定義し、どのようなinstructionで処理を完走させるかが重要であると感じています。
今回の検証で最も難しかったのは、アラートログの内容をLLMへ解釈させること自体よりも、ReAct型のAgentに対して「どの時点で処理を終え、何を最終回答とみなすか」を正しく伝えることでした。
事前検証では、次のような意図しない振る舞いに悩まされました。
{\n "QUERY": "SELECT RECORD_ID, ORIGINATING_TIMESTAMP, MESSAGE_TEXT FROM ALERT_LOG"\n}
{"status":"error","message":"Error invoking tool: ORA-40441: JSON構文エラー"}
この挙動から見えてきたのは、Select AI Agentでは「タスクが正しく動くこと」と「Agentがその結果を正しく解釈してゴールと見なすこと」が別問題だという点です。
つまり、PL/SQLファンクションや外部アクセスの仕組みを用意するだけでは不十分で、エージェントに与えるinstructionや役割定義、利用するモデルの特性まで含めて設計して、はじめて安定した稼働が見られました。
一方で、こうした構成が形になってくると、Select AI Agentは障害対応の初動を加速する仕組みとしても非常に面白い存在になります。
今回の検証でも、アラートログを取得し、推奨事項の要否を判断できたので、これを運用に組み込む具体的なアイディアが浮かんできます。
前述の検証の延長で、私はこのAI Agentの回答をログとして残すプロシージャを作成したうえで、DBMS_SCHEDULERにより定期実行させる流れまで確認しました。
ここでは、先ほど動作確認に用いたORA-01555ではなく、TEMP表領域不足を示すORA-01652が記録されており、別種のエラーに対しても同様の流れで初動支援を行うことが見て取れます。
SQL> select * from AI_AGENT_RUN_LOG order by RUN_ID;
RUN_ID SCHEDULED_AT ALERT_CANDIDATES
---------- ----------------------------------- ------------------------------------------------------------------------------------------------------------------------
RUN_TEAM_OUTPUT
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 26-07-12 12:34:09.982406 +09:00 NO_DATA
1. エントリがありません。
2. 追加ナレッジの参照は不要です。
3. エントリがないため、推奨されるアクションはありません。
2 26-07-12 13:00:00.395532 +09:00 "5405","2026-07-12 12:35:50.493000000 +09:00","ORA-01652 tsn:3 objn:4294967295 objd:4294967295 dba_tiddefs is null "
"5406","2026-07-12 12:35:50.493000000 +09:00","ORA-01652: unable to grow temp segme
nt in tablespace TEMP [ORCL_PDB] by 1MB during operation with SQL ID:fwysw2ny5ty
yj, temp space used by session : 275 (MB) "
1. TEMPテーブルスペースでORA-01652エラーが発生し、セッションが1MBのテンポラリスペースを確保できませんでした。SQL ID:fwysw2ny5tyyj の操作中に発生し、セッシ
ョンは既に275MBのテンポラリスペースを使用しています。
2. 参照したMarkdownのパス: `skills/monitoring/space-management.md`
3. Markdownの内容を踏まえた推奨アクション:
ORA-01652エラーは、ソートやハッシュ結合などの操作で必要となる一時領域が不足した場合に発生します。以下のアクションを推奨します。
**1. 原因調査**
* **現在の一時領域使用者を特定する:**
どのセッションが一時領域を大量に消費しているかを確認します。
```sql
-- セッションごとの現在の一時領域使用状況
SELECT s.sid,
s.serial#,
s.username,
s.program,
s.sql_id,
ROUND(t.blocks * ts.block_size / 1048576, 1) AS temp_mb,
t.tablespace
FROM v$sort_usage t
JOIN v$session s ON t.session_addr = s.saddr
JOIN dba_tablespaces ts ON t.tablespace = ts.tablespace_name
ORDER BY t.blocks DESC
このように、DBAが最初に行う「事象の把握」「緊急度の見極め」「最初の調査ポイントの整理」をあらかじめ自動化できるのであれば、障害発生時の初動は確実に速くなるはずです。
定常的な監視の中で、障害検知時にまず何を確認すべきかを即座に示せる点は、運用への組み込みを考えるうえで大きな価値だと感じます。
今回の検証には含めていませんが、Select AI AgentのツールにはSQLやPL/SQLの実行だけでなく、RAGや通知の仕組みなども組み込めます。
すでに本検証でもGitHub上のMarkdown群をナレッジソースとして参照していますが、RAG的な使い方との親和性は高いと感じました。
アラートログの解釈後、SKILL.mdの内容とMarkdownファイルのタイトルから参照すべきナレッジを選択していますが、よりエンタープライズな実装を検討するのであれば、RAGによるセマンティック検索が最適でしょう。
また、通知系のツールと組み合わせれば、定期実行した結果のうち本当に対処が必要なものだけをEmailやSlackへ連携するといった発展も考えられます。
今回は推奨事項を生成するところまでを主眼に検証しましたが、その先にある通知やエスカレーションまで含めれば、Select AI Agentは本格的にDBA運用のフローの一部として機能し得るでしょう。
本記事では、Oracle AI Database 26aiの『Select AI Agent』フレームワークを用いて、アラートログを起点にDBAのトラブルシュートを支援できるかを検証しました。
検証の過程では、ReAct型Agentに対する理解など実装上の難しさに直面しました。
その一方で、役割を整理し、必要なナレッジ参照や定期実行、将来的な通知連携まで見据えると、障害発生時の初動を支援する仕組みとして活用できる大きなポテンシャルが確認できました。
現時点では設計やチューニングに工夫の余地があるものの、Select AI Agentをどう運用へ組み込むかという観点では、より実践的な仕組みへ発展していく手応えを感じました。
今後さらに検証を重ねることで、DBA業務だけでなく、実際の運用への展開を十分に検討できる機能だと考えています。
■本記事の内容について
本記事に記載されている製品およびサービス、定義及び条件は、特段の記載のない限り本記事執筆時点のものであり、予告なく変更になる可能性があります。あらかじめご了承ください。
■商標に関して
・Oracle®、Java及びMySQLは、Oracle、その子会社及び関連会社の米国及びその他の国における登録商標です。
・Amazon Web Services、AWS、Powered by AWS ロゴ、[およびかかる資料で使用されるその他の AWS 商標] は、Amazon.com, Inc. またはその関連会社の商標です。
文中の社名、商品名等は各社の商標または登録商標である場合があります。
OCIのOracle AI DatabaseをAWSから利用できる「Oracle AI Database@AWS」について、サービス概要と導入メリットをわかりやすく解説します。マルチクラウド環境でのオラクル活用に関心のある方は、ぜひご活用ください。
OCIを何から学べばよいか迷っている方に向けて、無料オンデマンド動画「OCI入門者向けウェビナー」をご紹介します。全5回の概要とおすすめの視聴ルートを通じて、OCIの基本や強み、データベース、セキュリティ、VMware移行のポイントを分かりやすくご案内します。
既存DBに手を加えずに、OCI上でSelect AI × Sidecar構成を構築する方法を解説します。Oracle Autonomous AI Databaseの作成から、BaseDBとのプライベートDB Link接続、Select AIの初期設定、自然言語での実行確認までを、実際の手順に沿って紹介します。