1 julian dyke independent consultant oracle diagnostics web version juliandyke.com © 2005 julian...

90
1 Julian Dyke Independent Consultant Oracle Diagnostics Web Version juliandyke.co © 2005 Julian Dyke

Upload: merilyn-oconnor

Post on 17-Dec-2015

225 views

Category:

Documents


3 download

TRANSCRIPT

1

Julian Dyke

Independent Consultant

OracleDiagnostics

Web Version

juliandyke.com

© 2005 Julian Dyke

2

juliandyke.com

© 2005 Julian Dyke

Warning Much of the content of this presentation is undocumented

and unsupported by Oracle

Check with Oracle support before using any of these features in a production environment

3

juliandyke.com

© 2005 Julian Dyke

Trace Parameters To include timed statistics in trace files

timed_statistics = TRUE

To specify the log file destination

_trace_files_public = TRUE

max_dump_file_size = <size>

user_dump_dest = '<directory_name>'background_dump_dest = '<directory_name'>

To specify maximum trace file size

To allow other users to read trace files

4

juliandyke.com

© 2005 Julian Dyke

Trace File Identifier In Oracle 8.1.7 and above, a trace file identifier can be

specified

tracefile_identifier = '<identifier>'

e.g. in Oracle 9.2 if a trace file is called

ss92001_ora_1760.trc

ss92001_ora_1760_test.trc

then the statement

will change the file name to

ALTER SESSION SET tracefile_identifier = 'test';

5

juliandyke.com

© 2005 Julian Dyke

Trace File Names In Oracle 9.2 foreground process trace file names are in the

following formats

Process Type Name

ss92001_ora_1234.trc Foreground Process

ss92001_p000_1234.trc Parallel execution slave

ss92001_j000_1234.trc Job queue process

ss92001_d000_1234.trc Dispatcher process

ss92001_s000_1234.trc Shared Server process

These trace files are written to the USER_DUMP_DEST directory In Oracle 9.2 background process trace file names are in the format

ss92001_<process_name>_1234.trc

These trace files are written to the BACKGROUND_DUMP_DEST directory

6

juliandyke.com

© 2005 Julian Dyke

Events There are four types of numeric events

Immediate dumps Conditional dumps Trace dumps Change database behaviour

Each event has 1 or more level which can be range e.g. 1 to 10 bitmask e.g. 0x01 0x02 0x04 0x08 0x10 etc flag e.g. 0 = off; 1 = on identifier e.g. object id, memory address, etc

7

juliandyke.com

© 2005 Julian Dyke

Events To enable a numeric event at instance level

# In init.ora fileevent = '<event> trace name context forever, level <level>';

ALTER SYSTEM SET EVENTS'<event> trace name context forever, level <level>';

To enable a numeric event at session level

ALTER SESSION SET EVENTS'<event> trace name context forever, level <level>';

Alternatively use ORADEBUG DBMS_SYSTEM.SETEV

8

juliandyke.com

© 2005 Julian Dyke

Events To dump all event messages

SET SERVEROUTPUT ON

DECLAREerr_msg VARCHAR2(120);

BEGINDBMS_OUTPUT.ENABLE (1000000);FOR err_num IN 10000..10999 LOOP

err_msg := SQLERRM (-err_num);IF err_msg NOT LIKE '%Message '||err_num||' not found%' THEN

DBMS_OUTPUT.PUT_LINE (err_msg);END IF;

END LOOP;END;/

9

juliandyke.com

© 2005 Julian Dyke

Events On Unix systems event messages are in the formatted text file

event=10000while [ $event -ne 10999 ]do

event=`expr $event + 1`oerr ora $event

done

To print detailed event messages (Unix only)

$ORACLE_HOME/rdbms/mesg/oraus.msg

10 juliandyke.co

m

© 2005 Julian Dyke

Events To check which events are enabled in the current session

SET SERVEROUTPUT ON

DECLAREl_level NUMBER;

BEGINFOR l_event IN 10000..10999 LOOP

dbms_system.read_ev (l_event,l_level);IF (l_level > 0) THEN

dbms_output.put_line ('Event '||TO_CHAR (l_event) ||' is set at level '||TO_CHAR (l_level));

END IF;END LOOP;

END;/

11

juliandyke.com

© 2005 Julian Dyke

SQL Trace SQL_TRACE is event 10046 level 1 Other levels are

Level Description

0 Disabled

1 Same as ALTER SESSION SET sql_trace = TRUE

4 Include bind information

8 Include event wait statistics

12 Include bind information and event wait statistics

See Metalink Note 39817.1 for details of trace output

12 juliandyke.co

m

© 2005 Julian Dyke

Optimiser Decisions To trace the computations performed by the CBO when

optimising SQL statements use

ALTER SESSION SET EVENTS '10053 TRACE NAME CONTEXT FOREVER, LEVEL <level>';

Level Description

1 Print statistics and computations

2 Print computations only

See "A Look under the Hood of CBO : The 10053 Event"Wolfgang Breitling - www.centrexcc.com

