科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Oracle 10g第2版新特性之性能特性

Oracle 10g第2版新特性之性能特性

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

一天,出现了一个棘手的问题:一个设计糟糕的应用程序引起了严重的库高速缓存锁定问题,并且数据库呈现挂起状态。您必须快速确定导致该问题发生的会话,并快速终止这些会话。

作者:佚名 来源:Oracle技术网 2007年10月22日

关键字: ORACLE

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共5页)

检查是否启用了跟踪

  如果会话执行的任务和预期不符,或者执行速度比较慢,那么大多数数据库管理员的第一步是检查等待事件。要构建配置文件,您可能还需要长期跟踪会话,那么在 user_dump_dest 目录中将生成一个跟踪文件。

  现在,假设您在某段时间内对多个会话使用了端到端跟踪,但现在不知道哪些会话处于跟踪状态。如何找出这些对话呢?

  方法之一是对大量跟踪文件进行筛选,以提取 SID 和 Serial# 列并在数据库的 V$SESSION 视图中进行匹配。毋庸质疑,这个过程比较复杂、困难并且容易出错。Oracle 数据库 10g 第 2 版中提供了一个更优秀、更简单的方法:您所要做的只是查看一个视图,即 V$SESSION。

  新增了三个新列显示跟踪状态:
  • sql_trace - 如果在会话中启用了 SQL 跟踪,则显示 TRUE/FALSE
  • sql_trace_waits - 如果启用了会话跟踪,则可以让跟踪程序将等待信息写入跟踪文件,这对于诊断性能问题很有用。
  • sql_trace_binds - 如果会话使用绑定变量,则可以让跟踪程序将绑定变量值写入跟踪文件。该列显示 TRUE/FALSE。
  当未开启会话跟踪时,如果选择这些列:
select sid, serial#, sql_trace, sql_trace_waits, sql_trace_binds 
from v$session  
where username = 'HR' 

  输出结果如下:
SID    SERIAL# SQL_TRAC SQL_T SQL_T 
---------- ---------- -------- ----- ----- 
196      60946 DISABLED FALSE FALSE 

  此处您可以看到,SID 为 196、Serial# 为 60946 的会话未启用跟踪。

  现在,您可以对等待事件(而不是绑定变量)启用跟踪。可以使用程序包 dbms_monitor 启用跟踪。
begin 
dbms_monitor.session_trace_enable ( 
session_id   => 196, 
serial_num   => 60960, 
waits        => true, 
binds        => false 
   ); 
end; 
/ 

  现在,如果您要查看会话信息:
  select sid, serial#, sql_trace, sql_trace_waits, sql_trace_binds 
from v$session  
where username = 'HR' 

  输出结果如下:
SID    SERIAL# SQL_TRAC SQL_T SQL_T 
---------- ---------- -------- ----- ----- 
196      60960 ENABLED  TRUE  FALSE 

  注意,仅当使用程序包 dbms_monitor 中的过程 session_trace_enable 启用跟踪(而不是通过 alter session set sql_trace = true 或设置事件 10046)时,才会填充视图 V$SESSION。在以后的某个时间点上,如果您要查明哪些会话已经启用了跟踪,可以使用以上查询执行此操作。

  如果使用程序包 dbms_monitor 中的其他过程(如 SERV_MOD_ACT_TRACE_ENABLE 或 CLIENT_ID_TRACE_ENABLE)启用了跟踪,V$SESSION 视图将不显示该信息。相反,它们将记录到另一个视图 DBA_ENABLED_TRACES 中。可以将该视图与其他相关信息存储连接在一起以查看启用了跟踪的会话。例如,使用
SELECT *  
FROM (SELECT SID, 'SESSION_TRACE' trace_type 
FROM v$session 
WHERE sql_trace = 'ENABLED') 
UNION 
(SELECT SID, t.trace_type 
FROM v$session s, dba_enabled_traces t 
WHERE t.trace_type = 'CLIENT_ID' AND s.client_identifier = t.primary_id) 
UNION 
(SELECT SID, t.trace_type 
FROM v$session s, dba_enabled_traces t, v$instance i 
WHERE t.trace_type = 'SERVICE' 
AND s.service_name = t.primary_id 
AND (t.instance_name IS NULL OR t.instance_name = i.instance_name)) 
UNION 
(SELECT SID, t.trace_type 
FROM v$session s, dba_enabled_traces t, v$instance i 
WHERE t.trace_type = 'SERVICE_MODULE' 
AND s.service_name = t.primary_id 
AND s.module = t.qualifier_id1 
AND (t.instance_name IS NULL OR t.instance_name = i.instance_name)) 
UNION 
(SELECT SID, t.trace_type 
FROM v$session s, dba_enabled_traces t, v$instance i 
WHERE t.trace_type = 'SERVICE_MODULE_ACTION' 
AND s.service_name = t.primary_id 
AND s.module = t.qualifier_id1 
AND s.action = t.qualifier_id2 
AND (t.instance_name IS NULL OR t.instance_name = i.instance_name)) 
UNION 
(SELECT SID, t.trace_type 
FROM v$session s, dba_enabled_traces t, v$instance i 
WHERE t.trace_type = 'DATABASE' 
AND (t.instance_name IS NULL OR t.instance_name = i.instance_name)) 

  输出结果如下:
SID TRACE_TYPE 
---------- --------------------- 
136 SERVICE_MODULE 
136 SERVICE_MODULE_ACTION 

  您可以看到,您已经对会话 136 的 Service Module 和 Service Module Action 启用了跟踪。但 DBA_ENABLED_TRACES 并未显示绑定变量或等待事件。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章