프린트 하기

OS 환경 : Oracle Linux 8.1 (64bit)

 

DB 환경 : Oracle Database 19.3.0.0

 

방법 : 오라클 19c alert log DDE flood control 기능(에러 홍수 제어)

오라클에서 alert log에 ORA 에러 메세지가 짧은 시간내에 너무 많이 발생하면 DDE flood control 기능이 동작하게됨
이 기능은 동일한 에러가 너무 많이 발생하면 이것 특정 시간동안 발생하지 않게 하는 기능임
본문에서는 이 기능을 제어하는 파라미터를 설명하고, 직접 에러를 많이 발생시켜 DDE flood control 기능이 동작하는 모습을 확인해봄

 

 

_dde_flood_control_init 히든 파라미터에 의해 제어됨 기본값은 true임
_dde_flood_control_init 히든 파라미터 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SQL>
set lines 200 pages 1000
col desc for a70
col name for a40
col current_value for a15
col default_value for a15
col default_t_f for a15
select
ksppinm "name",
ksppstvl "current_value",
b.ksppstdfl "default_value",
b.ksppstdf "default_t_f",
ksppdesc "desc"
from sys.x$ksppi a, sys.x$ksppcv b
where 1=1
and a.indx=b.indx
AND SUBSTR(a.KSPPINM, 1, 1) = '_'
and a.ksppinm in ('_dde_flood_control_init');
 
name                                     current_value   default_value   default_t_f     desc
---------------------------------------- --------------- --------------- --------------- ------------------------------------------
_dde_flood_control_init                  TRUE            TRUE            TRUE            Initialize Flood Control at database open

기본값인 true 상태임

 

 

과다한 에러 메세지를 발생시키기 위해 sga_target을 200mb로 설정하고 shared_pool_size은 150mb로 설정 후 재기동

1
2
3
4
5
SQL>
alter system set sga_target = 205m scope=spfile;
alter system set shared_pool_size = 50m scope=spfile;
shutdown immediate;
startup;

db는 정상 기동됨

 

 

하지만 쿼리 조회시 ORA-04031 발생함

1
2
3
4
5
SQL> select status from v$instance;
select status from v$instance
*
ERROR at line 1:
ORA-04031: unable to allocate 40 bytes of shared memory ("shared pool","unknown object","KGLH0^56416d0c","kglHeapInitialize:temp")

 

 

alert log 확인

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
$ tail -300f /ORA19/app/oracle/diag/rdbms/oracle19/oracle19/trace/alert_oracle19.log
2025-02-15T14:49:42.278733+09:00
Errors in file /ORA19/app/oracle/diag/rdbms/oracle19/oracle19/trace/oracle19_ora_651823.trc  (incident=120931):
ORA-04031: unable to allocate 16112 bytes of shared memory ("shared pool","unknown object","sga heap(1,0)","ksu:stats_freelist")
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
2025-02-15T14:49:43.162675+09:00
Errors in file /ORA19/app/oracle/diag/rdbms/oracle19/oracle19/trace/oracle19_p006_651857.trc  (incident=123062):
ORA-04031: unable to allocate 16424 bytes of shared memory ("shared pool","unknown object","sga heap(1,0)","dbktb: trace buffer")
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
2025-02-15T14:49:44.944385+09:00
Errors in file /ORA19/app/oracle/diag/rdbms/oracle19/oracle19/trace/oracle19_ora_651858.trc  (incident=123064):
ORA-04031: unable to allocate 16424 bytes of shared memory ("shared pool","unknown object","sga heap(1,0)","dbktb: trace buffer")
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
2025-02-15T14:49:45.354300+09:00
Errors in file /ORA19/app/oracle/diag/rdbms/oracle19/oracle19/trace/oracle19_lreg_651491.trc  (incident=120704):
ORA-04031: unable to allocate 40 bytes of shared memory ("shared pool","unknown object","KGLH0^a9e769ab","kglHeapInitialize:temp")
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
2025-02-15T14:49:47.591731+09:00
Errors in file /ORA19/app/oracle/diag/rdbms/oracle19/oracle19/trace/oracle19_ora_651858.trc  (incident=120932):
ORA-04031: unable to allocate 12312 bytes of shared memory ("shared pool","unknown object","KKSSP^15","kglseshtTable")
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
2025-02-15T14:49:47.642441+09:00
Errors in file /ORA19/app/oracle/diag/rdbms/oracle19/oracle19/trace/oracle19_gen1_651455_651456.trc  (incident=120559):
ORA-04031: unable to allocate 21752 bytes of shared memory ("shared pool","unknown object","sga heap(1,0)","SWRF Metric CHBs")
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.

수없이 많은 ORA-04031 에러 메세지가 발생함

 

 

이후 DDE flood 기능이 동작함

1
2
3
2025-02-15T14:49:52.901701+09:00
DDE: Problem Key 'ORA 4031' was completely flood controlled (0x6)
Further messages for this problem key will be suppressed for up to 10 minutes

 

 

