Maxgauge와 같은 툴의 가장 큰 장점은 Oracle Hang 상황에서도 액티브 세션의 리스트를 얻을 수 있다는 것입니다. 대기 이벤트와 SQL 정보가 포함된 액티브 세션 목록이야말로 모든 성능 트러블슈팅의 시작입니다.
Maxgauge와 같은 툴이 Oracle Hang 상황에서도 데이터를 수집할 수 있는 것은 DMA(Direct Memory Access)를 사용하기 때문입니다. 이 방법은 Oracle의 COE(Center Of Expertise) 팀이 극한의 상황, 즉 SQL로 필요한 정보를 수집하지 못할 때 사용하던 방법입니다. 이것이 Maxgauge와 같은 툴 덕분에 보편화된 것입니다.
만일 Maxgauge와 같은 툴이 없다면 어떻게 해야 할까요? Oracle이 제공하는 ASHDUMP 기능을 Preliminary Connection과 함께 사용할 수 있습니다.
- Preliminary Connection이란 SQL*Net 방식이 아닌 Direct Memory Access 방식으로 Connection을 맺는 것을 말합니다.
- ASHDUMP는 액티브 세션 목록의 메모리 버전인 ASH(Active Session History)를 텍스트 파일에 기록하는 기능입니다.
따라서 위 두 기능을 같이 사용하면 마치 DMA 방식으로 액티브 세션의 목록을 얻는 것과 동일한 효과가 있습니다.
아래에 간단한 예제가 있습니다.
우선 Preliminary Connection을 맺습니다.
1 |
#> sqlplus -prelim sys/oracle@ukja1106 as sysdba |
3 |
SQL*Plus: Release 11.1.0.6.0 - Production on Mon Apr 26 09:43:35 2010 |
5 |
Copyright (c) 1982, 2007, Oracle. All rights reserved. |
일반적인 쿼리는 동작하지 않습니다.
1 |
alter session set nls_date_format= 'yyyy/mm/dd hh24:mi:ss' |
4 |
ORA-01012: not logged on |
6 |
Session ID: 0 Serial number: 0 |
Preliminary Connection 상태에서 ASHDUMP를 수행합니다. 레벨(10)은 10분을 의미합니다. 즉 지난 10분간의 ASH를 의미합니다.
1 |
SYS@ukja1106> oradebug setmypid |
3 |
SYS@ukja1106> oradebug dump ashdump 10 |
5 |
SYS@ukja1106> oradebug tracefile_name |
6 |
c:\oracle\diag\rdbms\ukja1106\ukja1106\trace\ukja1106_ora_12152.trc |
Dump 파일의 내용은 다음과 같습니다. 11g부터는 액티브 세션 목록과 함께 해당 목록을 테이블로 로딩하는 스크립트까지 함께 제공합니다. Hang의 악몽이 지나간 후(대부분 리스타트) 사후 분석을 위한 것입니다.
001 |
Processing Oradebug command 'dump ashdump 10' |
003 |
<<<ACTIVE BEGIN HEADER DUMP TRACE PROCESS - HISTORY SESSION>>> |
008 |
Step 1: Create destination table <ASHDUMP> |
010 |
CREATE TABLE ashdump AS |
011 |
SELECT * FROM SYS.WRH$_ACTIVE_SESSION_HISTORY WHERE rownum < 0 |
013 |
Step 2: Create the SQL*Loader control file <ASHLDR.CTL> as below |
016 |
infile * "str '\n####\n'" |
019 |
fields terminated by ',' optionally enclosed by '"' |
025 |
SAMPLE_TIME TIMESTAMP ENCLOSED BY '"' AND '"' "TO_TIMESTAMP(:SAMPLE_TIME , 'MM-DD-YYYY HH24:MI:SSXFF' ) " , |
033 |
FORCE_MATCHING_SIGNATURE , |
035 |
TOP_LEVEL_SQL_OPCODE , |
036 |
SQL_PLAN_HASH_VALUE , |
038 |
SQL_PLAN_OPERATION# , |
041 |
SQL_EXEC_START DATE 'MM/DD/YYYY HH24:MI:SS' ENCLOSED BY '" ' AND '"' ":SQL_EXEC_START " , |
042 |
PLSQL_ENTRY_OBJECT_ID , |
043 |
PLSQL_ENTRY_SUBPROGRAM_ID , |
045 |
PLSQL_SUBPROGRAM_ID , |
057 |
BLOCKING_SESSION_SERIAL# , |
072 |
--------------------------------------------------- |
073 |
Step 3: Load the ash rows dumped in this trace file |
074 |
--------------------------------------------------- |
075 |
sqlldr userid/password control=ashldr.ctl data=<THIS_TRACE_FILENAME> errors=1000000 |
076 |
--------------------------------------------------- |
077 |
<<<ACTIVE HEADER DUMP TRACE PROCESS - HISTORY SESSION END>>> |
078 |
<<<ACTIVE BEGIN DUMP TRACE PROCESS - HISTORY SESSION>>> |
080 |
58646642,1,12519562," 04-26-2010 09:44:01.822000000 ",160,1,2,0, |
081 |
" ",0,0,0," ",0,0,0,0,0, |
083 |
3213517201,9858,0,3,1,0,69788,4294967295,0, |
084 |
4294967295,0,0,0,0,,0,0,165959219, |
085 |
" ORACLE.EXE (CKPT) "," ", |
088 |
58646642,1,12519486," 04-26-2010 09:42:45.808000000 ",160,1,2,0, |
089 |
" ",0,0,0," ",0,0,0,0,0, |
091 |
3213517201,9767,1,1,1,0,38825,4294967295,0, |
092 |
4294967295,0,0,0,0,,0,0,165959219, |
093 |
" ORACLE.EXE (CKPT) "," ", |
096 |
58646642,1,12519416," 04-26-2010 09:41:35.770000000 ",160,1,2,0, |
097 |
" ",0,0,0," ",0,0,0,0,0, |
099 |
4078387448,9683,3,3,3,0,11083,4294967295,0, |
100 |
4294967295,0,0,0,0,,0,0,165959219, |
101 |
" ORACLE.EXE (CKPT) "," ", |
104 |
58646642,1,12519384," 04-26-2010 09:41:03.774000000 ",163,1,2,0, |
105 |
" ",0,0,0," ",0,0,0,0,0, |
107 |
3176176482,40612,5,1,1000,999888,0,4294967291,0, |
108 |
4294967295,0,0,0,0,,0,0,165959219, |
109 |
" ORACLE.EXE (DIA0) "," ", |
112 |
58646642,1,12519304," 04-26-2010 09:39:43.719000000 ",160,1,2,0, |
113 |
" ",0,0,0," ",0,0,0,0,0, |
115 |
3213517201,9551,1,1,1,0,38798,4294967295,0, |
116 |
4294967295,0,0,0,0,,0,0,165959219, |
117 |
" ORACLE.EXE (CKPT) "," ", |
120 |
58646642,1,12519265," 04-26-2010 09:39:04.663000000 ",163,1,2,0, |
121 |
" ",0,0,0," ",0,0,0,0,0, |
123 |
3176176482,40493,5,1,1000,999941,0,4294967291,0, |
124 |
4294967295,0,0,0,0,,0,0,165959219, |
125 |
" ORACLE.EXE (DIA0) "," ", |
128 |
58646642,1,12519183," 04-26-2010 09:37:42.554000000 ",160,1,2,0, |
129 |
" ",0,0,0," ",0,0,0,0,0, |
131 |
3213517201,9406,0,1,1,0,54077,4294967295,0, |
132 |
4294967295,0,0,0,0,,0,0,165959219, |
133 |
" ORACLE.EXE (CKPT) "," ", |
136 |
<<<ACTIVE DUMP TRACE PROCESS - HISTORY SESSION END >>> |
138 |
*** 2010-04-26 09:45:51.625 |
139 |
Oradebug command 'dump ashdump 10' console output : <NONE> |
사후 분석 용도로 사용되면 대단히 유용할 것입니다. Preliminary Connection에서는 전통적인 트러블슈팅 데이터인 Hang Analyze나 System State Dump도 사용 가능합니다. 단, Preliminary Connection와 oradebug는 비공식적인 지원 기능이기 때문에 철저한 테스트 후 사용해야 되며, 가능한 오라클 지원 엔지니어의 승인하에 사용해야 합니다.
더 자세한 정보들은 아래 문서를 참조하세요.
출처 : http://ukja.tistory.com/310