13 juliandyke.co

m

© 2005 Julian Dyke

Events Tracing SQL Execution

10032 Sorts 10

10033 Intermediate Sort Runs 10

10104 Hash Joins 10

10128 Partition Pruning

10224 Index Blocks Splits / Deletes 1

10270 Shared Cursors 1

10299 Prefetching 1

10357 Direct Path Load 1

10730 VPD/FGAC/RLS predicates 1

10731 CURSOR expressions 1

Tracing Parallel Execution

10390 Parallel Query Slave Execution

10391 Parallel Query Granule Assignment

10393 Parallel Query Statistics

14 juliandyke.co

m

© 2005 Julian Dyke

Events Tracing Bitmap Indexes

10608 Bitmap Index Creation 10

10710 Bitmap Index Access 1

10711 Bitmap Index Merge 1

10712 Bitmap Index Or 1

10713 Bitmap Index And 1

10714 Bitmap Index Minus 1

10715 Bitmap Index Conversion to ROWIDs 1

10716 Bitmap Index Compress/Decompress 1

10717 Bitmap Index Compaction 1

10719 Bitmap Index DML 1

10608 Bitmap Index Creation 1

10710 Bitmap Index Access 1

Tracing Remote Processing

10079 Data sent/received via SQL*Net 1

10241 Remote SQL Execution 10

15 juliandyke.co

m

© 2005 Julian Dyke

Events Tracing Space Management

10045 Free List Management

10081 High Water Mark Changes

10225 Extent Management (Dictionary Managed)

Tracing Undo/Read Consistency

10013 Monitor transaction recovery during startup

10015 Dump Undo Segment Headers before and after transaction recovery

10200 Consistent Read

10201 Consistent Read Undo Application

10220 Changes to Undo Header

16 juliandyke.co

m

© 2005 Julian Dyke

Enabling SQL Trace At the session level

For extended trace use

-- Enable SQL traceALTER SESSION SET sql_trace = TRUE;

-- Enable SQL trace with bindsALTER SESSION SET EVENTS'10046 trace name context forever, level 4';

-- Disable SQL traceALTER SESSION SET sql_trace = FALSE;

-- Disable SQL trace with bindsALTER SESSION SET EVENTS'10046 trace name context off';

17 juliandyke.co

m

© 2005 Julian Dyke

Enabling SQL Trace To enable at instance level

# Enable SQL tracesql_trace = TRUE

# Enable SQL*trace with bindsevent = '10046 trace name context forever, level 4';

The SQL_TRACE parameter cannot be modified directly using ALTER SYSTEM. Instead use

-- Enable SQL trace for instance ALTER SYSTEM SET EVENTS'10046 trace name context forever, level 1;

-- Disable SQL trace for instanceALTER SYSTEM SET EVENTS'10046 trace name context off';

18 juliandyke.co

m

© 2005 Julian Dyke

Editing a Trace File from SQL*Plus Example (Oracle 9.2.0 on Windows 2000)

SET SUFFIX TRCCOLUMN filename NEW_VALUE filename

SELECT p1.value||'\'||p2.value||'_ora_'||p.spid filenameFROM

v$process p, v$session s, v$parameter p1, v$parameter p2

WHERE p1.name = 'user_dump_dest'AND p2.name = 'db_name'AND p.addr = s.paddrAND s.audsid = USERENV ('SESSIONID');

EDIT &&filenameSET SUFFIX SQLCOLUMN filename CLEAR

19 juliandyke.co

m

© 2005 Julian Dyke

Circular Trace Buffers To enable circular tracing

ALTER SESSION SET EVENTS 'immediate trace name trace_buffer_on level <level>';

where <level> is the size of the trace buffer in bytes

To dump the contents of the circular trace buffer

ALTER SESSION SET EVENTS 'immediate trace name trace_buffer_off';

20 juliandyke.co

m

© 2005 Julian Dyke

DBMS_SESSION Event 10046 level 1 trace can be enabled using

DBMS_SESSION.SET_SQL_TRACE( FLAG BOOLEAN -- TRUE to enable;

-- FALSE to disable );

Useful within PL/SQL blocks ALTER SESSION privilege not required

21 juliandyke.co

m

© 2005 Julian Dyke

Using System Triggers Login as SYS (AS SYSDBA)

ALTER TRIGGER us01_login ENABLE;

CREATE OR REPLACE TRIGGER us01_logoffBEFORE LOGOFF ON us01.SCHEMABEGIN

dbms_session.set_sql_trace (FALSE);END;

CREATE OR REPLACE TRIGGER us01_logonAFTER LOGON ON us01.SCHEMABEGIN

dbms_session.set_sql_trace (TRUE);END;

ALTER TRIGGER us01_login DISABLE;

22 juliandyke.co

m

© 2005 Julian Dyke

DBMS_SYSTEM Undocumented package Installed in all versions Owned by SYS user

GRANT EXECUTE ON DBMS_SYSTEM TO <user>;

CREATE PUBLIC SYNONYM dbms_system FOR sys.dbms_system;

