The following needs to be done by someone having SYSDBA
credentials, This will most likely be your DBA.
What is End to End
Application Tracing
End to End Application Tracing becomes possible with the use
of the CLIENT_IDENTIFIER attribute in V$SESSION dynamic performance view. Once the system is set up to capture the
login information by way of a trigger, this column can identify the client
session through all application tiers to the database server. Tracing based on the CLIENT_IDENTIFIER solves
the problem of knowing which session to trace, especially if there are multiple
applications accessing the same database instance.
Where to look for
trace files
select value from v$parameter where name = 'user_dump_dest';
What to include in
trace files
alter system set statistics_level = typical;
alter system set timed_statistics = true;
How to update the
CLIENT_IDENTIFIER attribute in V$SESSION
The CLIENT_IDENTIFIER column in the V$SESSION dynamic
performance view must to be updated with the client information attribute
before it can be used for tracing and the best way to do this is to use a logon
trigger. The person having SYSDBA
credentials has to create a logon trigger at the system level so that all
subsequent logons are identified at the time connection is made to the
database. In the logon trigger the
following function and stored procedures are utilized:
• SYS_CONTEXT
– Function returns the value of parameter associated with the context namespace
in the current instance
• DBMS_APPLICATION_INFO.SET_MODULE
– Procedure sets the name of the module that is currently running to a new
module
• DBMS_SESSION.SET_IDENTIFIER
– Procedure sets the client ID in the session
Here is an example of a logon trigger that identifies the
Operating System user account (os_user), the user account on the database, and
the name of the host from where the connection was made:
after logon
on database
declare
adtClientIdentifier varchar2(64);
begin
dbms_application_info.set_module(module_name => 'database_logon_trigger', action_name => 'select from dual');
select sys_context('userenv', 'os_user') ||':'|| user ||':'|| sys_context('userenv', 'host') into adtClientIdentifier from dual;
dbms_session.set_identifier(adtClientIdentifier );
dbms_application_info.set_module(null,null);
end;
/
Once the logon trigger is created, all subsequent logons
will be identified using the above information.
Note: There is no need to restart the database server as the
database trigger is active upon creation.
If the database trigger was created while the application server was
connected, the application server will have to be restarted so that the Client
Identifier information can be captured upon connection. As long as the database trigger is not
dropped, this feature will be enabled indefinitely, and it poses no impact to
performance.
The following query will show current connections with the
required information to begin tracing:
select sid, serial#, username, client_identifier,
service_name, module from v$session where username is not null order by 3,4,1;
SID SERIAL# USERNAME CLIENT_IDENTIFIER SERVICE_NAME MODULE
515 33,469 TEST
TEST:TEST:NA\L1234 TESTDB.TESTORA.com
1,265 22,825 TEST
TEST:TEST:NA\L1234 TESTDB.TESTORA.com TOAD background query session
2,778 53,565 TEST
TEST:TEST:NA\L1234 TESTDB.TESTORA.com TOAD 11.5.0.56
How to enable tracing
Tracing is enabled by using the CLIENT_ID_TRACE_ENABLE
procedure in the DBMS_MONITOR package.
The value for the CLIENT_ID parameter is obtained from the V$SESSION
view indicated above.
execute dbms_monitor.client_id_trace_enable (client_id =>
'<client_identifier>', waits => TRUE, binds => TRUE);
Note: Tracing should be left on only long enough to capture
the SQL needed for identifying the problem.
Do not leave it on for extended period of time as the trace file will
become too large and cumbersome to use.
For example:
SQL> execute dbms_monitor.client_id_trace_enable
(client_id => ' TEST:TEST:NA\L1234’, waits => TRUE, binds => TRUE);
PL/SQL procedure successfully completed
How to verify if
tracing is enabled
select
trace_type, primary_id, waits, binds from dba_enabled_traces;
How to disable
tracing
execute dbms_monitor.client_id_trace_disable (client_id
=> '<client_identifier>');
How does one merge
all the trace files into a single file
Oracle provides a
utility called trcsess written in Java which merges the trace information into
a single output file based on criteria.
The trcsess utility consolidates trace output from selected trace files based
on several criteria:
• Session
ID – Consolidates the trace information for the session specified. The session identifier is a combination of
session index and session serial number, such as 21.2371.
• Client ID
– Consolidates the trace information given client ID.
• Service
name – Consolidates the trace information for the given service name.
Note: You can locate these values in the V$SESSION view.
Using a command prompt on Windows or a terminal window on
UNIX/Linux, navigate to the user_dump_dest directory and issue the following
command:
trcsess output=<output file name>
clientid=<client_identifier> service=<service name> *.trc
Note: The utility
will look through all files having .trc file extension and extract only the
content that is relevant to the client_identifier using the service name.
For example:
> trcsess output=TEST_TRC.trc clientid=
TEST:TEST:NA\L1234 service=SYS$USERS *.trc
How does one extract
the SQL statements from the output file
Oracle provides a utility called TKPROF which formats the
contents of the trace file and places the output into a readable output
file. The various formatting options
available within TKPROF is beyond the scope of this document. To extract the SQL statements, issue the
following command using a command prompt on Windows or a terminal window on
UNIX/Linux:
tkprof tracefile outputfile sys=no record=filename
For example:
> tkprof TEST_TRC.trc
TEST_tkprof.rpt sys=no record=TEST_sql.txt