oracle 怎么跟踪有问题session 的sql

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 怎么跟踪有问题session 的sql相关的知识,希望对你有一定的参考价值。

select sid,v$session.serial#,v$process.spid,v$session.username,last_call_et,status,LOCKWAIT,machine,logon_time,sql_text from v$session, v$process, v$sqlarea where paddr = addr and sql_hash_value = hash_value and v$session.username is not null and sql_text not like '%session%' and  status='ACTIVE' order by last_call_et desc;

查询当前正在执行的sql及执行用时,如果对性能优化查看sql效率要set autotrace on;然后执行sql查看执行计划。

参考技术A 方法:一是拷贝sql到PL/SQL developer工具里面执行,看下是否可执行。
二是使用DEBUG模式,断点跟踪
参考技术B 是说sql trace嘛?可以参考下我的博客:
http://blog.csdn.net/renfengjun/article/details/18660753
参考技术C execute dbms_monitor.session_trace_enable(session_id=>&sid, serial_num=>&serial,
waits=>true,binds=>false);

如何在 Oracle 中列出活动/打开的连接?

【中文标题】如何在 Oracle 中列出活动/打开的连接?【英文标题】:How to list active / open connections in Oracle? 【发布时间】:2010-11-05 19:09:57 【问题描述】:

是否有任何隐藏的表、系统变量或其他东西可以显示给定时刻的活动连接?

【问题讨论】:

【参考方案1】:

使用V$SESSION 视图。

V$SESSION 显示每个当前会话的会话信息。

【讨论】:

命令中从第 1 行开始出错:select * from FROM v$session 命令行错误:1 列:14 错误报告:SQL 错误:ORA-00903:无效表名 00903.00000 -"无效的表名” *原因:*操作: 要么您没有权限,要么您没有正确安装 DBA 视图。 您需要 select_catalog_role 角色。 你也可以加入 v$sqltext 来获取 session 的当前 SQL。 pistacchio,SQL 中有 2 个“from FROM”:“select * from FROM v$session”【参考方案2】:

如需更完整的答案,请参阅: http://dbaforums.org/oracle/index.php?showtopic=16834

select
       substr(a.spid,1,9) pid,
       substr(b.sid,1,5) sid,
       substr(b.serial#,1,5) ser#,
       substr(b.machine,1,6) box,
       substr(b.username,1,10) username,
--       b.server,
       substr(b.osuser,1,8) os_user,
       substr(b.program,1,30) program
from v$session b, v$process a
where
b.paddr = a.addr
and type='USER'
order by spid; 

【讨论】:

【参考方案3】:

当我想查看从我们的应用服务器到数据库的传入连接时,我使用以下命令:

SELECT username FROM v$session 
WHERE username IS NOT NULL 
ORDER BY username ASC;

简单但有效。

【讨论】:

【参考方案4】:
select s.sid as "Sid", s.serial# as "Serial#", nvl(s.username, ' ') as "Username", s.machine as "Machine", s.schemaname as "Schema name", s.logon_time as "Login time", s.program as "Program", s.osuser as "Os user", s.status as "Status", nvl(s.process, ' ') as "OS Process id"
from v$session s
where nvl(s.username, 'a') not like 'a' and status like 'ACTIVE'
order by 1,2

此查询尝试过滤掉所有后台进程。

【讨论】:

【参考方案5】:
Select count(1) From V$session
where status='ACTIVE'
/

【讨论】:

【参考方案6】:
select
  username,
  osuser,
  terminal,
  utl_inaddr.get_host_address(terminal) IP_ADDRESS
from
  v$session
where
  username is not null
order by
  username,
  osuser;

【讨论】:

欢迎来到 SO!请为您的答案提供一些直觉。【参考方案7】:
select status, count(1) as connectionCount from V$SESSION group by status;

【讨论】:

【参考方案8】:

以下为您提供按连接数排序的操作系统用户列表,这在查找资源使用过多时很有用。

select osuser, count(*) as active_conn_count 
from v$session 
group by osuser 
order by active_conn_count desc

【讨论】:

【参考方案9】:
select 
    count(1) "NO. Of DB Users", 
    to_char(sysdate,'DD-MON-YYYY:HH24:MI:SS') sys_time
from 
    v$session 
where 
    username is NOT  NULL;

【讨论】:

虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。

以上是关于oracle 怎么跟踪有问题session 的sql的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 中列出活动/打开的连接?

oracle数据库基本操作

oracle如何看到transaction执行过程

oracle操作

oracle中V$session 表中各个字段的中文说明是啥?

会话跟踪技术--cookie和session 小结