$ORACLE_HOME/rdbms/admin/dbmsutil.sql

23 juliandyke.co

m

© 2005 Julian Dyke

DBMS_SYSTEM To enable trace in another session use

DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION( SI NUMBER, -- SID

SE NUMBER, -- Serial Number SQL_TRACE BOOLEAN -- TRUE to enable;

-- FALSE to disable );

SID and Serial number can be found in V$SESSION (SID and SERIAL#)

24 juliandyke.co

m

© 2005 Julian Dyke

To set a Boolean parameter in another session use

ORADEBUG SUSPEND

For example

SET_BOOL_PARAM_IN_SESSION

DBMS_SYSTEM.SET_BOOL_PARAM_IN_SESSION( SID NUMBER, -- SID

SERIAL# NUMBER, -- Serial NumberPARNAM VARCHAR2, -- Parameter NameBVAL BOOLEAN -- Value

);

EXECUTE DBMS_SYSTEM.SET_BOOL_PARAM_IN_SESSION(9, 27, 'hash_join_enabled', TRUE);

Note: does not work with SQL_TRACE

DBMS_SYSTEM

25 juliandyke.co

m

© 2005 Julian Dyke

To set an integer parameter in another session use

ORADEBUG SUSPEND

For example

SET_BOOL_PARAM_IN_SESSION

DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION( SID NUMBER, -- SID

SERIAL# NUMBER, -- Serial NumberPARNAM VARCHAR2, -- Parameter NameINTVAL INTEGER -- Value

);

EXECUTE DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION(9, 27, 'sort_area_size', 131072);

DBMS_SYSTEM

26 juliandyke.co

m

© 2005 Julian Dyke

DBMS_SYSTEM To set an event in another session use

DBMS_SYSTEM.SET_EV( SI NUMBER, -- SID

SE NUMBER, -- Serial NumberEV NUMBER, -- Event Number e.g. 10046 LE NUMBER, -- Level e.g. 1NM VARCHAR2 -- Action Name – can be ''

);

Disable using same SID, serial number and event with level 0

27 juliandyke.co

m

© 2005 Julian Dyke

DBMS_SYSTEM To write to trace files and/or alert log use

DBMS_SYSTEM.KSDWRT(

DEST NUMBER, -- 1 = Trace File, 2 = Alert LogTST VARCHAR2 -- Message

);

Example

BEGIN DBMS_SYSTEM.KSDWRT (1, ‘Output to trace file’);

DBMS_SYSTEM.KSDWRT (2, ‘Output to alert log’);END;/

28 juliandyke.co

m

© 2005 Julian Dyke

DBMS_SYSTEM To write the date and time to a trace file use

EXECUTE DBMS_SYSTEM.KSDDDT;

To indent output in the trace file use

EXECUTE DBMS_SYSTEM.KSDIND (<level>);

To flush the contents of the trace buffer to disk use

EXECUTE DBMS_SYSTEM.KSDFLS;

This will prefix KSDWRT output with <level> colons

29 juliandyke.co

m

© 2005 Julian Dyke

DBMS_SUPPORT Available in Oracle 7.2 and above Requires dbmssupp.sql and prvtsupp.plb See Metalink Note 62294.1 Install using SYS AS SYSDBA

$ORACLE_HOME/rdbms/admin/dbmssupp.sql

GRANT EXECUTE ON DBMS_SUPPORT TO <user>;

CREATE PUBLIC SYNONYM dbms_support FOR sys.dbms_support;

FUNCTION DBMS_SUPPORT.MYSIDRETURN BOOLEAN;

SELECT sid FROM v$mystatWHERE ROWNUM = 1;

This function executes the query

To get SID of current session use

30 juliandyke.co

m

© 2005 Julian Dyke

DBMS_SUPPORT To enable SQL trace in the current session use

DBMS_SUPPORT.START_TRACE( WAITS BOOLEAN, -- Include waits (default FALSE)

BINDS BOOLEAN -- Include binds (default FALSE));

DBMS_SUPPORT.STOP_TRACE;

To disable use

31 juliandyke.co

m

© 2005 Julian Dyke

DBMS_SUPPORT To enable SQL trace in another session use

DBMS_SUPPORT.START_TRACE_IN_SESSION( SI NUMBER, -- SID

SE NUMBER, -- Serial Number (can be 0)WAITS BOOLEAN, -- Include waits (default FALSE) BINDS BOOLEAN -- Include binds (default FALSE)

);

DBMS_SUPPORT.STOP_TRACE_IN_SESSION( SI NUMBER, -- SID

SE NUMBER -- Serial Number (can be 0));

To disable use

32 juliandyke.co

m

© 2005 Julian Dyke

DBMS_MONITOR Introduced in Oracle 10.1 To enable trace in another session use

DBMS_MONITOR.SESSION_TRACE_ENABLE( SESSION_ID NUMBER, -- SID

SERIAL_NUM NUMBER, -- Serial Number WAITS BOOLEAN, -- Include Waits BINDS BOOLEAN -- Include Binds

);

To disable trace in another session use

DBMS_MONITOR.SESSION_TRACE_DISABLE( SESSION_ID NUMBER, -- SID

SERIAL_NUM NUMBER -- Serial Number );

33 juliandyke.co

m

© 2005 Julian Dyke

DBMS_MONITOR Trace can be enabled using client identifiers To set a client identifier use

The client identifier for a specific session can be found by querying V$SESSION.CLIENT_IDENTIFIER

DBMS_SESSION.SET_IDENTIFIER( CLIENT_ID VARCHAR2 -- Client ID );

34 juliandyke.co

m

© 2005 Julian Dyke

DBMS_MONITOR Trace can be enabled using client identifiers

To enable trace for a specific client use

DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE( CLIENT_ID NUMBER, -- Client ID

WAITS BOOLEAN, -- Include Waits BINDS BOOLEAN -- Include Binds

);

Trace can be disabled using DBMS_MONITOR.CLIENT_ID_TRACE_DISABLE

35 juliandyke.co

m

© 2005 Julian Dyke

DBMS_MONITOR Trace can be enabled for a specific

service service and module service, module and action

To add a service in a RAC database use DBCA Enterprise Manager (Oracle 10.2 and above)

36 juliandyke.co

m

© 2005 Julian Dyke

DBMS_MONITOR To add a service in a single instance environment Set the SERVICE_NAMES parameter e.g.

service_names = 'LX101001, SERVICE1'

Add the service to TNSNAMES.ORA e.g.

SERVICE1 = (DESCRIPTON =

(ADDRESS = (PROTOCOL=TCP)(HOST=server1)(PORT=1521))

)(CONNECT_DATA =

(SERVICE_NAME = SERVICE1))

)

