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 %'
)
/