sqlplus 之跟踪文件+警告文件

本文详细介绍了Oracle数据库中的SQL跟踪文件和警告日志文件,包括跟踪文件的位置、命名约定以及如何添加标记。此外,还讲解了告警日志的位置变化,并提供了查询警告日志的方法。

oracle数据库(以及应用服务器和oracle应用)都是可以充分测量的,数据库中这种测量性反应在以下几个方面:

V$视图                大多数V$视图都包含"调试"信息

审计命令            可以指定数据库要记录哪些事件以便日后分析

资源管理器(dbms_resource_manager)     允许对数据库中的资源(cpu、I/O等)实现微管理

oracle"事件"        基于oracle事件,能让oracle生成所需的跟踪或诊断信息

dbms_trace        这是pl/sql引擎中的一个工具,它会全面的记录存储过程的调用树、所产生的异常,以及遇到的错误

数据库事件触发器    这些触发器(如on servererror)允许你监控和记录你觉得"意外"或非正常的情况

sql_trace            这个sql跟踪工具还可以采用一种扩展方式使用,即通过10046 oracle事件


请求的跟踪文件

一般跟踪文件都是因为设置了sql_trace=true生成的结果,或者通过10046事件使用扩展的跟踪工具生成的:

sys@ORCL>alter session set events
  2  '10046 trace name context forever,level 12';
会话已更改。
1.文件位置

不论使用sql_trace还是扩展的跟踪工具,oracle都会在数据库服务器主机的以下两个位置生成一个跟踪文件:

专用服务器连接--在user_dump_dest参数指定的目录中生成跟踪文件

共享服务器连接--在background_dump_dest参数指定的目录中生成跟踪文件

sys@ORCL>select name,value from v$parameter where name like '%dump_dest%'
  2  /

NAME
--------------------------------------------------------------------------------

VALUE
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
----------------------------------------
background_dump_dest
d:\app\administrator\diag\rdbms\orcl\orcl\trace

user_dump_dest
d:\app\administrator\diag\rdbms\orcl\orcl\trace

core_dump_dest
d:\app\administrator\diag\rdbms\orcl\orcl\cdump

如果无法访问v$parameter视图,还可以使用dbms_utility来访问大多数(但不是全部)参数的值:

least_privs@ORCL>declare
  2  l_string varchar2(255);
  3  l_dummy number;
  4  begin
  5   l_dummy := dbms_utility.get_parameter_value
  6  ('background_dump_dest', l_dummy,l_string);
  7  dbms_output.put_line('background:'||l_string);
  8   l_dummy := dbms_utility.get_parameter_value
  9  ('user_dump_dest',l_dummy,l_string);
 10  dbms_output.put_line('user:'||l_string);
 11  end;
 12  /
background:d:\app\administrator\diag\rdbms\orcl\orcl\trace
user:d:\app\administrator\diag\rdbms\orcl\orcl\trace

PL/SQL 过程已成功完成。


2.命名约定

文件名的第一部分是oracle_sid

文件名的第二部分是ora

跟踪文件名中的数字是专用服务器的进程id,可以从v$process视图中得到


因为,在实际中(假设使用专用服务器模式),需要访问四个视图:

v$parameter    查找user_dump_dest指定的跟踪文件位置

v$process        查找进程ID

v$session        正确的标识其他视图中的会话信息

v$instance    得到oracle_sid

scott@ORCL>alter session set sql_trace=true;
会话已更改。

scott@ORCL>select c.value||'/'||d.instance_name||
  2  '_ora_'||a.spid||'.trc'trace
  3  from v$process a,  v$session b, v$parameter c   ,v$instance d
  4  where a.addr=b.paddr
  5  and b.audsid=userenv('sessionid')
  6  and c.name='user_dump_dest'
  7  /

TRACE
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
----------------------------------------
d:\app\administrator\diag\rdbms\orcl\orcl\trace/orcl_ora_4404.trc

3.对跟踪文件加标记

有一种办法可以对跟踪文件“加标记”,这样即使你无权访问v$process 和 v$session,也能找到跟踪文件。

假设你能读取user_dump_dest目录,就可以使用会话参数tracefile_identifier.采用这种方法,可以为跟踪文件名增加一个可以唯一标识的串:

scott@ORCL>alter session set tracefile_identifier='Look_For_Me';
会话已更改。

scott@ORCL>alter session set sql_trace=true;
会话已更改。


针对内部错误生成的跟踪文件

它们对oracle support有用。

如果得到内部错误,修改这个错误的唯一办法就是提交一个iTAR

----------------------------------------------------------------------


告警日志文件

是一类特殊的跟踪文件(trace file),命名一般为alert_<SID>.log,其中SID为ORACLE数据库实例名称。数据库告警日志是按时间顺序记录message和错误信息。

告警日志位置

在ORACLE 10g中,BACKGROUND_DUMP_DEST参数确定了告警日志的位置,但是告警日志的文件名无法修改,告警日志的名称为:alert_<SID>.log ,其中<SID>是实例的名称。BACKGROUND_DUMP_DEST参数是动态的。
scott@ORCL>show parameter background_dump_dest;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
background_dump_dest                 string      d:\app\administrator\diag\rdbm
                                                 s\orcl\orcl\trace


在ORACLE 11g 以及ORACLE 12c中,告警日志文件的位置有了变化。主要是因为引入了ADR(Automatic Diagnostic Repository:一个存放数据库诊断日志、跟踪文件的目录),关于ADR对应的目录位置可以通过查看v$diag_info系统视图:

scott@ORCL>select * from v$diag_info;

   INST_ID NAME
---------- ----------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
----------------------------------------
         1 Diag Enabled
TRUE

         1 ADR Base
d:\app\administrator

         1 ADR Home
d:\app\administrator\diag\rdbms\orcl\orcl

         1 Diag Trace
d:\app\administrator\diag\rdbms\orcl\orcl\trace

         1 Diag Alert
d:\app\administrator\diag\rdbms\orcl\orcl\alert

         1 Diag Incident
d:\app\administrator\diag\rdbms\orcl\orcl\incident

         1 Diag Cdump
d:\app\administrator\diag\rdbms\orcl\orcl\cdump

         1 Health Monitor
d:\app\administrator\diag\rdbms\orcl\orcl\hm

         1 Default Trace File
d:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_ora_4928.trc

         1 Active Problem Count
0

         1 Active Incident Count
0


已选择11行。

Diag Trace对应的目录为文本格式的告警日志文件所在的目录,而Diag Alert对应的目录为XML格式的警告日志(对应为log_x.xml)


以下代码 创建了一个外部表,以便查询警告日志:

scott@ORCL>create or replace directory data_dir as 'D:\app\Administrator\diag\rdbms\orcl\orcl\alert';

目录已创建。


scott@ORCL>create table alert_log
  2  (
  3  text_line varchar2(255)
  4  )
  5  organization external
  6  (
  7  type oracle_loader
  8  default directory data_dir
  9  access parameters
 10  (
 11  records delimited by newline
 12  fields
 13  reject rows with all null fields
 14  )
 15  location
 16  (
 17  'alert_AskUs.log'
 18  )
 19  )
 20  reject limit unlimited
 21  /

表已创建。

这样任何时间都能查询这些信息了:

select
  to_char(last_time,'dd-mon-yyyy hh24:mi') shutdown,
 to_char(start_time,'dd-mon-yyyy hh24:mi') shutup,
 round((start_time-last_time)*24*60,2) mins_down,
 round((last_time-lag(start_time) over(order by r)),2) days_up,
  case when (lead(r) over(order by r) is null)
 then round((sysdate-start_time),2)
  end  
  from (
	 select r,
	 to_date(last_time,'Dy Mon DD HH24:MI:SS YYYY') last_time,
	 to_date(start_time,'Dy Mon DD HH24:MI:SS YYYY') start_time
	 from(
	 select r,
	 text_line,
	 lag(text_line,1) over(order by r) start_time,
	 lag(text_line,2) over(order by r) last_time
		 from(
		 select rownum r,text_line
		 from alert_log
		 where text_line like '____:__:__20__'
		 or text_line like 'Starting ORACLE instance %'
		 )
	 )
 where text_line like 'Starting ORACLE instance %'
 )
 /





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值