ORACLE/ADMIN2012. 1. 2. 14:32
반응형

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
2   
3 SQL*Plus: Release 11.1.0.6.0 - Production on Mon Apr 26 09:43:35 2010
4   
5 Copyright (c) 1982, 2007, Oracle.  All rights reserved.
일반적인 쿼리는 동작하지 않습니다.
1 alter session set nls_date_format='yyyy/mm/dd hh24:mi:ss'
2 *
3 ERROR at line 1:
4 ORA-01012: not logged on
5 Process ID: 0
6 Session ID: 0 Serial number: 0
Preliminary Connection 상태에서 ASHDUMP를 수행합니다. 레벨(10)은 10분을 의미합니다. 즉 지난 10분간의 ASH를 의미합니다.
1 SYS@ukja1106> oradebug setmypid
2 Statement processed.
3 SYS@ukja1106> oradebug dump ashdump 10
4 Statement processed.
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'
002 ASH dump
003 <<<ACTIVE BEGIN HEADER DUMP TRACE PROCESS - HISTORY SESSION>>>
004 ****************
005 SCRIPT TO IMPORT
006 ****************
007 ------------------------------------------
008 Step 1: Create destination table <ASHDUMP>
009 ------------------------------------------
010 CREATE TABLE ashdump AS
011 SELECT * FROM SYS.WRH$_ACTIVE_SESSION_HISTORY WHERE rownum < 0
012 ----------------------------------------------------------------
013 Step 2: Create the SQL*Loader control file <ASHLDR.CTL> as below
014 ----------------------------------------------------------------
015 load data 
016 infile * "str '\n####\n'"
017 append
018 into table ashdump
019 fields terminated by ',' optionally enclosed by '"'
020 (                               
021 SNAP_ID  CONSTANT 0           , 
022 DBID                          , 
023 INSTANCE_NUMBER               , 
024 SAMPLE_ID                     , 
025 SAMPLE_TIME TIMESTAMP ENCLOSED BY '"' AND '"' "TO_TIMESTAMP(:SAMPLE_TIME   ,'MM-DD-YYYY HH24:MI:SSXFF')"   , 
026 SESSION_ID                    , 
027 SESSION_SERIAL#               , 
028 SESSION_TYPE                  , 
029 USER_ID                       , 
030 SQL_ID                        , 
031 SQL_CHILD_NUMBER              , 
032 SQL_OPCODE                    , 
033 FORCE_MATCHING_SIGNATURE      , 
034 TOP_LEVEL_SQL_ID              , 
035 TOP_LEVEL_SQL_OPCODE          , 
036 SQL_PLAN_HASH_VALUE           , 
037 SQL_PLAN_LINE_ID              , 
038 SQL_PLAN_OPERATION#           , 
039 SQL_PLAN_OPTIONS#             , 
040 SQL_EXEC_ID                   , 
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     , 
044 PLSQL_OBJECT_ID               , 
045 PLSQL_SUBPROGRAM_ID           , 
046 QC_INSTANCE_ID                , 
047 QC_SESSION_ID                 , 
048 QC_SESSION_SERIAL#            , 
049 EVENT_ID                      , 
050 SEQ#                          , 
051 P1                            , 
052 P2                            , 
053 P3                            , 
054 WAIT_TIME                     , 
055 TIME_WAITED                   , 
056 BLOCKING_SESSION              , 
057 BLOCKING_SESSION_SERIAL#      , 
058 CURRENT_OBJ#                  , 
059 CURRENT_FILE#                 , 
060 CURRENT_BLOCK#                , 
061 CURRENT_ROW#                  , 
062 CONSUMER_GROUP_ID             , 
063 XID                           , 
064 REMOTE_INSTANCE#              , 
065 TIME_MODEL                    , 
066 SERVICE_HASH                  , 
067 PROGRAM                       , 
068 MODULE                        , 
069 ACTION                        , 
070 CLIENT_ID                       
071 )                               
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>>>
079 ####
080 58646642,1,12519562,"04-26-2010 09:44:01.822000000",160,1,2,0,
081 "",0,0,0,"",0,0,0,0,0,
082 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)","",
086 "",""
087 ####
088 58646642,1,12519486,"04-26-2010 09:42:45.808000000",160,1,2,0,
089 "",0,0,0,"",0,0,0,0,0,
090 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)","",
094 "",""
095 ####
096 58646642,1,12519416,"04-26-2010 09:41:35.770000000",160,1,2,0,
097 "",0,0,0,"",0,0,0,0,0,
098 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)","",
102 "",""
103 ####
104 58646642,1,12519384,"04-26-2010 09:41:03.774000000",163,1,2,0,
105 "",0,0,0,"",0,0,0,0,0,
106 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)","",
110 "",""
111 ####
112 58646642,1,12519304,"04-26-2010 09:39:43.719000000",160,1,2,0,
113 "",0,0,0,"",0,0,0,0,0,
114 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)","",
118 "",""
119 ####
120 58646642,1,12519265,"04-26-2010 09:39:04.663000000",163,1,2,0,
121 "",0,0,0,"",0,0,0,0,0,
122 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)","",
126 "",""
127 ####
128 58646642,1,12519183,"04-26-2010 09:37:42.554000000",160,1,2,0,
129 "",0,0,0,"",0,0,0,0,0,
130 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)","",
134 "",""
135 ####
136 <<<ACTIVE DUMP TRACE PROCESS - HISTORY SESSION END>>>
137   
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

반응형
Posted by [PineTree]