{
  "date": "2017-08-20T20:20:38",
  "slug": "get-trace-file-from-server-to-client",
  "link": "https://www.dbi-services.com/blog/get-trace-file-from-server-to-client/",
  "title": {
    "rendered": "Get trace file from server to client"
  },
  "content": {
    "rendered": "<h2>By Franck Pachot</h2>\n<p>.<br />\nThe old way to get a user dump trace file, for sql_trace (10046), Optimizer compilation trace (10053), lock trace (10704), Optimizer execution trace (10507),&#8230; is to go to the server trace directory. But if you don&#8217;t have access to the server (as in the &#9729;) the modern (12<em>c</em>R2) way is to select from V$DIAG_TRACE_FILE_CONTENTS. Before everybody is on 12.2 I&#8217;m sharing here a sqlplus script that I use for a long time to get the trace file to the client.<br />\n<!--more--><br />\nThis is a script to run with sqlplus passing as a parameter the name of the trace file you want to write to (because the original name on the server is not very meaningful). I close all cursors to get all info such as STAT lines. I get the trace file name from v$diag_info. If a directory exists I use it. If not I create one, named UDUMP, which I&#8217;ll remove at the end. Then the file is read by utl_file and spooled on client though dbms_output. At the end, I remove the trace file from the server.</p>\n<p>Here is the script &#8211; comments welcome.</p>\n<pre><code>set serveroutput on feedback off verify off termout off linesize 1024 trimspool on echo off\nspool &amp;1..trc\ndeclare\n fd utl_file.file_type;\n line varchar2(1024);\n l_tracename varchar2(512);\n l_directory_path all_directories.directory_path%TYPE;\n l_directory_name all_directories.directory_name%TYPE;\n l_directory_created boolean;\n procedure t (msg in varchar2) is begin dbms_output.put_line(msg); end;\nbegin\n /* use old parameter _cached_open_cursors to close all open cursors */\n for r in (select 1 from v$session_cursor_cache where count&gt;0) loop\n  dbms_session.set_close_cached_open_cursors(true);\n  rollback;\n  commit;\n  dbms_session.set_close_cached_open_cursors(false);\n end loop;\n /* get trace directory and trace file name */\n select value into l_directory_path from v$diag_info where name='Diag Trace';\n select substr(replace(value,l_directory_path,''),2) into l_tracename from v$diag_info where name='Default Trace File';\n /* get directory name for it, or try to create it */\n l_directory_created:=false;\n begin\n  select directory_name into l_directory_name from all_directories where directory_path = l_directory_path and rownum=1;\n exception\n  when no_data_found then\n   begin\n    l_directory_name:='UDUMP';\n    execute immediate 'create directory '||l_directory_name||' as '''||l_directory_path||'''';\n    l_directory_created:=true;\n   exception when others then\n    raise_application_error(-20000,'You must CREATE DIRECTORY '||l_directory_name||' as ''' ||l_directory_path||'''; or be granted CREATE DIRECTORY.');\n   end;\n end;\n /* opens the trace file */\n begin\n  fd:=utl_file.fopen(l_directory_name,l_tracename,'R');\n exception when others then\n    raise_application_error(-20001,'Impossible to open file: '||l_tracename||' in '||l_directory_name||' ( '||l_directory_path||' )');\n end;\n /* read the trace file and prints it */\n begin\n  loop\n   begin\n    utl_file.get_line(fd,line);\n    dbms_output.put_line(line);\n   exception\n    when no_data_found then exit;\n    when others then\n     dbms_output.put_line('!!! error while reading file '||l_tracename||' in '||l_directory_name||' ( '||l_directory_path||' )');\n   end;\n  end loop;\n  /* close and remove the file from the server */\n  utl_file.fclose(fd);\n  utl_file.fremove(l_directory_name,l_tracename);\n exception\n  when others then\n   raise_application_error(-20002,'Impossible to remove: '||l_tracename||' in '||l_directory_name||' ( '||l_directory_path||' )');\n end;\n begin\n  /* drop directory if created */\n  if l_directory_created then execute immediate 'drop directory '||l_directory_name; end if;\n exception\n  when others then\n   raise_application_error(-20002,'Impossible to remove directory: '||l_directory_name||' ( '||l_directory_path||' )'||sqlerrm);\n end;\nend;\n/\nspool off\n</code></pre>\n",
    "protected": false
  }
}