37 juliandyke.co

m

© 2005 Julian Dyke

DBMS_MONITOR

DBMS_APPLICATION_INFO.SET_MODULE( MODULE_NAME VARCHAR2, -- Module

ACTION_NAME VARCHAR2 -- Action );

To specify subsequent actions use

DBMS_APPLICATION_INFO.SET_ACTION( ACTION_NAME VARCHAR2 -- Action );

To specify a module and action use

38 juliandyke.co

m

© 2005 Julian Dyke

DBMS_MONITOR To enable trace for a specific module and action use

DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE( SERVICE_NAME VARCHAR2, -- Service Name

MODULE_NAME VARCHAR2, -- ModuleACTION_NAME VARCHAR2, -- ActionWAITS BOOLEAN, -- WaitsBINDS BOOLEAN, -- BindsINSTANCE_NAME VARCHAR2 -- Instance

);

If ACTION_NAME is not specified, entire module will be traced

Tracing can be disabled using SERV_MOD_ACT_TRACE_DISABLE

39 juliandyke.co

m

© 2005 Julian Dyke

DBMS_MONITOR To enable statistics collection for a specific client

DBMS_MONITOR.CLIENT_ID_STAT_ENABLE( CLIENT_ID VARCHAR2 -- Client ID);

Statistics externalized in V$CLIENT_STATS Disable using DBMS_MONITOR.CLIENT_ID_STAT_DISABLE

To enable statistics collection for a specific module/action

DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE( SERVICE_NAME VARCHAR2, -- Service Name

MODULE_NAME VARCHAR2, -- ModuleACTION_NAME VARCHAR2 -- Action

);

Statistics externalized in V$SERV_MOD_ACT_STATS Disable using DBMS_MONITOR.SERV_MOD_ACT_STAT_DISABLE

40 juliandyke.co

m

© 2005 Julian Dyke

trcsess Introduced in Oracle 10.1 Conditionally extracts trace data Merges trace files

trcsess[output = <output_file_name>][session = <session_id>][clientid = <client_id>][service = <service_name>][module = <module_name>][action = <action_name>]<trace_file_names>

where trace_file_names can be space separated list of file names or '*' wildcard

service, action and module names are case sensitive

trcsess service=APP1 module=MODULE1 action=ACTION1 *

41 juliandyke.co

m

© 2005 Julian Dyke

DBA_ENABLED_TRACES Introduced in Oracle 10.1

Name Type

TRACE_TYPE VARCHAR2(21)

PRIMARY_ID VARCHAR2(64)

QUALIFIER_ID1 VARCHAR2(48)

QUALIFIER_ID2 VARCHAR2(32)

WAITS VARCHAR2(5)

BINDS VARCHAR2(5)

INSTANCE_NAME VARCHAR2(16) Trace type can be

CLIENT_ID SERVICE SERVICE_MODULE SERVICE_MODULE_ACTION

Based on WRI$_TRACING_ENABLED

42 juliandyke.co

m

© 2005 Julian Dyke

ORADEBUG Undocumented debugging utility available

as a standalone utility on Unix (oradbx) as a standalone utility on VMS (orambx) within Server Manager (svrmgr) within SQL*Plus (8.1.5 and above)

ORADEBUG HELP

