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 <process ID>
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 <output file> <pid> <executable>
(2) AIX 5L
$ truss -aefo <output file> <executable>
(3) LINUX
$ strace -fo <output file> <executable>
(4) solaris
$ truss -aefo <output file> <executable>
예) 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정리를 안하도록 설정)
'DB - ORACLE > Oracle Trouble Shooting' 카테고리의 다른 글
Data block이나 Index block이 corrupt 난 경우 (0) | 2015.09.03 |
---|---|
Rollback segment corrupt error message가 발생 했을 경우에 (0) | 2015.09.03 |
오라클 DB 서버의 CPU 소모 (1) | 2015.08.31 |
SYSAUX tablespace 줄이는 방법 (0) | 2015.08.24 |
깨져 나오는 글자를 확인 하는 방법 (0) | 2015.08.24 |