참고글 및 문제해결/관련, 참고글

Oracle Dump 뜨기 스크립트

에몽이ㅋ 2019. 7. 11. 09:20

1. 덤프

 

덤프 : 일회성으로 그 순간의 상태정보를 가집니다.

트레이스 : 10046, 10053 등의 이벤트를 걸게 되면 순간의 상태(immediate) 또는

세션이 close될때까지의 정보(trace name context forever) 를 trace로

남깁니다.

참고로 udump 에 없다고 해서 고민하지 말구요. bdump를 찾아보세요.

background process를 이용해서 dump를 뜨는 경우에는 bdump에 나오겠죠.

 

2. 문제발생시 덤프 뜨는 방법

문제발생 세션에 대한 10046 event, truss output, errorstack dump

OS engineer의 system state dump

system state dump 2~3회

hang analyze dump 2~3회

system state dump 1~2회

hang analyze dump 1~2회

 

3. 에러스택 뜨기(꼭 수행할 때마다 exit나와서 다시 서버에 접속해서 뜰 것)

oradebug setospid XX

oradebug unlimit

oradebug dump errorstack 3

oradebug tracefile_name

 

또는

alter system set max_dump_file_size=unlimited;

alter session set tracefile_identifier=’error1′;

alter session set events ‘immediate trace name errorstack level 3’;

 

4. hanganalyze, systemstate dump 뜨기(꼭 수행할 때마다 exit나와서 다시 서버에 접속해서 뜰 것)

– systemstate dump는 database의 전반적인 hang이나 slow performance상황에 요구된다.

또한 데이터베이스 문제가 발생해서 재기동할 때에 , 추후 분석을 위해서 재기동 전에

적절한 systemstate dump를 확보한다.

보통 system state dump는 3~5분 간격으로 3번 수행을 권장하는데, 이 때 매번

새로운 접속을 해야 각각이 각각 다른 파일명으로 생성된다.

같은 세션에서 3번 수행하면, 한 파일에 이어서 생성된다.

– hanganalyze dump는 마찬가지로 hang이나 slow performance 상황에 사용된다.

그러나 hanganalyze dump는 리소스(latch/eueueue등등)을 점유하는 blocker를

보여주므로 , 이 blocker를 정리함으로 문제 해결에 접근할 수 있다.

 

oradebug setmypid

oradebug unlimit

oradebug hanganalyze 4

 

oradebug setmypid

oradebug unlimit

oradebug dump systemstate 10

 

또는

alter system set max_dump_file_size=unlimited;

alter session set tracefile_identifier=’sys1′;

alter session set events ‘immediate trace name systemstate level 10’;

 

alter system set max_dump_file_size=unlimited;

alter session set tracefile_identifier=’hang1′;

alter session set events ‘immediate trace name hanganalyze level 4’;

 

5. oradebug로 event 걸기(10046 event는 sql 트레이스 정보, 10053은 optimizer에 대한 트레이스 정보)

oradebug setospid XX

oradebug unlimit

oradebug event 10046 trace name context forever, level 12;

oradebug event 10053 trace name context forever, level 1;

oradebug tracefile_name

oradebug event 10046 trace name context off;

oradebug event 10053 trace name context off;

 

6. 문제가 있는 세션의 process state dump 뜨기

oradebug setospid

oradebug unlimit

oradebug dump processstate 10

 

7. 특정 event가 발생할 경우에heap dump 뜨기 ( 4031 에러의 경우 )

init 파라미터에 event name 하나에 trace name을 여러개를 사용 할 경우 ; 를 붙임

init 파라미터에 여러개 event를 붙일 경우 : 을 사용함

 

event = “4031 trace name heapdump level 1;name errorstack level 3”

또는 sqlplus에서

alter session set events ‘4031 trace name heapdump level 1

;name errorstack level 3′;

 

8. 연속적으로 event를 붙어 넣기

init 파라미터

event=”10015 trace name context forever”

event=”10046 trace name context forever, level 4″

또는

event=”10015 trace name context forever:

10046 trace name context forever, level 4″

 

sqlplus 에서

alter session set events ‘10015 trace name context forever:

10046 trace name context forever, level 4′;

 

9. alter session 명령으로 자신 세션에 event걸기(session 이 logout할때까지 수행됨)

alter session set timed_statistics=true;

alter session set max_dump_file_size=unlimited;

alter session set tracefile_identifier=’10046evnt1′;

alter session set events ‘10046 trace name context forever , level 12’;

alter session set events ‘10053 trace name context forever , level 1’;

alter session set events ‘10046 trace name context off’;

alter session set events ‘10053 trace name context off’;

 

10. 전체 시스템에 event 걸기

alter system set timed_statistics=true;

alter system set max_dump_file_size=unlimited;

alter system set tracefile_identifier=’10046evnt1′;

alter system set events ‘10046 trace name context forever , level 12’;

alter system set events ‘10053 trace name context forever , level 1’;

alter system set events ‘10046 trace name context off’;

alter system set events ‘10053 trace name context off’;

 

11. alter session 명령으로 ORA-4031 에러에 대한 event 걸기(immediate로 즉각 떨어지도록)

alter session set max_dump_file_size=unlimited;