To use ORADEBUG within SQL*Plus login using

To list the available options

SQLPLUS /NOLOGSQL> CONNECT SYS/password AS SYSDBA

43 juliandyke.co

m

© 2005 Julian Dyke

ORADEBUG There are three ways of selecting a process using

ORADEBUG

Use current process

SQL> ORADEBUG SETMYPID

Use Oracle PID (V$PROCESS.PID)

SQL> ORADEBUG SETORAPID <pid>

Use Operating System PID (V$PROCESS.SPID)

SQL> ORADEBUG SETOSPID <spid>

This is the PID in Unix and the Thread ID in Windows NT/2000

44 juliandyke.co

m

© 2005 Julian Dyke

ORADEBUG To display the name of the current trace file use

To flush the current trace file use

ORADEBUG TRACEFILE_NAME

ORADEBUG FLUSH

To close the current trace file use

ORADEBUG CLOSE_TRACE

To set the maximum size of the current trace file to UNLIMITED use

ORADEBUG UNLIMIT

45 juliandyke.co

m

© 2005 Julian Dyke

ORADEBUG To list the available dumps

ORADEBUG DUMPLIST

E.g. for a level 4 dump of the library cache

ORADEBUG SETMYPIDORADEBUG DUMP LIBRARY_CACHE 4

ORADEBUG DUMP <dumpname> <level>

To perform a dump

46 juliandyke.co

m

© 2005 Julian Dyke

ORADEBUG To suspend the current process

While the process is suspended ORADEBUG can be used to dump perform memory/state dumps

Can be also used to temporarily suspend long running processes

ORADEBUG SUSPEND

To resume the current process

ORADEBUG RESUME

47 juliandyke.co

m

© 2005 Julian Dyke

ORADEBUG To dump the events currently set use

where level is

ORADEBUG DUMP EVENTS <level>

Level Description

1 Session

2 Process

3 System

Output is written to the current trace file

48 juliandyke.co

m

© 2005 Julian Dyke

ORADEBUG To enable events in another process

SELECT pid FROM v$process p, v$session s WHERE p.addr = s.paddr AND s.sid = <sid>;

SQL> ORADEBUG SETORAPID 8SQL> ORADEBUG EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12

e.g. to set event 10046 level 12 in Oracle process 8 use

For foreground processes Oracle Process ID can be obtained from Session ID using

49 juliandyke.co

m

© 2005 Julian Dyke

ORADEBUG To dump the value of an SGA variable use

ORADEBUG DUMPVAR SGA <variable name>

For example

kcbnhb_

prints the number of buffer cache hash buckets The names of SGA variables can be found in

X$KSMFSV.KSMFSNAM Variables in this view are suffixed with an underscore e.g.

ORADEBUG DUMPVAR SGA kcbnhb

50 juliandyke.co

m

© 2005 Julian Dyke

ORADEBUG In some versions it is possible to dump the entire SGA to file

Freeze the instance using

ORADEBUG FFBEGIN

Dump the SGA to file using

ORADEBUG SGATOFILE '<directory name>'

Unfreeze the instance using

ORADEBUG FFRESUMEINST

51 juliandyke.co

m

© 2005 Julian Dyke

Immediate Dumps There are three ways of taking an immediate dump

In the current session

ALTER SESSION SET EVENTS 'immediate trace name <dump> level <level>';

Using DBMS_SYSTEM

