OS 환경 : Oracle Linux 9.6 (64bit)
DB 환경 : Oracle AI Database 23.26.2.0.0 ai
방법 : 오라클 26ai 신기능 Select AI Agent 사용 테스트
사전 사항 dbms_cloud가 설치되어 있어야함
참고 : 오라클 26ai 신기능 dbms_cloud 설치(non-adb) ( https://positivemh.tistory.com/1203 )
26ai(23.26.1)부터 사용 가능한 DBMS_CLOUD_AI_AGENT는 기존 Select AI를 확장한 기능임
기본 제공되는 RAG, NL2SQL(Natural Language to SQL)뿐 아니라 사용자가 직접 만든 PL/SQL 함수와 외부 REST API도 Tool로 등록하여 사용할 수 있음
또한 대화 문맥(Multi-turn Memory)을 유지하면서 여러 Agent와 Task를 조합해 보다 복잡한 업무를 자동화할 수 있음
오라클에서 alert log는 diag 경로에서 파일로 확인할 수도 있지만 v$diag_alert_ext 뷰를 이용해서도 확인할 수 있음
본문에서는 오라클 select ai agent 기능을 이용해 v$diag_alert_ext를 읽어 alert log를 모니터링해주는 agent를 생성해봄
테스트는 pdb의 imsi 유저에서 진행함
참고 : 오라클 19c 테스트 시 사용하는 imsi 유저 생성 쿼리 ( https://positivemh.tistory.com/1017 )
본문에서 나오는 개념
에이전트(agent)
LLM이 특정 역할(Role)을 수행하는 실행 주체로 Role(시스템 프롬프트)에 따라 동작하고 Tool을 호출하거나 다른 Agent와 협업할 수 있음
도구(tool)
Agent가 필요 시 호출하는 기능으로 PL/SQL 함수나 외부 REST API 등을 Tool로 등록하여 사용할 수 있음
일(task)
Agent가 수행해야 할 작업을 정의한 단위로 사용할 Tool, 입력값, 실행 방식 등을 함께 정의할 수 있음
팀(team)
여러 Agent와 Task를 하나의 워크플로우로 구성하는 실행 단위로 순차(sequential) 또는 병렬(parallel) 방식으로 작업을 수행할 수 있음
참고 : https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/select-ai-agents-concepts.html
Select AI Agent 기본 실행 흐름
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
사용자 질문
↓
Team 실행
↓
Task 수행
↓
Agent가 Tool 호출
↓
PL/SQL 함수 실행
↓
결과 반환
↓
Agent가 최종 응답 생성
|
본문 시나리오의 실행 흐름
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
사용자 질문
↓
ALERT_LOG_AGENT_TEAM 실행
↓
ALERT_LOG_READER가 ALERT_LOG_FETCH_TOOL 호출
↓
fetch_alert_log 함수 실행
↓
v$diag_alert_ext 조회
↓
ALERT_LOG_ANALYZER가 결과 분석
↓
최종 답변 반환
|
테스트
사전 사항 dbms_cloud가 설치되어 있어야함
참고 : 오라클 26ai 신기능 dbms_cloud 설치(non-adb) ( https://positivemh.tistory.com/1203 )
imsi 유저에 DBMS_CLOUD_AI, DBMS_CLOUD_AI_AGENT 권한 부여
|
1
2
3
4
|
SQL>
GRANT EXECUTE ON DBMS_CLOUD_AI TO imsi;
GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO imsi;
GRANT SELECT ON V_$DIAG_ALERT_EXT TO imsi;
|
LLM용 ACL 생성
*유저이름은 IMSI이고 OPENAI api를 사용함
*pdb에서 sys 유저로 수행
|
1
2
3
4
5
6
7
8
9
10
11
12
|
SQL>
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'api.openai.com',
ace => xs$ace_type(privilege_list => xs$name_list('http'),
principal_name => 'IMSI',
principal_type => xs_acl.ptype_db)
);
END;
/
PL/SQL procedure successfully completed.
|
LLM용 자격증명(CREDENTIAL) 생성
*openai에서 발급 받은 api 키를 넣어줘야함
*토큰이 없는 경우 에러가 발생하기 때문에 1달러 정도 충전해놓으면 테스트 가능함
|
1
2
3
4
5
6
7
8
9
10
11
|
SQL>
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL (
credential_name => 'OPENAI_CRED',
username => 'OPENAI',
password => 'sk-proj-xxxxxxxxA' --api key 삽입
);
END;
/
PL/SQL procedure successfully completed.
|
api 키 발급 방법은 아래 게시글 참고
참고 : 오라클 26ai 신기능 Select AI 사용 테스트(non-adb) ( https://positivemh.tistory.com/1205 )
Select AI 프로필 생성
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'ALERT_LOG_AGENT',
attributes => q'[
{
"provider": "openai",
"credential_name": "OPENAI_CRED",
"comments": "true",
"model": "gpt-4o-mini"
}
]'
);
END;
/
|
옵션 설명 :
provider : 사용할 LLM 제공자
comments : Select AI가 LLM에 테이블 주석을 전송하여 SQL을 작성하는데 도움을 줄지 여부를 결정함
credential_name : LLM 제공자를 인증하는데 사용되는 자격 증명 이름임
model : 저렴한 gpt-4o-mini 모델을 사용함
잘 동작하는지 테스트
|
1
2
3
4
5
6
7
8
9
|
SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE('ALERT_LOG_AGENT');
PL/SQL procedure successfully completed.
SQL> select dbms_cloud_ai.get_profile from dual;
GET_PROFILE
---------------------------------
"IMSI"."ALERT_LOG_AGENT"
|
이렇게 나오면 잘 되는것
alert log 체크용 함수 생성
이 함수는 사용자의 질문을 분석하여 아래 기능을 수행함
- minute/hour/day 시간 추출
- ORA-xxxx 키워드 추출
- v$diag_alert_ext 조회
- JSON 형태 반환
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
|
SQL>
CREATE OR REPLACE FUNCTION fetch_alert_log (
p_request IN CLOB
) RETURN CLOB
AUTHID DEFINER
IS
l_request VARCHAR2(4000);
l_hours NUMBER := 24;
l_minutes NUMBER;
l_keyword VARCHAR2(100);
l_result CLOB;
BEGIN
l_request := DBMS_LOB.SUBSTR(p_request, 4000, 1);
IF REGEXP_LIKE(l_request, '([0-9]+)[[:space:]]*(minute|minutes|min)', 'i') THEN
l_minutes := TO_NUMBER(
REGEXP_SUBSTR(
l_request,
'([0-9]+)[[:space:]]*(minute|minutes|min)',
1,
1,
'i',
1
)
);
ELSIF REGEXP_LIKE(l_request, '([0-9]+)[[:space:]]*(hour|hours|hr|hrs)', 'i') THEN
l_hours := TO_NUMBER(
REGEXP_SUBSTR(
l_request,
'([0-9]+)[[:space:]]*(hour|hours|hr|hrs)',
1,
1,
'i',
1
)
);
ELSIF REGEXP_LIKE(l_request, '([0-9]+)[[:space:]]*(day|days)', 'i') THEN
l_hours := TO_NUMBER(
REGEXP_SUBSTR(
l_request,
'([0-9]+)[[:space:]]*(day|days)',
1,
1,
'i',
1
)
) * 24;
END IF;
l_keyword := REGEXP_SUBSTR(
UPPER(l_request),
'(ORA|TNS|LRM|PLS|RMAN|CRS|ASM|DIA)-[0-9]{4,5}'
);
IF l_minutes IS NOT NULL THEN
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
'originating_timestamp' VALUE TO_CHAR(originating_timestamp, 'YYYY-MM-DD HH24:MI:SS TZH:TZM'),
'database_id' VALUE database_id,
'host_id' VALUE host_id,
'component_id' VALUE component_id,
'message_type' VALUE message_type,
'message_level' VALUE message_level,
'urgency' VALUE urgency,
'problem_key' VALUE problem_key,
'message_text' VALUE SUBSTR(message_text, 1, 1000),
'cause_text' VALUE cause_text,
'action_text' VALUE action_text,
'con_id' VALUE con_id
RETURNING CLOB
)
RETURNING CLOB
)
INTO l_result
FROM (
SELECT originating_timestamp,
database_id,
host_id,
component_id,
message_type,
message_level,
urgency,
problem_key,
message_text,
cause_text,
action_text,
con_id
FROM v$diag_alert_ext
WHERE originating_timestamp >= SYSTIMESTAMP - NUMTODSINTERVAL(l_minutes, 'MINUTE')
AND (
l_keyword IS NULL
OR UPPER(message_text) LIKE '%' || l_keyword || '%'
OR UPPER(problem_key) LIKE '%' || l_keyword || '%'
)
AND (
l_keyword IS NOT NULL
OR message_type IN (2, 3, 4) -- 2: Incident, 3: Error, 4: Warning
OR UPPER(message_text) LIKE '%ORA-%'
OR UPPER(message_text) LIKE '%TNS-%'
OR UPPER(message_text) LIKE '%ERROR%'
OR UPPER(message_text) LIKE '%WARNING%'
OR UPPER(message_text) LIKE '%INCIDENT%'
OR UPPER(message_text) LIKE '%CRASH%'
OR UPPER(message_text) LIKE '%TERMINATED%'
OR UPPER(message_text) LIKE '%SHUTDOWN%'
OR UPPER(message_text) LIKE '%STARTUP%'
OR UPPER(message_text) LIKE '%RECOVERY%'
OR UPPER(message_text) LIKE '%ARCH%'
OR UPPER(message_text) LIKE '%LGWR%'
OR UPPER(message_text) LIKE '%CHECKPOINT%'
OR UPPER(message_text) LIKE '%DEADLOCK%'
)
ORDER BY originating_timestamp DESC
FETCH FIRST 50 ROWS ONLY
);
ELSE
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
'originating_timestamp' VALUE TO_CHAR(originating_timestamp, 'YYYY-MM-DD HH24:MI:SS TZH:TZM'),
'database_id' VALUE database_id,
'host_id' VALUE host_id,
'component_id' VALUE component_id,
'message_type' VALUE message_type,
'message_level' VALUE message_level,
'urgency' VALUE urgency,
'problem_key' VALUE problem_key,
'message_text' VALUE message_text,
'cause_text' VALUE cause_text,
'action_text' VALUE action_text,
'con_id' VALUE con_id
RETURNING CLOB
)
RETURNING CLOB
)
INTO l_result
FROM (
SELECT originating_timestamp,
database_id,
host_id,
component_id,
message_type,
message_level,
urgency,
problem_key,
message_text,
cause_text,
action_text,
con_id
FROM v$diag_alert_ext
WHERE originating_timestamp >= SYSTIMESTAMP - NUMTODSINTERVAL(l_hours, 'HOUR')
AND (
l_keyword IS NULL
OR UPPER(message_text) LIKE '%' || l_keyword || '%'
OR UPPER(problem_key) LIKE '%' || l_keyword || '%'
)
AND (
l_keyword IS NOT NULL
OR message_type IN (2, 3, 4)
OR UPPER(message_text) LIKE '%ORA-%'
OR UPPER(message_text) LIKE '%TNS-%'
OR UPPER(message_text) LIKE '%ERROR%'
OR UPPER(message_text) LIKE '%WARNING%'
OR UPPER(message_text) LIKE '%INCIDENT%'
OR UPPER(message_text) LIKE '%CRASH%'
OR UPPER(message_text) LIKE '%TERMINATED%'
OR UPPER(message_text) LIKE '%SHUTDOWN%'
OR UPPER(message_text) LIKE '%STARTUP%'
OR UPPER(message_text) LIKE '%RECOVERY%'
OR UPPER(message_text) LIKE '%ARCH%'
OR UPPER(message_text) LIKE '%LGWR%'
OR UPPER(message_text) LIKE '%CHECKPOINT%'
OR UPPER(message_text) LIKE '%DEADLOCK%'
)
ORDER BY originating_timestamp DESC
FETCH FIRST 50 ROWS ONLY
);
END IF;
IF l_result IS NULL THEN
RETURN 'No matching alert log entries were found for the requested condition.';
END IF;
RETURN l_result;
EXCEPTION
WHEN OTHERS THEN
RETURN 'Error while fetching alert log entries: ' || SQLERRM;
END fetch_alert_log;
/
Function created.
|
참고로 이 함수에서 RETURN을 JSON_ARRAYAGG 형식으로 주는데
Agent가 Tool 결과를 LLM으로 전달하기 때문에 JSON 형태로 반환하면 구조화된 데이터를 안정적으로 전달할 수 있어서 json으로 전달함
Agent 생성
Agent는 사용자의 요청을 이해하고 Task를 수행하는 AI 실행 주체임
Role과 Instruction을 기반으로 어떤 Tool을 사용할지 판단하고 여러 Task를 순차적으로 수행하거나 Team에 포함되어 다른 Agent와 함께 동작할 수 있음
alter log를 읽어오는 ALERT_LOG_READER Agent와 alert log를 분석하는 ALERT_LOG_ANALYZER Agent를 각각 생성함
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
SQL>
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'ALERT_LOG_READER',
attributes => q'[
{
"profile_name": "ALERT_LOG_AGENT",
"role": "You are an Oracle Database alert log reader. Use the available tool exactly once to fetch alert log entries. If the tool returns no matching entries, return that result without retrying. Do not guess log contents. Return intermediate findings in English only.",
"enable_human_tool": "false"
}
]',
description => 'Agent that fetches Oracle alert log entries.'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'ALERT_LOG_ANALYZER',
attributes => q'[
{
"profile_name": "ALERT_LOG_AGENT",
"role": "You are a senior Oracle DBA. Analyze Oracle alert log entries and produce the final answer in English only. Focus on timeline, errors, likely cause, impact, and next actions. Do not invent facts that are not present in the fetched logs.",
"enable_human_tool": "false"
}
]',
description => 'Agent that analyzes Oracle alert log entries.'
);
END;
/
PL/SQL procedure successfully completed.
|
옵션 설명 :
profile_name : Agent가 사용할 Select AI Profile을 지정함
role : Agent의 시스템 프롬프트 역할을 수행하고 Agent의 동작 방식과 응답 형식을 정의함
enable_human_tool : 사람의 입력을 요청하는 Human Tool 사용 여부를 지정함(false는 자동 실행)
Tool 생성
Tool은 Agent가 작업을 수행할 때 호출하는 실행 기능임
Oracle에서 제공하는 RAG, NL2SQL 등의 Built-in Tool을 사용할 수도 있고 사용자가 직접 작성한 PL/SQL 프로시저나 외부 REST API를 Tool로 등록하여 사용할 수도 있음
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
SQL>
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'ALERT_LOG_FETCH_TOOL',
attributes => q'[
{
"instruction": "Fetch Oracle alert log entries by passing the user request to the function as a single input. Use this tool whenever the user asks about alert log, ORA errors, TNS errors, startup, shutdown, crash, incident, recovery, archiver, checkpoint, ASM, RAC, or abnormal database behavior.",
"function": "fetch_alert_log"
}
]',
description => 'Tool for fetching Oracle alert log entries from V$DIAG_ALERT_EXT.'
);
END;
/
PL/SQL procedure successfully completed.
|
옵션 설명 :
instruction : Agent가 어떤 상황에서 Tool을 호출할지 판단하는 프롬프트
function : 실제 호출되는 PL/SQL 함수명
Task 생성
Task는 Agent가 수행할 하나의 작업 단위임. Task마다 사용할 Tool과 실행 지시문(Instruction)을 독립적으로 정의할 수 있고 하나의 Agent는 여러 개의 Task를 수행할 수 있음
alter log를 읽어오는 FETCH_ALERT_LOG_TASK Task와 alert log를 분석하는 ANALYZE_ALERT_LOG_TASK Task를 각각 생성함
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
SQL>
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'FETCH_ALERT_LOG_TASK',
attributes => q'[
{
"instruction": "Fetch Oracle alert log entries based on the user request: {query}. Call ALERT_LOG_FETCH_TOOL exactly once. If the tool returns no matching entries, return that message as the final task result. Do not call the tool again. Do not summarize in this task.",
"tools": ["ALERT_LOG_FETCH_TOOL"],
"enable_human_tool": "false"
}
]',
description => 'Task that fetches Oracle alert log entries.'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'ANALYZE_ALERT_LOG_TASK',
attributes => q'[
{
"instruction": "Analyze the fetched alert log entries for the user request: {query}. Write the final answer in English only. Use this format: 1. Search Scope, 2. Key Events, 3. Error Summary, 4. Likely Cause, 5. Impact, 6. Recommended Checks, 7. Recommended Actions. If no matching entries are found, clearly say that no matching alert log entries were found.",
"input": "FETCH_ALERT_LOG_TASK",
"enable_human_tool": "false"
}
]',
description => 'Task that analyzes fetched Oracle alert log entries.'
);
END;
/
PL/SQL procedure successfully completed.
|
옵션 설명 :
instruction : Task가 수행할 작업을 정의하는 프롬프트
tools : Task에서 사용할 Tool 목록
input : 이전 Task의 결과를 입력으로 전달받음
enable_human_tool : 사람의 입력을 요청하지 않고 자동 실행함
Team 생성
Team은 여러 Agent를 하나의 Workflow처럼 실행하는 객체임. 각 Agent는 서로 다른 역할을 수행할 수 있고 이전 Agent의 실행 결과를 다음 Agent가 이어받아 처리하거나 독립적으로 실행하도록 구성할 수 있음
ALERT_LOG_READER Agent가 FETCH_ALERT_LOG_TASK Task를 수행하고, ALERT_LOG_ANALYZER Agent가 ANALYZE_ALERT_LOG_TASK Task를 순차적으로 수행하게 지정하는 Team을 생성함
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
SQL>
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TEAM(
team_name => 'ALERT_LOG_AGENT_TEAM',
attributes => q'[
{
"agents": [
{
"name": "ALERT_LOG_READER",
"task": "FETCH_ALERT_LOG_TASK"
},
{
"name": "ALERT_LOG_ANALYZER",
"task": "ANALYZE_ALERT_LOG_TASK"
}
],
"process": "sequential"
}
]',
description => 'Team that fetches and analyzes Oracle alert log entries.'
);
END;
/
PL/SQL procedure successfully completed.
|
옵션 설명 :
agents : Team에서 실행할 Agent와 Task 매핑 정보
process :
- sequential : 앞 단계 결과를 다음 Agent가 전달받아 순차 실행
- parallel : 여러 Agent를 동시에 실행
실사용 테스트
1. 에러 발생 후 확인
고의로 에러 발생(생성할 수 없는 크기의 tablespace 생성 시도함)
|
1
2
3
4
5
|
SQL> create tablespace test datafile '/app/oracle/test.dbf' size 99999g;
*
ERROR at line 1:
ORA-00740: Data file size of 13107068928 blocks exceeds maximum file size.
Help: https://docs.oracle.com/error-help/db/ora-00740/
|
에러 발생함(alert log에도 에러가 남음)
Team set 설정
|
1
2
3
|
SQL> EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('ALERT_LOG_AGENT_TEAM');
PL/SQL procedure successfully completed.
|
이제 Select AI Agent를 사용할수 있음
참고로 set_team 명령을 수행하지 않고 select ai agent 쿼리를 수행하면 from 절을 입력하라고 표시됨
|
1
2
3
4
5
6
|
SQL> SELECT AI AGENT check ORA errors in the last 1 hour;
SELECT AI AGENT check ORA errors in the last 1 hour
*
ERROR at line 1:
ORA-00923: FROM keyword not found where expected
Help: https://docs.oracle.com/error-help/db/ora-00923/
|
select ai agent 수행
최근 1시간동안 발생한 ORA 에러를 알려달라고 요청
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
SQL> SELECT AI AGENT check ORA errors in the last 1 hour;
RESPONSE
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. Search Scope: ORA Errors in the last hour.
2. Key Events: ORA-740 signalled during the creation of a tablespace with a datafile size of 99999g.
3. Error Summary: The error ORA-740 indicates an attempt to create a tablespace with an excessively large datafile size that exceeds the allowable limits.
4. Likely Cause: Attempting to create a tablespace with a datafile size that is not permissible by the database configuration.
5. Impact: The creation of the tablespace failed, which may affect database operations that require this tablespace.
6. Recommended Checks: Verify the maximum allowable datafile size for the database and check for any configuration limits.
7. Recommended Actions: Adjust the datafile size to a permissible limit and retry the tablespace creation.
Elapsed: 00:00:10.28
|
답변에 10.2초가 소요됨
정확하게 ORA-740 에러가 발생한 것을 알려주고 가이드도 해줌
2. 로그 스위치 후 확인
로그 스위치 후 select ai agent 질문
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
--cdb에서 수행
SQL> alter system switch logfile;
System altered.
--alert log에도 로그 남음
2026-06-26T20:04:06.699045+09:00
Thread 1 advanced to log sequence 395 (LGWR switch), current SCN: 38365508
Current log# 2 seq# 395 mem# 0: /app/oracle/oradata/ORACLE26/redo02.log
2026-06-26T20:04:06.719486+09:00
ARC3 (PID:591768): Archived Log entry 399 added for B-1229857987.T-1.S-394 LOS:0x0000000002496176 NXS:0x0000000002496944 NAB:2703 ID 0x7bcdc843 LAD:1 [krse.c:4888]
--select ai agent 질문 수행
SQL> SELECT AI AGENT check log switch in the last 1 hours;
RESPONSE
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. Search Scope: Log switch events in the last hour.
2. Key Events: No specific log switch events were recorded in the last hour.
3. Error Summary: No errors related to log switches were found.
4. Likely Cause: Normal database operations without any log switch activity in the specified timeframe.
5. Impact: No impact on database operations as there were no log switch events or errors.
6. Recommended Checks: Continue to monitor log switch intervals and ensure that they are occurring as expected.
7. Recommended Actions: If log switches are expected but not occurring, investigate potential issues with the redo log configuration or disk space availability.
Elapsed: 00:00:07.65
|
답변에 7.6초가 소요됨
로그 스위치를 했지만 log switch라는 단어가 안남아서 그런지 1시간 이내로 log switch가 없었다고 나옴
확인해보니 pdb의 v$diag_alert_ext에 로그 스위치 내용이 안남아서 agent가 못찾는듯함(cdb의 v$diag_alert_ext에만 로그 스위치 기록이 남음)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
--pdb에서 조회
SQL>
set lines 200 pages 1000
col message_text for a100
select to_char(originating_timestamp, 'yyyy/mm/dd hh24:mi:ss') timestmp,
message_text from v$diag_alert_ext ORDER BY originating_timestamp DESC FETCH FIRST 30 ROWS ONLY;
TIMESTMP MESSAGE_TEXT
------------------- ----------------------------------------------------------------------------------------------------
2026/06/25 22:17:34 TABLE SYS.ACTIVITY_TABLE$: ADDED INTERVAL PARTITION SYS_P3137 (65) VALUES LESS THAN (6250)
2026/06/25 22:13:55 ORA-740 signalled during: create tablespace test datafile '/app/oracle/test.dbf' size 99999g...
2026/06/25 22:13:55 create tablespace test datafile '/app/oracle/test.dbf' size 99999g
2026/06/25 19:31:47 ORA-740 signalled during: create tablespace test datafile '/app/oracle/test.dbf' size 99999g...
2026/06/25 19:31:47 create tablespace test datafile '/app/oracle/test.dbf' size 99999g
2026/06/25 18:54:32 TABLE SYS.WRI$_OPTSTAT_HISTGRM_HISTORY: ADDED INTERVAL PARTITION SYS_P3120 (46197) VALUES LESS THAN
(TO_DATE(' 2026-06-26 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
2026/06/25 18:54:32 TABLE SYS.WRI$_OPTSTAT_HISTHEAD_HISTORY: ADDED INTERVAL PARTITION SYS_P3117 (46197) VALUES LESS THAN
(TO_DATE(' 2026-06-26 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
2026/06/25 15:26:38 Completed: ALTER PLUGGABLE DATABASE OPEN
2026/06/25 15:26:38 Opening pdb with no Resource Manager plan active
2026/06/25 15:26:35 Autotune of undo retention is turned on.
2026/06/25 15:26:35 ALTER PLUGGABLE DATABASE OPEN
2026/06/25 15:26:35 Completed: ALTER PLUGGABLE DATABASE CLOSE IMMEDIATE
2026/06/25 15:26:34 Buffer Cache flush finished: 3
2026/06/25 15:26:34 Buffer Cache flush started: 3
2026/06/25 15:26:34 JIT: pid 2886781 requesting stop
...
--cdb에서 조회
SQL>
conn sys/oracle@localhost:1521/ORACLE26 as sysdba
set lines 200 pages 1000
col message_text for a100
select to_char(originating_timestamp, 'yyyy/mm/dd hh24:mi:ss') timestmp,
message_text from v$diag_alert_ext ORDER BY originating_timestamp DESC FETCH FIRST 30 ROWS ONLY;
TIMESTMP MESSAGE_TEXT
------------------- ----------------------------------------------------------------------------------------------------
2026/06/26 20:09:12 ARC0 (PID:591762): Archived Log entry 400 added for B-1229857987.T-1.S-395 LOS:0x0000000002496944 NX
S:0x0000000002496e4d NAB:1775 ID 0x7bcdc843 LAD:1 [krse.c:4888]
2026/06/26 20:09:12 Current log# 3 seq# 396 mem# 0: /app/oracle/oradata/ORACLE26/redo03.log
2026/06/26 20:09:12 Thread 1 advanced to log sequence 396 (LGWR switch), current SCN: 38366797
2026/06/26 20:04:06 ARC3 (PID:591768): Archived Log entry 399 added for B-1229857987.T-1.S-394 LOS:0x0000000002496176 NX
S:0x0000000002496944 NAB:2703 ID 0x7bcdc843 LAD:1 [krse.c:4888]
2026/06/26 20:04:06 Current log# 2 seq# 395 mem# 0: /app/oracle/oradata/ORACLE26/redo02.log
2026/06/26 20:04:06 Thread 1 advanced to log sequence 395 (LGWR switch), current SCN: 38365508
2026/06/26 20:00:42 ARC2 (PID:591766): Archived Log entry 398 added for B-1229857987.T-1.S-393 LOS:0x0000000002473751 NX
S:0x0000000002496176 NAB:934438 ID 0x7bcdc843 LAD:1 [krse.c:4888]
2026/06/26 20:00:42 TABLE AUDSYS.AUD$UNIFIED: ADDED INTERVAL PARTITION SYS_P4097 (4379) VALUES LESS THAN (TIMESTAMP' 202
6-06-27 00:00:00')
2026/06/26 20:00:41 Current log# 1 seq# 394 mem# 0: /app/oracle/oradata/ORACLE26/redo01.log
2026/06/26 20:00:41 Thread 1 advanced to log sequence 394 (LGWR switch), current SCN: 38363510
2026/06/26 19:58:20 TABLE AUDSYS.AUD$UNIFIED: ADDED INTERVAL PARTITION SYS_P3170 (4379) VALUES LESS THAN (TIMESTAMP' 202
6-06-27 00:00:00')
...
|
이 문제를 해결하려면 cdb에서 agent를 만들어서 수행해야 될듯함
3. db open 시간 확인
pdb가 마지막으로 open 된 시간 확인
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
SQL> SELECT AI AGENT What was the last time pdb was open?;
RESPONSE
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. Search Scope: PDB open time events.
2. Key Events: The last time the PDB was opened was on 2026-06-25 at 15:26:34.
3. Error Summary: No errors were reported during the PDB opening.
4. Likely Cause: Normal database operations related to opening the PDB.
5. Impact: The PDB is available for use following the successful opening.
6. Recommended Checks: Monitor PDB status and performance metrics during open operations.
7. Recommended Actions: Ensure regular monitoring of PDB open times and check for any delays during the opening process.
Elapsed: 00:00:06.23
|
답변에 6.2초가 소요됨
pdb가 2026-06-25 at 15:26:34에 마지막으로 open 되었다고 나옴, 거의 정확함(1초 빠름)
참고1. 아래 질문을 하고 1분 이상 기다리다가 답변이 안나와서 취소함(Task와 Agent 반복 수행 수정전이었음)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
SQL> SELECT AI AGENT check archiver, checkpoint, and recovery related warnings in the last 1 hours;
^CSELECT AI AGENT check archiver, checkpoint, and recovery related warnings in the last 1 hours
*
ERROR at line 1:
ORA-01013: User requested cancel of current operation.
ORA-06512: at "SYS.UTL_HTTP", line 692
ORA-06512: at "SYS.UTL_HTTP", line 1342
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_REQUEST", line 6154
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_REQUEST", line 6867
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_REQUEST", line 6831
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD", line 14987
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 11264
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 12278
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 12352
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 18758
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI_AGENT", line 7449
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI_AGENT", line 7756
ORA-06512: at line 1
ORA-06512: at "SYS.DBMS_ISCHED", line 262
ORA-06512: at "SYS.DBMS_SCHEDULER", line 637
ORA-06512: at line 1
ORA-06512: at "SYS.DBMS_SYS_SQL", line 2240
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI_AGENT", line 9748
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI_AGENT", line 9984
ORA-06512: at line 1
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 12210
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 18780
ORA-06512: at line 1
Help: https://docs.oracle.com/error-help/db/ora-01013/
Elapsed: 00:01:27.16
|
참고2. OpenAI API 호출이 실패하거나 429(Quota/Rate Limit)가 발생하는 경우 대기하다가 Ctrl+C 누르면 아래와 같은 메세지 발생함(ORA-20429)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
^CSELECT AI AGENT check archiver, checkpoint, and recovery related warnings in the last 6 hours
*
ERROR at line 1:
ORA-01013: User requested cancel of current operation.
ORA-06512: at "SYS.DBMS_SESSION", line 438
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 11313
ORA-20429: Request failed with status HTTP 429 - bearer://api.openai.com/v1/chat/completions
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD", line 2253
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD", line 15086
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 11264
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 12278
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 12352
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 18758
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI_AGENT", line 7287
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI_AGENT", line 7756
ORA-06512: at line 1
ORA-06512: at "SYS.DBMS_ISCHED", line 262
ORA-06512: at "SYS.DBMS_SCHEDULER", line 637
ORA-06512: at line 1
ORA-06512: at "SYS.DBMS_SYS_SQL", line 2240
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI_AGENT", line 9748
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI_AGENT", line 9984
ORA-06512: at line 1
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 12210
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 18780
ORA-06512: at line 1
Help: https://docs.oracle.com/error-help/db/ora-01013/
|
참고3. 로그확인
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
--agent team history 확인
SQL>
set lines 200 pages 1000
col team_name for a22
col state for a10
SELECT TEAM_EXEC_ID, TEAM_NAME, STATE
, to_char(START_DATE, 'yyyy/mm/dd hh24:mi:ss') START_DATE
, to_char(END_DATE, 'yyyy/mm/dd hh24:mi:ss') END_DATE
, CONVERSATION_ID
FROM dba_ai_agent_team_history
ORDER BY start_date DESC;
TEAM_EXEC_ID TEAM_NAME STATE START_DATE END_DATE CONVERSATION_ID
------------------------------------ ---------------------- ---------- ------------------- ------------------- ------------------------------------
551248C0-7D2E-ECB5-E063-A565460A4AC9 ALERT_LOG_AGENT_TEAM SUCCEEDED 2026/06/25 22:33:00 2026/06/25 22:33:06 551248C0-7CA1-ECB5-E063-A565460A4AC9
551248C0-7D20-ECB5-E063-A565460A4AC9 ALERT_LOG_AGENT_TEAM SUCCEEDED 2026/06/25 22:24:21 2026/06/25 22:24:29 551248C0-7CA1-ECB5-E063-A565460A4AC9
551248C0-7D12-ECB5-E063-A565460A4AC9 ALERT_LOG_AGENT_TEAM SUCCEEDED 2026/06/25 22:22:07 2026/06/25 22:22:13 551248C0-7CA1-ECB5-E063-A565460A4AC9
551248C0-7D04-ECB5-E063-A565460A4AC9 ALERT_LOG_AGENT_TEAM SUCCEEDED 2026/06/25 22:19:37 2026/06/25 22:19:44 551248C0-7CA1-ECB5-E063-A565460A4AC9
551248C0-7CCA-ECB5-E063-A565460A4AC9 ALERT_LOG_AGENT_TEAM RUNNING 2026/06/25 22:17:07 551248C0-7CA1-ECB5-E063-A565460A4AC9
551248C0-7CBC-ECB5-E063-A565460A4AC9 ALERT_LOG_AGENT_TEAM SUCCEEDED 2026/06/25 22:14:18 2026/06/25 22:14:28 551248C0-7CA1-ECB5-E063-A565460A4AC9
551248C0-7CB3-ECB5-E063-A565460A4AC9 ALERT_LOG_SIMPLE_TEAM SUCCEEDED 2026/06/25 19:32:24 2026/06/25 19:32:29 551248C0-7CA1-ECB5-E063-A565460A4AC9
..
--agent task history 확인
SELECT *
FROM dba_ai_agent_task_history
--WHERE TEAM_EXEC_ID = '...'
ORDER BY start_date DESC;
TEAM_EXEC_ID TEAM_NAME TASK_OWNER TASK_ORDER
------------------------------------ ---------------------- -------------------------------------------------------------------------------------------------------------------------------- ----------
AGENT_NAME
--------------------------------------------------------------------------------------------------------------------------------
TASK_NAME
--------------------------------------------------------------------------------------------------------------------------------
CONVERSATION_PARAMS
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
INPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RESULT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
STATE START_DATE END_DATE
---------- --------------------------------------------------------------------------- ---------------------------------------------------------------------------
551248C0-7CCA-ECB5-E063-A565460A4AC9 ALERT_LOG_AGENT_TEAM IMSI 1
ALERT_LOG_ANALYZER
ANALYZE_ALERT_LOG_TASK
{"conversation_id":"551248C0-7CCC-ECB5-E063-A565460A4AC9"}
check archiver, checkpoint, and recovery related warnings in the last 1 hours
551248C0-7D2E-ECB5-E063-A565460A4AC9 ALERT_LOG_AGENT_TEAM IMSI 1
ALERT_LOG_ANALYZER
ANALYZE_ALERT_LOG_TASK
{"conversation_id":"551248C0-7D30-ECB5-E063-A565460A4AC9"}
What was the last time pdb was open?
1. Search Scope: PDB open time events.
2. Key Events: The last time the PDB was opened was on 2026-06-25 at 15:26:34.
3. Error Summary: No errors were reported during the PDB opening.
4. Likely Cause: Normal database operations related to opening the PDB.
5. Impact: The PDB is available for use following the successful opening.
6. Recommended Checks: Monitor PDB status and performance metrics during open operations.
7. Recommended Actions: Ensure regular monitoring of PDB open times and check for any delays during the opening process.
SUCCEEDED 25-JUN-26 10.33.03.974337 PM +09:00 25-JUN-26 10.33.06.253586 PM +09:00
..
--agent tool history 확인
SELECT *
FROM dba_ai_agent_tool_history
--WHERE TEAM_EXEC_ID = '...'
ORDER BY start_date DESC;
INVOCATION_ID TEAM_EXEC_ID TASK_ORDER TOOL_NAME
------------- ------------------------------------ ---------- --------------------------------------------------------------------------------------------------------------------------------
TOOL_OWNER
--------------------------------------------------------------------------------------------------------------------------------
AGENT_NAME
--------------------------------------------------------------------------------------------------------------------------------
TASK_NAME
--------------------------------------------------------------------------------------------------------------------------------
START_DATE END_DATE
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
INPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TOOL_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
119 551248C0-7D2E-ECB5-E063-A565460A4AC9 0 ALERT_LOG_FETCH_TOOL
IMSI
ALERT_LOG_READER
FETCH_ALERT_LOG_TASK
25-JUN-26 10.33.01.899540 PM +09:00 25-JUN-26 10.33.02.061649 PM +09:00
{ "P_REQUEST": "check pdb open time" }
{"status":"success","result":"[{\"originating_timestamp\":\"2026-06-25 22:13:55 +09:00\",\"database_id\":null,\"host_id\":\"ora26\",\"component_id\":\"rdbms\",\"message_type\":5,\"message_level\":16,\
"urgency\":null,\"problem_key\":null,\"message_text\":\"ORA-740 signalled during: create tablespace test datafile '/app/oracle/test.dbf' size 99999g...\\n\",\"cause_text\":null,\"action_text\":null,\"
con_id\":3},{\"originating_timestamp\":\"2026-06-25 19:31:47 +09:00\",\"database_id\":null,\"host_id\":\"ora26\",\"component_id\":\"rdbms\",\"message_type\":5,\"message_level\":16,\"urgency\":null,\"p
roblem_key\":null,\"message_text\":\"ORA-740 signalled during: create tablespace test datafile '/app/oracle/test.dbf' size 99999g...\\n\",\"cause_text\":null,\"action_text\":null,\"con_id\":3},{\"orig
inating_timestamp\":\"2026-06-25 15:26:34 +09:00\",\"database_id\":null,\"host_id\":\"ora26\",\"component_id\":\"rdbms\",\"message_type\":3,\"message_level\":16,\"urgency\":null,\"problem_key\":null,\
"message_text\":\"Buffer Cache flush finished: 3\\n\",\"cause_text\":null,\"action_text\":null,\"con_id\":3},{\"originating_timestamp\":\"2026-06-25 15:26:34 +09:00\",\"database_id\":null,\"host_id\":
\"ora26\",\"component_id\":\"rdbms\",\"message_type\":3,\"message_level\":16,\"urgency\":null,\"problem_key\":null,\"message_text\":\"Buffer Cache flush started: 3\\n\",\"cause_text\":null,\"action_te
xt\":null,\"con_id\":3},{\"originating_timestamp\":\"2026-06-25 15:18:52 +09:00\",\"database_id\":null,\"host_id\":\"ora26\",\"component_id\":\"rdbms\",\"message_type\":3,\"message_level\":32,\"urgenc
y\":null,\"problem_key\":null,\"message_text\":\"Resize operation completed for file# 23, fname /app/oracle/oradata/ORACLE26/ORACLE26PDB1/system01.dbf, old size 591056K, new size 601296K\\n\",\"cause_
text\":null,\"action_text\":null,\"con_id\":3}]"}
..
|
뷰 설명 :
dba_ai_agent_team_history : Team 단위의 실행 이력과 실행 상태(SUCCEEDED, FAILED 등)를 확인하는 뷰
dba_ai_agent_task_history : Team 내부에서 수행된 각 Task의 입력값(INPUT), 결과(RESULT), 실행 상태를 확인하는 뷰
dba_ai_agent_tool_history : Agent가 호출한 Tool의 입력(INPUT), 출력(OUTPUT), PL/SQL 함수 반환 결과(TOOL_OUTPUT) 등을 확인하는 뷰
먼저 dba_ai_agent_team_history에서 확인하고 TEAM_EXEC_ID 컬럼을 where 조건으로 줘서 dba_ai_agent_task_history, dba_ai_agent_tool_history 순으로 작업 내역을 확인하면 됨
참고4. 테스트 내용 전체 삭제
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
SQL>
BEGIN
DBMS_CLOUD_AI_AGENT.DROP_TEAM(
team_name => 'ALERT_LOG_AGENT_TEAM',
force => TRUE
);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.DROP_TASK(
task_name => 'ANALYZE_ALERT_LOG_TASK',
force => TRUE
);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.DROP_TASK(
task_name => 'FETCH_ALERT_LOG_TASK',
force => TRUE
);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.DROP_TOOL(
tool_name => 'ALERT_LOG_FETCH_TOOL',
force => TRUE
);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.DROP_AGENT(
agent_name => 'ALERT_LOG_ANALYZER',
force => TRUE
);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.DROP_AGENT(
agent_name => 'ALERT_LOG_READER',
force => TRUE
);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
DROP FUNCTION fetch_alert_log;
BEGIN
DBMS_CLOUD_AI.DROP_PROFILE(
profile_name => 'ALERT_LOG_AGENT'
);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
BEGIN
DBMS_CLOUD.DROP_CREDENTIAL(
credential_name => 'OPENAI_CRED'
);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
|
결론 :
기존 Select AI가 자연어를 SQL로 변환하는 기능에 초점을 맞췄다면 Select AI Agent는 Tool과 Agent를 조합하여 실제 업무를 수행하는 AI Workflow를 데이터베이스 내부에서 구현할 수 있다는 점이 가장 큰 차이점임
Select AI Agent를 이용하면 자연어 질의를 단순 SQL 생성 수준이 아니라 PL/SQL Tool 호출과 Agent 협업 방식으로 확장할 수 있음
본문에서는 Alert Log 조회 Tool을 직접 작성하여 Agent가 Tool을 호출하고 결과를 분석하는 구조를 구현해보았음
alert log 조회 이외에도 pl/sql을 이용해 다방면으로 agent를 활용할수 있을듯함
토큰 비용이 부담된다면 일반 select ai처럼 로컬 GPU 서버를 이용할수도 있을듯함
추가로 DBA_AI_AGENT_* 뷰를 통해 실행 이력까지 확인할 수 있음
참고로 여러가지 질문을 하고 테스트를 진행한 뒤 open ai api 토큰 사용량을 확인해보니 353,074 토큰을 사용했고 비용은 $0.04였음
테스트를 하면서 알게된 내용인데 2025년에 10달러를 충전해뒀는데 1년이 지나면 자동으로 소멸된다고함, 오늘 테스트하느라 5달러를 추가로 충전하였음
이 테스트를 위해 충전하는것이라면 1달러 정도만 충전해보고 필요시 더 충전하면 될듯함
추가로 Tool 결과가 없을 때 Agent가 같은 Tool을 반복 호출하는 경우가 있었음
이 경우 Task instruction에 "Tool을 정확히 한 번만 호출하고 결과가 없어도 재시도하지 말라"는 내용을 명시하면 해결됨(본문에는 이렇게 입력함)
참조 :
오라클 26ai 신기능 dbms_cloud 설치(non-adb) ( https://positivemh.tistory.com/1203 )
오라클 26ai 신기능 Select AI 사용 테스트(non-adb) ( https://positivemh.tistory.com/1205 )
https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/select-ai-agent1.html
https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/examples-using-select-ai-agent.html
https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/dbms-cloud-ai-agent-views-history.html#GUID-8D462805-FD67-4006-A10D-545DDD5D84A0
https://docs.oracle.com/en/database/oracle/oracle-database/26/refrn/V-DIAG_ALERT_EXT.html?utm_source=chatgpt.com
https://oracle-cloud.tistory.com/entry/오라클-Select-AI-Agent-자연어로-데이터베이스를-혁신하는-AI-에이전트의-힘
'ORACLE > Admin' 카테고리의 다른 글
| 오라클 19c 비파티션 테이블에서 파티션 테이블로 전환 및 성능 비교 (0) | 2026.06.25 |
|---|---|
| 오라클 19c Restart 환경 hostname 변경 가이드 (0) | 2026.06.21 |
| 오라클 19c Active Data Guard(ADG)와 Data Guard(DG) 차이점 및 DML Redirection 기능 (0) | 2026.06.16 |
| 오라클 19c ADG Snapshot Standby Database (0) | 2026.06.14 |
| 오라클 19c ADG 구성 중 db_file_name_convert, log_file_name_convert 파라미터 테스트 (0) | 2026.06.12 |