alter session set tracefile_identifier=’4031evnt1′;

alter session set events ‘04031 trace name errorstack level 3’;

alter session set events ‘04031 trace name systemstate level 10’;

 

12. sqlplus 로 접속이 불가능할 경우 백그라운드 프로세스의 systemstate 덤프 뜨기

위험한 명령임, 서비스 중엔 사용금지, 문제 발생으로 DB를 내리기전에 수행

OS debuger를 사용하면 특정 process에게 특정 function을 호출하도록 할 수

있습니다. 이러한 점을 이용하면 ORACLE에서 systemstate dump를 요청할 때

사용하는 ksudss function을 호출할 수 있으며, 절차는 아래와 같습니다.

cf> dbx -> 유닉스에서 사용

gdb -> 리눅스에서 사용

 

1) 먼저 attach할 ORACLE process에 대한 OS PID를 알아 둡니다.

(여기서는 PMON process를 예를 들었습니다.)

$ ps -ef | grep $ORACLE_SID | grep pmon

aprdbms 1432 1 0 23:14:50 ? 0:00 ora_pmon_APR920U6

2) Pmon process에 debuger를 사용하여 attach합니다.

$gdb $ORACLE_HOME/bin/oracle 1432

3) Ksudss function을 호출합니다.

gdb) call ksudss (10)

4) Pmon은 ksudss를 호출하여 systemstate dump를 받게 됩니다.

attach한 process가 ksudss function call 요청을 받아 들이기 위해서는

system call을 수행 중에 있지 않아야 합니다.

 

13. Tracing Oracle Process 를 통해서 서버 프로세스 트레이스 확인

– os에서 어떻게 처리하고 있는지를 확인할 경우 사용

– DB를 내릴 것이 아니라면 background 프로세스에 실행하지 말것

– db가 내려갈 수 있으므로 프로세스에 대한 OS trace를 남기고자 할 경우에

세션을 죽이기 전에 수행하기

– where에 나온 부분에서 읽는 방법은 거꾸로 올라가며 읽어야 함

 

$dbx -a (프로세스id) 또는 gdb $ORACLE_HOME/bin/oracle 11270

(dbx) where

(dbx) detach

 

– 예>

PROD:/opt/oracle/product/9.2.0/network/admin$script dbx.log

Script started, file is dbx.log

PROD:/opt/oracle/product/9.2.0/network/admin$gdb $ORACLE_HOME/bin/oracle 11270

GNU gdb Red Hat Linux (5.3.90-0.20030710.40rh)

Copyright 2003 Free Software Foundation, Inc.

(gdb) where

#0 0xb71836e1 in fsync () from /lib/i686/libpthread.so.0

#1 0x09826f33 in skgfcfi ()

#2 0x082bf561 in ksfdcls ()

#3 0x08b669ea in kcflckf ()

#4 0x08b66bc3 in kcflbi ()

#5 0x00000003 in ?? ()

#6 0x0ae0bb44 in ?? ()

#7 0x00000010 in ?? ()

#8 0x565fa0cc in ?? ()

#9 0x00080002 in ?? ()

(gdb) detach

ctrl+c

$ script off

 

14. truss 남기기(db를 내리기 전에 OS에서 수행, 평상시 사용 금지) note 110888.1

(1) hp-ux 의 경우

$ tusc -afpo

(2) AIX 5L

$ truss -aefo

(3) LINUX

$ strace -fo

(4) solaris

$ truss -aefo

예) truss -o truss.txt -p (process pid)

truss -p (process id)

 

(5) sqlplus통해서 db기동시 에러가 날 경우(예를들어 ORA-27302 failure occured at skgxpvaddr9

truss를 이용해서 sqlplus 에 접속후를 truss 남기기

linux의 경우 strace -o truss.log sqlplus ‘/as sysdba’ 이 명령으로 들어가기

$truss -o truss.log -fae sqlplus ‘/as sysdba’

sql> startup

ORA-27302 failure occured at skgxpvaddr9

$cat truss.log

15. 네트워크에 대한 클라이언트 trace 남기기

– 클라이언트에서 sqlnet.ora 파일에서

trace_level_client=16

trace_directory_client=c:\temp (윈도우)

log_directory_client=/tmp (유닉스)

 

16. dump, error , stack의 종류 및 최대 레벨

10046 event sql trace 남기기, level 12

10053 event 프로세스가 수행한 쿼리의 optimizer에 대한 정보, level 1

hanganalyze 시스템 hang이 걸렸을 경우 dump, level 4

errorstack 시스템 특정 에러 발생에 대해서 간단한 에러 정보 dump, level 3

systemstate dump 전체 시스템 상태에 대한 dump, level 10

heapdump 메모리 에러 발생시 heap영역에 대한 dump, level 3

 

17. event 종류

10046 sql trace 남기기, level 12는 bind변수 및 plan, tuning statistics 까지 출력

10053 optimizer에 대한 정보까지 출력, level 1 이 최대

10015 rollback segment를 분석 및 사용중지 하도록 하는 event

10233 index opereation 에서 corrupted index block을 skip하기

10061 disable SMON from cleaning temp segment(smon프로세스가 extent정리를 안하도록 설정)

 

출처 : http://haisins.epac.to/wordpress/?p=424