EXECUTE DBMS_SYSTEM.SET_EV(sid, serial#, 65535, <level>, '<dump'>);

ORADEBUG DUMP <dump> <level>

In ORADEBUG

Cannot be invoked from init.ora

52 juliandyke.co

m

© 2005 Julian Dyke

Conditional Dumps Invoked when an error occurs In the init.ora file

event = "<error> trace name <dump> level <level>"

ALTER SESSION SET EVENTS'<error> trace name <dump> level <level>';

In the current session

In ORADEBUG

ORADEBUG EVENT <error> trace name <dump> level <level>

ORADEBUG SESSION_EVENT <error> trace name <dump> level <level>

53 juliandyke.co

m

© 2005 Julian Dyke

Dumping Columns To dump the internal representation of columns use the DUMP

built-in function

DUMP (COLUMN_VALUE, FORMAT)

where FORMAT is

Format Description

8 Octal

10 Decimal

16 Hexadecimal

17 Single Character

54 juliandyke.co

m

© 2005 Julian Dyke

Dumping Columns For example

SELECT DUMP (1001,16) FROM dual;

Typ=2 Len=3: c2,b,2

returns

To output a column in hexadecimal use the 'XXXXXXXX' format mask e.g.

SELECT TO_CHAR (65536,'XXXXXXXX') FROM dual;

returns

10000

55 juliandyke.co

m

© 2005 Julian Dyke

Dumping a Database Block To dump a database block in Oracle 7 File number / block number must be converted into a data

block address

COLUMN decimalDBA new_value decimalDBA

SELECTdbms_utility.make_data_block_address (&file,&block) decimalDBA

FROM dual;

ALTER SESSION SET EVENTS 'immediate trace name blockdump level &decimalDBA';

56 juliandyke.co

m

© 2005 Julian Dyke

Dumping a Database Block To dump a database block in Oracle 8.0 or above

ALTER SYSTEM DUMP DATAFILE <absolute_file_number>BLOCK <block_number>;

ALTER SYSTEM DUMP DATAFILE <absolute_file_number>BLOCK MIN <minimum_block_number>BLOCK MAX <maximum_block_number>;

To dump a range of database blocks

To dump a block from a datafile in a closed database

ALTER SYSTEM DUMP DATAFILE '<file_name>'BLOCK <block_number>;

57 juliandyke.co

m

© 2005 Julian Dyke

Dumping a Database Block (Hex) To dump a database block in hexadecimal enable event 10289

ALTER SESSION SET EVENTS'10289 trace name context forever, level 1';

Then dump the block using

ALTER SYSTEM DUMP DATAFILE <absolute_file_number>BLOCK <block_number>;

On Unix/Linux systems blocks can also be dumped using od

ALTER SYSTEM CHECKPOINT;

dd bs=8k if=<filename> skip=200 count=4 | od -x

Force DBWR to flush recently written blocks to disk using

ALTER SYSTEM SWITCH LOGFILE;

or

58 juliandyke.co

m

© 2005 Julian Dyke

Dumping an Index An index tree can be dumped using

ALTER SESSION SET EVENTS'immediate trace name treedump level <object_id>;

where object_id is the object number of the index (in DBA_OBJECTS)

Dumps branches leaves contents of leaf blocks

59 juliandyke.co

m

© 2005 Julian Dyke

Dumping an Index In Oracle 9.2 treedump may crash if index has been created by

a primary/unique constraint e.g.

Occurs when IND$.PROPERTY > 256 Can be prevented by creating the index before creating the

constraint

CREATE TABLE t1 (c01 NUMBER);ALTER TABLE t1 ADD CONSTRAINT t1pk PRIMARY KEY (c01);

CREATE TABLE t1 (c01 NUMBER PRIMARY KEY);

60 juliandyke.co

m

© 2005 Julian Dyke

Dumping Undo/Rollback To dump an undo segment header use

ALTER SYSTEM DUMP UNDO_HEADER '<segment_name>';

To dump an undo transaction first obtain the XID using

ALTER SYSTEM DUMP UNDO BLOCK '<segment_name>'XID <xidusn> <xidslot> <xidsqn>;

SELECT xidusn, xidslot, xidsqn FROM v$transaction;

Dump the undo transaction using

61 juliandyke.co

m

© 2005 Julian Dyke

Dumping a Redo Log To identify the current redo log

ALTER SYSTEM DUMP LOGFILE '<logfilename>';

To dump a redo log file use

SELECT member FROM v$logfileWHERE group# = (

SELECT group# FROM v$logWHERE status = 'CURRENT'

);

Also works for archived redo logs

62 juliandyke.co

m

© 2005 Julian Dyke

Other File Dumps

File Headers

ALTER SESSION SET EVENTS 'immediate trace name file_hdrs level 7';

Redo Log Headers

ALTER SESSION SET EVENTS 'immediate trace name redohdr level 3';

ALTER SESSION SET EVENTS'immediate trace name controlf level 15';

Control Files

63 juliandyke.co

m

© 2005 Julian Dyke

Dumping the Library Cache To dump the library cache

Level Description

1 Dump library cache statistics

2 Include hash table histogram

3 Include dump of object handles

4 Include dump of object structures (heap 0)

ALTER SESSION SET EVENTS 'immediate trace name library_cache level <level>';

where level is

64 juliandyke.co

m

© 2005 Julian Dyke

Dumping the Row Cache To dump the row (dictionary) cache

Level Description

1 Dump row cache statistics

2 Include hash table histogram

8 Include dump of object structures

ALTER SESSION SET EVENTS 'immediate trace name row_cache level <level>';

where level is

65 juliandyke.co

m

© 2005 Julian Dyke

Dumping Fixed Memory Areas To dump the fixed memory areas

ALTER SESSION SET EVENTS immediate trace name global_area level <level>';

where level is

Level Description

1 Include PGA

2 Include SGA

4 Include UGA

8 Include indirect memory dumps

66 juliandyke.co

m

© 2005 Julian Dyke

Dumping the Fixed SGA The fixed SGA is externalised in X$KSMFSV

SELECT SUBSTR (ksmfsnam,1,20) AS "Name",SUBSTR (ksmfstyp,1,20) AS "Type",ksmfsadr AS "Address",ksmfssiz AS "Size"

FROM x$ksmfsv;

The fixed SGA can also be dumped using

ORADEBUG DUMPSGA

67 juliandyke.co

m

© 2005 Julian Dyke

Dumping Heap Memory

ALTER SESSION SET EVENTS 'immediate trace name heapdump level <level>';

To dump heap memory use

Level Description

1 PGA summary

2 SGA summary

4 UGA summary

