监控当前数据库的活动session

转载 2013年12月02日 14:42:42

 监控当前数据库的活动session

6.1 监控session的执行语句

6.1.1 通过动态性能视图查找活动session的执行语句

select a.SID,a.USERNAME,a.machine,a.TERMINAL,b.PIECE,b.SQL_TEXT
from v$session a,
     v$sqltext b
where b.ADDRESS = decode(a.SQL_HASH_VALUE,0,a.PREV_SQL_ADDR,a.SQL_ADDRESS)
  
and a.status = 'ACTIVE'
  
and user# >0
order by a.SQL_ADDRESS,b.PIECE;

6.1.2通过动态性能视图查找所有session的执行语句

select a.SID,b.ADDRESS,b.HASH_VALUE,a.USERNAME,a.machine,b.SADDR,c.PIECE,c.SQL_TEXT
from v$session a,
     v$open_cursor b,
     v$sqltext c
where a.SID = b.SID
  
and b.ADDRESS = c.ADDRESS
  
and b.HASH_VALUE = c.HASH_VALUE
  
and a.status = 'ACTIVE'
  
and user# >0
order by a.SID,b.ADDRESS,b.HASH_VALUE,a.USERNAME,a.machine,b.SADDR,c.PIECE;

 

6.1.3 通过操作系统查找相关session信息

1, 找出最消耗cpu的操作系统进程

# ps aux| grep -v grep | grep ora| head -10