이후 alert 로그

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
$ tail -300f /ORA19/app/oracle/diag/rdbms/oracle19/oracle19/trace/alert_oracle19.log
2025-02-15T14:49:53.014124+09:00
Process MZ01 died, see its trace file
2025-02-15T14:49:58.373337+09:00
ORA-4031 encountered when generating server alert SMG-3600
2025-02-15T14:50:03.567882+09:00
Errors in file /ORA19/app/oracle/diag/rdbms/oracle19/oracle19/trace/oracle19_qm03_652009.trc:
ORA-04031: unable to allocate 12312 bytes of shared memory ("shared pool","unknown object","KKSSP^393","kglseshtTable")
2025-02-15T14:50:04.470172+09:00
Process QM03 died, see its trace file
2025-02-15T14:50:07.120641+09:00
Errors in file /ORA19/app/oracle/diag/rdbms/oracle19/oracle19/trace/oracle19_w002_652019.trc:
ORA-04031: unable to allocate 12312 bytes of shared memory ("shared pool","unknown object","KKSSP^135","kglseshtTable")
2025-02-15T14:50:07.541724+09:00
Process W002 died, see its trace file
2025-02-15T14:50:13.877693+09:00
Restarting dead background process RECO
2025-02-15T14:50:15.817582+09:00
Errors in file /ORA19/app/oracle/diag/rdbms/oracle19/oracle19/trace/oracle19_w002_652052.trc:
ORA-04031: unable to allocate 12312 bytes of shared memory ("shared pool","unknown object","KKSSP^393","kglseshtTable")
2025-02-15T14:50:16.694180+09:00
Process W002 died, see its trace file
2025-02-15T14:50:16.694456+09:00
Starting background process RECO
2025-02-15T14:50:16.704988+09:00
RECO started with pid=25, OS id=652054
Restarting dead background process MMON
Starting background process MMON

ORA-04031이 계속 발생하긴 하지만 훨씬 줄어듬
추측하기론 ORA-04031의 특정 argument에 대해서만 flood 기능이 동작한것이고 다른 argument로 발생하는 에러는 계속 발생하는듯함
flood control 기능 동작전에는 ORA-04031 "shared pool","unknown object","sga heap(1,0)" 에러가 발생했지만
flood control 기능 동작후에는 ORA-04031 "shared pool","unknown object","sga heap(1,0)" 에러는 더이상 보이지 않고 다른 argument만 보임

 

 

참고로 이 기능을 끄고 싶다면 _dde_flood_control_init 파라미터를 false로 변경해주면됨

1
2
3
SQL> alter system set "_dde_flood_control_init" = false scope=spfile;
 
System altered.

 

 

참고로 히든파라미터 검색시 파라미터명이 아닌 desc에 flood를 검색하면 더 많은 파라미터들이 나옴
diag에 대해 dde flood를 하는 기능같지만 정확히 어떤 기능을하는 파라미터인지는 모르겠음
히든 파라미터 확인

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
SQL>
set lines 200 pages 1000
col desc for a70
col name for a40
col current_value for a15
col default_value for a15
col default_t_f for a15
select
ksppinm "name",
ksppstvl "current_value",
b.ksppstdfl "default_value",
b.ksppstdf "default_t_f",
ksppdesc "desc"
from sys.x$ksppi a, sys.x$ksppcv b
where 1=1
and a.indx=b.indx
AND SUBSTR(a.KSPPINM, 1, 1) = '_'
--and a.ksppinm in ('_dde_flood_control_init')
and lower(a.ksppdesc) like '%flood%';
 
name                                     current_value   default_value   default_t_f     desc
---------------------------------------- --------------- --------------- --------------- -----------------------------------------------------
_auto_bmr_fc_time                        60              60              TRUE            Auto BMR Flood Control Time
_dde_flood_control_init                  TRUE            TRUE            TRUE            Initialize Flood Control at database open
_diag_dde_fc_enabled                     TRUE            TRUE            TRUE            Parameter to enable/disable Diag Flood Control
_diag_dde_fc_implicit_time               0               0               TRUE            Override Implicit Error Flood Control time parameter
_diag_dde_fc_macro_time                  0               0               TRUE            Override Macro Error Flood Control time parameter

 

 

결론 :
dde flood control 기능은 특정 에러가 많이 발생될때 이런 에러발생을 일시적으로 멈추게 해주는 기능임
dde의 정확한 뜻은 찾지 못했지만 flood(홍수) control(제어)라는 이름의 _dde_flood_control_init 파라미터를 사용함(gpt에게 물어보면 Dynamic Diagnostic Events 라고 하는데 확실친 않음)
dde flood control 기능을 꺼버리면 alert log에 에러가 발생할때 너무 많이 발생되어
alert log 용량이 지나치게 크게 증가될수도 있고 alert 기록이 많아지면 이로인해 리소스 사용량도 증가해 서버에 더 부담이 될수 있음
그리고 더 큰 문제는 에러가 너무 많이 발생하면 alert log를 보기가 힘들어질수 있음, 문제의 원인이 되는 에러를 잘 찾지 못할수 있게됨

 

 

참조 : 

https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/background-processes.html
https://forums.oracle.com/ords/apexds/post/dde-problem-key-ora-445-was-completely-flood-controlled-8780

공감, 댓글은 블로그 운영에 큰 힘이 됩니다.
질문은 언제나 환영합니다. 궁금한 점이 있으시면 댓글로 편하게 물어보세요.
자료는 편하게 스크랩 해가셔도 되고 출처 표기시 상업적 사용도 가능합니다.
감사합니다.