8 Current call (CGA)

16 User call (CGA)

32 Large pool (LGA)

Level Description

1025 PGA with contents

2050 SGA with contents

5000 UGA with contents

8200 Current call with contents

16400 User call with contents

32800 Large pool with contents

where level is

68 juliandyke.co

m

© 2005 Julian Dyke

Dumping Subheap Memory In Oracle 9.0.1 and below

ALTER SESSION SET EVENTS 'immediate trace name heapdump_addr level <level>';

Get address of subheap e.g. 0x8057eb78 Convert to decimal e.g. 2153245560 For a summary dump use

ALTER SESSION SET EVENTS 'immediate trace name heapdump_addr level 2153245560';

For a detailed dump add 1 to the address e.g.

ALTER SESSION SET EVENTS 'immediate trace name heapdump_addr level 2153245561';

69 juliandyke.co

m

© 2005 Julian Dyke

Dumping Subheap Memory In Oracle 9.2 and above

For a summary dump use

ALTER SESSION SET EVENTS 'immediate trace name heapdump_addr level 1 addr 0x8057eb78';

ALTER SESSION SET EVENTS 'immediate trace name heapdump_addr level 2 addr 0x8057eb78 ';

For a detailed dump use

70 juliandyke.co

m

© 2005 Julian Dyke

SGA Memory SGA Memory can be accessed directly using X$KSMMEM Each row contains the four byte value at address ADDR in the

SGA Always use the INDX column to access this table For example, to select first word in SGA use

SELECT ksmmmval FROM x$ksmmemWHERE indx = 0;

X$KSMMEM is unreliable in Windows NT/2000 (causes ORA-3113)

71 juliandyke.co

m

© 2005 Julian Dyke

Dumping Buffers

ALTER SESSION SET EVENTS 'immediate trace name buffers level <level>';

To dump buffer headers and buffer contents

Levels Description

1 Buffer headers only

2 1 + block headers

3 2 + block contents

4 Buffer headers only + hash chain

5 1 + block headers + hash chain

6 2 + block contents + hash chain

8 Buffer headers only + hash chain + users/waiters

9 1 + block headers + hash chain + users/waiters

10 2 + block contents + hash chain + users/waiters

Levels are

72 juliandyke.co

m

© 2005 Julian Dyke

Dumping Specific Buffers To dump all buffers currently in the cache for a specific block First identify the tablespace number for the block e.g for TS01

ALTER SESSION SET EVENTS 'immediate trace name set_tsn_p1 level <level>';

SELECT ts# FROM sys.ts$WHERE name = 'TS01';

Set the tablespace number using

where level is the tablespace number + 1

73 juliandyke.co

m

© 2005 Julian Dyke

Dumping Specific Buffers

ALTER SESSION SET EVENTS 'immediate trace name buffer level <level>';

Identify the RDBA for the block This is equal to

RELATIVE_FNO * 4194304 + BLOCK_NUMBER

Dump the buffer using

where level is the RDBA e.g

e.g. for block 5/127874

= 5 * 4194304 + 127874 = 21099394

ALTER SESSION SET EVENTS 'immediate trace name buffer level 21099394';

74 juliandyke.co

m

© 2005 Julian Dyke

Flushing the Buffer Cache In Oracle 9.0.1 and above, to flush the buffer cache use

ALTER SYSTEM SET EVENTS 'immediate trace name flush_cache';

Appears to flush all buffer caches Only flushes unpinned buffers Moves all unpinned buffers to auxiliary replacement list

In Oracle 10.1 and above, to flush the buffer cache use

ALTER SYSTEM FLUSH BUFFER_CACHE;

75 juliandyke.co

m

© 2005 Julian Dyke

State Objects State objects are structures in the SGA describing state of

various database entities Common state objects include

# Description

2 Process

3 Call

4 Session

6 Enqueue

24 Buffer

34 DML Locks

38 Transaction

51 Library Object

52 Library Object Pin

61 Hash Table

76 juliandyke.co

m

© 2005 Julian Dyke

Dumping Process State

ALTER SESSION SET EVENTS 'immediate trace name processstate level 10';

A process state dump contains all the state objects for the process

Amount of library cache dump output for state object dumps can be limited using event 10065

Level Description

1 Address of library object only

2 As 1 plus library object lock details

3 As 2 plus library object handle and library object

Level 3 is the default

77 juliandyke.co

m

© 2005 Julian Dyke

Dumping System State

ALTER SESSION SET EVENTS 'immediate trace name systemstate level 10';

A system state dump contains a process state dump for each process

This prints a large amount of information Use HANG_ANALYZE for details on currently active

processes

78 juliandyke.co

m

© 2005 Julian Dyke

Dumping Hang Analysis

ALTER SESSION SET EVENTS 'immediate trace name hanganalyze level 5';

A hang analysis dump prints process state for active processes – e.g. waiting, blocking or spinning

Available in 8.0.6, 8.1.6 and above Not available in 8.1.5 Contains

system state level 1 process states error stacks