oracle   876648  1.9  1.0 57832 82156      - A    16:22:35  7:59 oracleSISDB2 (LO

oracle   594138  1.9  1.0 58808 83132      - A    15:22:46 16:48 oracleSISDB2 (LO

oracle   495712  0.9  1.0 56628 80952      - A    17:04:47  0:43 oracleSISDB2 (LO

oracle   712946  0.5  1.0 55716 80040      - A    17:11:33  0:07 oracleSISDB2 (LO

oracle   966862  0.1  1.0 55144 79468      - A      Jul 08 153:01 oracleSISDB2 (LO

oracle   442494  0.1  1.0 58984 83308      - A      Feb 16 1751:47 ora_lms1_SISDB2

oracle   581808  0.1  1.0 59140 83464      - A      Feb 16 1747:01 ora_lms0_SISDB2

oracle   811254  0.1  1.0 55228 79552      - A    15:51:29  0:31 oracleSISDB2 (LO

oracle   573582  0.0  1.0 57680 82004      - A      Feb 16 149:17 ora_lmon_SISDB2

oracle   651300  0.0  1.0 57204 81528      - A      Feb 16 125:13 ora_diag_SISDB2

2, 找出给定操作系统pid的session的执行sql

V$open_cursor视图列出session打开的所有cursor, 很多时候都将被用到, 比如: 你可以通过这个视图查看各个session打开的cursor数.

当诊断系统资源占用时, v$open_cursor视图常被用来连接v$sqlarea和v$sql查询出特定SQL(高逻辑或物理IO). 然后, 下一步就是找出源头.

V$sqlarea中的统计项在语句完全执行后被更新(并且从v$session.sql_hash_value中消失). 因此, 我们无法通过v$sqlarea跟v$session直接关联找到session, 除非语句被再次执行. 不过如果session的cursor仍然打开着, 用户就可以通过v$open_cursor来找出执行这个语句的session.

SELECT   /*+ ORDERED */
         address,piece,sql_text
    
FROM v$sqltext a
   
WHERE (a.hash_value, a.address) IN (
            
SELECT d.HASH_VALUE,d.ADDRESS
              
FROM v$session b,v$open_cursor d 
              
where b.SID = d.SID
               
and  b.paddr = (SELECT addr
                                
FROM v$process c
                               
WHERE c.spid = '&pid'))
ORDER BY address,piece;

6.2 session的资源占用

6.2.1 通过动态性能视图查找相关session信息

利用V_$SQLAREA视图提供了执行的细节。(执行、读取磁盘和读取缓冲区的次数)

• 数据列

EXECUTIONS:执行次数

DISK_READS:读盘次数

COMMAND_TYPE:命令类型(3:select,2:insert;6:update;7delete;47:pl/sql程序单元)

OPTIMIZER_MODE:优化方式

SQL_TEXT:Sql语句

SHARABLE_MEM:占用shared pool的内存多少

BUFFER_GETS:读取缓冲区的次数

• 用途

1、帮忙找出性能较差的SQL语句

2、帮忙找出最高频率的SQL

3、帮忙分析是否需要索引或改善联接

求DISK READ较多的SQL 
select
 st.ADDRESS,st.PIECE,st.sql_text
  
from v$sql s, v$sqltext st
 
where s.address = st.address
   
and s.hash_value = st.hash_value
   
and s.disk_reads > 300
 
order by st.address, st.piece ;

求DISK SORT严重的SQL 
select
 sess.username, sql.sql_text, sort1.blocks
  
from v$session sess, v$sqlarea sql, v$sort_usage sort1
 
where sess.serial# = sort1.session_num
   
and sort1.sqladdr = sql.address
   
and sort1.sqlhash = sql.hash_value
   
and sort1.blocks > 200;

查看语句占用的内存情况

select username, sum(sharable_mem), sum(persistent_mem), sum(runtime_mem)
  
from sys.v_$sqlarea a, dba_users b
 
where a.parsing_user_id = b.user_id
 
group by username;

 

 

 

6.2.2 通过操作系统查找相关session信息

# ps aux|head -1; ps aux|sort -nr +2 |head -10

USER        PID %CPU %MEM   SZ  RSS    TTY STAT    STIME  TIME COMMAND

root      73764  6.1  0.0  384  384      - A      Jan 10 130144:34 wait

root      57372  6.1  0.0  384  384      - A      Jan 10 132116:52 wait

root      65568  6.0  0.0  384  384      - A      Jan 10 129411:36 wait

# ps aux |head -1; ps aux |sort -nr +3 | head -10

USER        PID %CPU %MEM   SZ  RSS    TTY STAT    STIME  TIME COMMAND

oracle   974978  2.2  1.0 57992 82316      - A    14:05:06  2:41 oracleSISDB2 (LO

oracle   966862  0.1  1.0 55144 79468      - A      Jul 08 80:49 oracleSISDB2 (LO

oracle   942332  0.0  1.0 59112 83436      - A      Feb 16  2:24 ora_arc0_SISDB2

oracle   909346  1.4  1.0 58364 82688      - A    13:49:28  3:22 oracleSISDB2 (LO

SELECT   /*+ ORDERED */
         address,piece,sql_text
    
FROM v$sqltext a
   
WHERE (a.hash_value, a.address) IN (
            
SELECT d.HASH_VALUE,d.ADDRESS
              
FROM v$session b,v$open_cursor d 
              
where b.SID = d.SID
               
and  b.paddr = (SELECT addr
                                
FROM v$process c
                               
WHERE c.spid = '&pid'))
ORDER BY address,piece;

6.3 session的等待事件

V$session_event, v$session_wait两个视图中记录的是session级别的等待事件, 通过查询这两个视图用户可以得到当前数据库的一些操作到底在等待什么, 是磁盘IO, 缓冲区忙还是插锁等.

V$SESSION_WAIT中的常用列

SID: session标识
EVENT: session当前等待的事件,或者最后一次等待事件。
WAIT_TIME: session等待事件的时间(单位,百分之一秒)如果本列为0,说明session当前session还未有任何等待。
SEQ#: session等待事件将触发其值自增长
P1, P2, P3: 等待事件中等待的详细资料
P1TEXT, P2TEXT, P3TEXT: 解释说明p1,p2,p3事件

附注:
1.State字段有四种含义﹕
Waiting:SESSION正等待这个事件。
Waited unknown time:由于设置了timed_statistics值为false,导致不能得到时间信息。表示发生了等待,但时间很短。
Wait short time:表示发生了等待,但由于时间非常短不超过一个时间单位,所以没有记录。
Waited knnow time:如果session等待然后得到了所需资源,那么将从waiting进入本状态。

Wait_time值也有四种含义:
值>0:最后一次等待时间(单位:10ms),当前未在等待状态。
值=0:session正在等待当前的事件。
值=-1:最后一次等待时间小于1个统计单位,当前未在等待状态。
值=-2:时间统计状态未置为可用,当前未在等待状态。

3.Wait_time和Second_in_wait字段值与state相关:
如果state值为Waiting,那么wait_time值无用。Second_in_wait值是实际的等待时间(单位:秒)。
如果state值为Wait unknow time,那么wait_time值和Second_in_wait值都无用。
如果state值为Wait short time,那么wait_time值和Second_in_wait值都无用。
如果state值为Waiting known time,那么wait_time值就是实际等待时间(单位:秒),Second_in_wait值无用。

Select s.SID,
       s.username,
       s.program,
       s.status,
       se.event,
       se.total_waits,
       se.total_timeouts,
       se.time_waited,
       se.average_wait
  from v$session s, v$session_event se
 Where s.sid = se.sid
   And se.event not like 'SQl*Net%'
   And s.status = 'ACTIVE'
   And s.username is not null;

Select s.SID,
       s.username,
       s.program,
       s.status,
       sw.EVENT, 
       sw.STATE,
       
case when sw.STATE = 'WAITING' then '正在等待...' 
            
when sw.state = 'WAITED UNKNOWN TIME' then '等待完成, 但时间很短'
            
when sw.state = 'WAITED SHORT TIME' THEN '等待完成, 但时间更短'
            
when sw.state = 'WAITED KNOWN TIME' then '等待完成,等待时间(单位10ms)'||sw.wait_time end state_memo,
       
case when sw.STATE = 'WAITING' then sw.SECONDS_IN_WAIT else 0 end seconds_in_wait,
       sw.WAIT_TIME,
       
case when sw.WAIT_TIME = -1 then '等待完成, 最后一次等待时间小于10ms...' 
            
when sw.WAIT_TIME = -2 then '等待完成, 统计时间未置为可用'
            
when sw.WAIT_TIME > 0 then '等待完成, 最后一次等待时间(单位10ms)'||sw.WAIT_TIME
            
when sw.WAIT_TIME = 0 then '正在等待' end wait_time_memo,
       st.PIECE,
       st.SQL_TEXT,
       sw.P1TEXT,sw.p1, sw.P2TEXT,sw.p2, sw.P3TEXT, sw.P3
  
from v$session s, v$session_wait sw, v$sqltext st
 
Where s.sid = sw.sid
   
and s.sql_address = st.address(+)
   
And sw.event not like 'SQl*Net%'
   
And s.status = 'ACTIVE'
   
And s.username is not null
 
order by sw.state,s.sid,st.PIECE;

v$session_wait视图的列代表的缓冲区忙等待事件如下:

P1—与等待相关的数据文件的全部文件数量。

P2—P1中的数据文件的块数量。

P3—描述等待产生原因的代码。

例:select p1 "File #", p2 "Block #", p3 "Reason Code"

from v$session_wait
where event = 'buffer busy waits';

如果以上查询的结果显示一个块在忙等待,以下的查询将显示这一块的名称和类型:

select owner, segment_name, segment_type

from dba_extents

where file_id = &P1 and &P2 between block_id and block_id + blocks -1;

我们也可以查询dba_data_files以确定等待的文件的file_name,方法是使用v$session_wait中的P1。

从v$session_wait中查询P3(原因编码)的值可以知道session等待的原因。原因编码的范围从0到300,下列为部分编码所代表的事项: 
0 块被读入缓冲区。 
100 我们想要NEW(创建)一个块,但这一块当前被另一session读入。 
110 我们想将当前块设为共享,但这一块被另一session读入,所以我们必须等待read()结束。 
120 我们想获得当前的块,但其他人已经将这一块读入缓冲区,所以我们只能等待他人的读入结束。 
130 块被另一session读入,而且没有找到其它协调的块,所以我们必须等待读的结束。缓冲区死锁后这种情况也有可能产生。所以必须读入块的CR。 
200 我们想新创建一个block,但其他人在使用,所以我们只好等待他人使用结束。 
210 Session想读入SCUR或XCUR中的块,如果块交换或者session处于非连续的TX模式,所以等待可能需要很长的时间。 
220 在缓冲区查询一个块的当前版本,但有人以不合法的模式使用这一块,所以我们只能等待。 
230 以CR/CRX方式获得一个块,但块中的更改开始并且没有结束。 
231 CR/CRX扫描找到当前块,但块中的更改开始并且没有结束。

6.4 跟踪长时间运行session的10046事件

1, 使用sql_trace跟踪当前session的10046事件

SQL> alter session set sql_trace = true;

 

Session altered

 

SQL> select 1 from dual;

 

         1

 

SQL> alter session set sql_trace = false;

 

Session altered

2, 使用set events跟踪当前session的10046事件

SQL> alter session set events '10046 trace name context forever,level 12';

 

Session altered

 

SQL> select 2 from dual;

 

         2

----------

         2

 

SQL> alter session set events '10046 trace name context off';

 

Session altered

3, 使用oradebug跟踪当前session的10046事件

例如我们查看PID = 487432的进程, 可以使用下面的方法.

# su - oracle

[YOU HAVE NEW MAIL]

$ sqlplus /nolog

 

SQL*Plus: Release 10.2.0.3.0 - Production on Tue Jul 14 17:24:42 2009

 

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.

 

SQL> conn / as sysdba

Connected.

SQL> oradebug setospid 487432

Oracle pid: 12, Unix process pid: 487432, image: oracle@i2db (MMNL)

SQL> oradebug event 10046 trace name context forever,level 8

Statement processed.

SQL> oradebug tracefile_name

/oracle/admin/arpdb/bdump/arpdb_mmnl_487432.trc

SQL> oradebug event 10046 trace name context off

Statement processed.

SQL> exit

Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production

With the Partitioning, OLAP and Data Mining options

$ tkprof /oracle/admin/arpdb/bdump/arpdb_mmnl_487432.trc

output = arpdb_mm1.txt

TKPROF: Release 10.2.0.3.0 - Production on Tue Jul 14 17:31:29 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.



原文 http://blog.csdn.net/47522341/article/details/4370487

V$ACTIVE_SESSION_HISTORY 显示数据库中的采样会话活动

V$ACTIVE_SESSION_HISTORY 显示数据库中的采样会话活动。ASH每秒从v$session中取快照,存在V$ACTIVE_SESSION_HISTORY中,并收集所有活动会话的等待信...

查询数据库当前连接数(session),进程数等操作

转自:http://www.51testing.com/?uid-426602-action-viewspace-itemid-247806 查询数据库当前进程的连接数:   select cou...

查询数据库当前连接数(session),进程数等操作

查询当前数据库连接数,进程数,启动数据库 查询数据库当前进程的连接数:   select count(*) from v$process;   查看数据库当前会话的连接数:   elect c...
  • xu1314
  • xu1314
  • 2012年07月30日 18:37
  • 435

查询数据库当前连接数(session),进程数等操作

查询数据库当前连接数(session),进程数等操作 查询当前数据库连接数,进程数,启动数据库 查询数据库当前进程的连接数:   select count(*) fr...

查询数据库当前连接数(session),进程数等操作

查询当前数据库连接数,进程数,启动数据库 查询数据库当前进程的连接数:   select count(*) from v$process;   查看数据库当前会话的连接数:  ...

知晓当前实在哪一个活动中

  • 2015年07月30日 16:17
  • 1.42MB
  • 下载

VB获得当前活动的窗口标题

  • 2013年03月11日 16:04
  • 2KB
  • 下载

【Android】23、如何知晓当前是在哪一个活动

本篇介绍如何知晓当前是在哪一个活动
  • omoiato
  • omoiato
  • 2016年05月24日 15:37
  • 509

Wince 获取当前活动的控件

  • 2012年11月26日 15:34
  • 33KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:监控当前数据库的活动session
举报原因:
原因补充:

(最多只允许输入30个字)