By Brian Fitzgerald
Trace 10046 is used to collect session diagnostic information, such as cursors, waits, and binds. Trace 10046 can also be used to investigate the internal workings of Oracle software. Trace 10046 can be used to localize errors. The tkprof utility formats 10046 trace files into a readable format.
The syntax for invoking trace 10046 and tkprof can be arcane, verbose, and error prone. Putting the commands in several files in a separate directory can lead to cleaner scripts and less cluttered directories. Using scripts can eliminate the manual steps of identifying the trace file and processing with tkprof. These scripts are for tracing “own session”.
Preliminary: To run trace 10046, the user must be granted alter session.
SQL> grant alter session to scott; Grant succeeded.
Scripts for trace 10046 and tkprof
The scripts are general purpose and can be used for more than one investigation. You should set environment SQLPATH to a common directory and put the scripts there. For example:
[oracle@stormking cdb12201 sqlplus]$ echo $SQLPATH /home/oracle/brian/sql/sqlplus
Here areĀ the scripts:
conn.pdba.scott.sql
A script for connecting to the schema.
conn scott/tiger@stormking:1521/pdba
trace.10046.on.sql
Start tracing
alter session set max_dump_file_size = '100M'; alter session set events '10046 trace name context forever, level 12';
trace.10046.off.sql
Stop tracing. Close the trace file.
alter session set events '10046 trace name context off';
tracefilename.sql
Display the trace file name. Set sqlplus substitution variable tracefilename
set verify off set trimspool on column tracefilename new_value tracefilename format a100 select value tracefilename from v$diag_info where name = 'Default Trace File';
tkprof.sql
Identify the trace file and process it with tkprof. Store the output in the current working directory.
@ tracefilename.sql column base new_value base select regexp_replace( '&&tracefilename', '.*/(.*).trc','\1' ) base from dual; define tkfile=&&base..tkp host tkprof &&tracefilename &&tkfile prompt created file: prompt &&tkfile
Demonstration
Here’s a simple example. User scott tries to run “show parameter”.
SQL> show parameter cursor ORA-00942: table or view does not exist
What table or view does not exist? The message does not say. Let’s trace and find out. Here is file show.parameter.demo.sql for tracing “show parameter”:
@ conn.pdba.scott.sql @ trace.10046.on.sql show parameter optimizer @ trace.10046.off.sql @ tkprof.sql
See how clean and simple it looks. Now run it:
[oracle@stormking cdb12201 parameter]$ sqlplus /nolog @ show.parameter.demo.sql SQL*Plus: Release 12.2.0.1.0 Production on Thu Jul 27 21:48:50 2017 Copyright (c) 1982, 2016, Oracle. All rights reserved. Connected. Session altered. Session altered. ORA-00942: table or view does not exist Session altered. TRACEFILENAME -------------------------------------------------------------------------------- /u01/app/oracle/diag/rdbms/cdb12201/cdb12201/trace/cdb12201_ora_29212.trc BASE ------------------ cdb12201_ora_29212 TKPROF: Release 12.2.0.1.0 - Development on Thu Jul 27 21:48:50 2017 Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved. created file: cdb12201_ora_29212.tkp
In cdb12201_ora_29212.tkp
The following statement encountered a error during parse: SELECT NAME NAME_COL_PLUS_SHOW_PARAM, DECODE(TYPE,1,'boolean',2,'string',3,'integer',4,'file',5,'number', 6,'big integer', 'unknown') TYPE, DISPLAY_VALUE VALUE_COL_PLUS_SHOW_PARAM FROM V$PARAMETER WHERE UPPER(NAME) LIKE UPPER(:NMBIND_SHOW_OBJ) ORDER BY NAME_COL_PLUS_SHOW_PARAM,ROWNUM Error encountered: ORA-00942
tkprof shows that “show parameter” failed because the user has no access to view v$parameter.
The trace file itself also shows the error:
PARSING IN CURSOR #140627652972696 len=289 dep=0 uid=112 oct=3 lid=112 tim=2237530714211 hv=2462394820 ad='b4be2118' sqlid='7cfz5wy9caaf4' SELECT NAME NAME_COL_PLUS_SHOW_PARAM,DECODE(TYPE,1,'boolean',2,'string',3,'integer',4,'file',5,'number', 6,'big integer', 'unknown') TYPE,DISPLAY_VALUE VALUE_COL_PLUS_SHOW_PARAM FROM V$PARAMETER WHERE UPPER(NAME) LIKE UPPER(:NMBIND_SHOW_OBJ) ORDER BY NAME_COL_PLUS_SHOW_PARAM,ROWNUM END OF STMT PARSE #140627652972696:c=0,e=0,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,plh=0,tim=2237530714211
User scott can confirm no access:
SQL> select * from V$PARAMETER where 1 = 2; select * from V$PARAMETER where 1 = 2 * ERROR at line 1: ORA-00942: table or view does not exist
To solve the user’s problem, select_catalog_role or some other role can be granted to user scott.
SQL> select grantee from dba_tab_privs where table_name = 'V_$PARAMETER' and grantee in ( select role from dba_roles ) order by grantee; GRANTEE ---------------------------------------------------------------------------- DV_SECANALYST SELECT_CATALOG_ROLE SQL> select grantee from dba_role_privs where granted_role = 'SELECT_CATALOG_ROLE' order by grantee; GRANTEE ---------------------------------------------------------------------------- DBA EM_EXPRESS_BASIC EXP_FULL_DATABASE IMP_FULL_DATABASE OEM_MONITOR SYS SYSBACKUP SYSUMF_ROLE 8 rows selected. SQL> select grantee from dba_sys_privs where privilege = 'SELECT ANY DICTIONARY' order by grantee; GRANTEE ---------------------------------------------------------------------------- DBA DBSNMP GGSYS GSMADMIN_INTERNAL OEM_MONITOR SYSBACKUP SYSDG WMSYS 8 rows selected.
Alternatively, we can create a new role:
SQL> conn / as sysdba Connected. SQL> alter session set container = pdba; Session altered. SQL> create role sqlplus_role; Role created. SQL> grant select on v_$parameter to sqlplus_role; Grant succeeded. SQL> grant sqlplus_role to scott; Grant succeeded. SQL> @ conn.pdba.scott.sql Connected. SQL> show parameter cursor NAME TYPE VALUE ------------------------------------ ----------- -------------------------- cursor_bind_capture_destination string memory+disk cursor_invalidation string IMMEDIATE cursor_sharing string EXACT cursor_space_for_time boolean FALSE open_cursors integer 300 session_cached_cursors integer 50
The user’s problem is solved. sqlplus command “show parameter” no longer throws ORA-00942.
Summary
- event 10046 can be used for performance diagnosis
- trace 10046 can also be used to investigate the inner workings of software
- trace 10046 can be used to identify the source of an error
- reusable sqlplus scripts belong in SQLPATH
- trace syntax can be saved in convenient scripts
- the result is less cluttered administrative scripts
- the task of identifying a the trace file and processing with tkprof can be handled in a single script
- sqlplus command “show parameter” requires access to v$parameter
- users can be granted limited privileges with custom roles