Oracle recommends level 5

79 juliandyke.co

m

© 2005 Julian Dyke

Dumping Error Stack

ALTER SESSION SET EVENTS 'immediate trace name errorstack level <level>';

An error stack describes the current state of a process. Includes the current SQL statement and the process state for

the process.

Level Description

0 Error stack only

1 Error stack and function call stack

2 As 1 plus the process state

3 As 2 plus the context area

Levels are

80 juliandyke.co

m

© 2005 Julian Dyke

Dumping Enqueues & Latches

ALTER SESSION SET EVENTS 'immediate trace name enqueues level <level>';

To dump the current state of the enqueues

Level Description

1 Hash Table

2 Enqueue headers

3 Enqueue details

Levels include

Levels include

ALTER SESSION SET EVENTS 'immediate trace name latches level <level>';

Level Description

1 Latches

2 Include statistics

To dump the current state of all latches

81 juliandyke.co

m

© 2005 Julian Dyke

Dumping Granules

ALTER SESSION SET EVENTS 'immediate trace name granulelist level <level>';

In Oracle 9.0.1 and above To dump the current state of all granules

Level Description

255 Null Granule

511 Home Granule

767 Shared Pool

1023 Large Pool

1279 Java Pool

1535 Buffer Pool

Levels include

Alternatively use X$KSMGE

82 juliandyke.co

m

© 2005 Julian Dyke

Dumping Shared Server / MTS To dump the current state of shared servers and dispatchers

ALTER SESSION SET EVENTS 'immediate trace name shared_server_state level <level>';

Levels 1-14 give increasing amounts of detail In 8.1.7 and below this is called MTSSTATE

EVENT='10248 trace name context forever, level 10';

To trace shared server behaviour

To trace dispatcher behaviour

EVENT='10249 trace name context forever, level 10';

83 juliandyke.co

m

© 2005 Julian Dyke

Oracle Net Services Tracing can be set for

SQL*Net Client SQL*Net Server Listener TNSPING Utility Names NAMESCTL Utility

See Metalink Note 219968.1

84 juliandyke.co

m

© 2005 Julian Dyke

Intelligent Agent Tracing can be set for

Intelligent Agent Agent Job Subsystem AGENTCTL Utility Data Collection Event Subsystem

See Metalink Note 177236.1

85 juliandyke.co

m

© 2005 Julian Dyke

RAC In ORADEBUG OPS/RAC trace can be obtained using LKDEBUG

ORADEBUG LKDEBUG -h

Usage:lkdebug [options]-l [r|p] <enqueue pointer> Enqueue Object-r <resource pointer> Resource Object-b <gcs shadow pointer> GCS shadow Object-p <process id> client pid-P <process pointer> Process Object-O <i1> <i2> <types> Oracle Format resname-a <res/lock/proc/pres> all <res/lock/proc/pres> pointers-a <res> [<type>] all <res> pointers by an optional type-a convlock all converting enqueue (pointers)-a convres all res ptr with converting enqueues-a name list all resource names-a hashcount list all resource hash bucket counts-t Traffic controller info-s summary of all enqueue types-k GES SGA summary info

86 juliandyke.co

m

© 2005 Julian Dyke

RAC

ORADEBUG –g DEF LKDEBUG –s

All instances can be specified for subsequent commands using

The –g command prefix can also be used with LKDEBUG e.g for the default instance

ORADEBUG SETINST "all"

A list of instances can be specified using

ORADEBUG SETINST "1 2"

ORADEBUG –g "1 2" LKDEBUG –a lock

e.g for a list of instances

87 juliandyke.co

m

© 2005 Julian Dyke

RAC

ALTER SESSION SET EVENTS 'immediate trace name gc_elements level <level>';

To dump the current state of the global cache elements with block dumps

To dump the current state of global cache elements

ALTER SESSION SET EVENTS 'immediate trace name locks level <level>';

88 juliandyke.co

m

© 2005 Julian Dyke

RAC

ALTER SESSION SET EVENTS '10704 trace name context forever, level 10';

To trace RAC buffer cache activity use

To trace which enqueues are being obtained use

ALTER SESSION SET EVENTS '10708 trace name context forever, level 10';

To trace global enqueue manipulation use

ALTER SESSION SET EVENTS '10706 trace name context forever, level 1';

_ksi_trace = 'TMTX';

To restrict the amount of information generated by this trace set _ksi_trace

e.g to restrict trace to TM and TX locks set

Instance(s) must be restarted after setting this parameter

89 juliandyke.co

m

© 2005 Julian Dyke

RAC Tracing can be set for

GSD GSDCTL SRVCONFIG SRVCTL

In Oracle 9.0.1 and 9.2 See Metalink Note 178683.1

In Oracle 10.1 and above Set the environment variable SRVM_TRACE to true

90 juliandyke.co

m

© 2005 Julian Dyke

Any Questions?

[email protected]

Julian Dyke

Intel Solution Services650 Wharfedale RoadWinnersh TriangleWokinghamBerkshireRG41 5TP