首页 数据库 mysql教程 六, 监控当前数据库的活动session

六, 监控当前数据库的活动session

Jun 07, 2016 pm 03:47 PM
session 数据库 活动 监控

六 , 监控当前数据库的活动 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_HA

, 监控当前数据库的活动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'
 
anduser# >0
orderby 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'
 
anduser# >0
orderby 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, 找出给定操作系统pidsession的执行sql

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

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

V$sqlarea中的统计项在语句完全执行后被更新(并且从v$session.sql_hash_value中消失). 因此, 我们无法通过v$sqlareav$session直接关联找到session, 除非语句被再次执行. 不过如果sessioncursor仍然打开着, 用户就可以通过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'))
ORDERBY 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_TEXTSql语句

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
 
orderby 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)
 
fromsys.v_$sqlarea a, dba_users b
 
where a.parsing_user_id = b.user_id
 
groupby 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'))
ORDERBY 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),当前未在等待状态。
=0session正在等待当前的事件。
=-1:最后一次等待时间小于1个统计单位,当前未在等待状态。
=-2:时间统计状态未置为可用,当前未在等待状态。

3.Wait_timeSecond_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,
      
casewhen 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,
      
casewhen sw.STATE = 'WAITING'then sw.SECONDS_IN_WAIT else0end seconds_in_wait,
       sw.WAIT_TIME,
      
casewhen sw.WAIT_TIME = -1then'等待完成, 最后一次等待时间小于10ms...'
           
when sw.WAIT_TIME = -2then'等待完成, 统计时间未置为可用'
           
when sw.WAIT_TIME > 0then'等待完成, 最后一次等待时间(单位10ms)'||sw.WAIT_TIME
           
when sw.WAIT_TIME = 0then'正在等待'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 notlike'SQl*Net%'
  
And s.status = 'ACTIVE'
  
And s.username isnotnull
 
orderby 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等待的原因。原因编码的范围从0300,下列为部分编码所代表的事项:
0
块被读入缓冲区。

100
我们想要NEW(创建)一个块,但这一块当前被另一session读入。

110
我们想将当前块设为共享,但这一块被另一session读入,所以我们必须等待read()结束。

120
我们想获得当前的块,但其他人已经将这一块读入缓冲区,所以我们只能等待他人的读入结束。

130
块被另一session读入,而且没有找到其它协调的块,所以我们必须等待读的结束。缓冲区死锁后这种情况也有可能产生。所以必须读入块的CR

200
我们想新创建一个block,但其他人在使用,所以我们只好等待他人使用结束。

210 Session
想读入SCURXCUR中的块,如果块交换或者session处于非连续的TX模式,所以等待可能需要很长的时间。

220
在缓冲区查询一个块的当前版本,但有人以不合法的模式使用这一块,所以我们只能等待。

230
CR/CRX方式获得一个块,但块中的更改开始并且没有结束。

231 CR/CRX
扫描找到当前块,但块中的更改开始并且没有结束。

6.4 跟踪长时间运行session10046事件

1, 使用sql_trace跟踪当前session10046事件

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跟踪当前session10046事件

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跟踪当前session10046事件

例如我们查看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.

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

重返奥马哈海滩!《坦克世界》推出诺曼底纪念活动 重返奥马哈海滩!《坦克世界》推出诺曼底纪念活动 May 31, 2024 pm 10:25 PM

诺曼底登陆将迎来80周年纪念,《坦克世界》一整个月的活动和特惠将围绕着“霸王行动”展开——全新的PvE模式、具有主题的战斗通行证、全新前线模式发布,以及为期一个月的诺曼底行动令牌商店即将开启。行动地图6月3日至6月30日,探索诺曼底海滩并收集最多90个诺曼底行动令牌:从该地图上获取36个、通过完成每日任务获取另外54个。查看交互式地图并了解各个活动的开始日期,然后立即开始获取令牌,或者解锁特殊的令牌任务。利用地图了解诺曼底行动相关活动的详情,获取足够的诺曼底行动令牌后,您即可前往诺曼底行动令牌商

在PHP中使用MySQLi建立数据库连接的详尽教程 在PHP中使用MySQLi建立数据库连接的详尽教程 Jun 04, 2024 pm 01:42 PM

如何在PHP中使用MySQLi建立数据库连接:包含MySQLi扩展(require_once)创建连接函数(functionconnect_to_db)调用连接函数($conn=connect_to_db())执行查询($result=$conn->query())关闭连接($conn->close())

三大人气平台联运,《问道》'圣无双”今日火爆开服! 三大人气平台联运,《问道》'圣无双”今日火爆开服! Jun 01, 2024 pm 10:47 PM

《问道》多平台联运经典无双大服“圣无双”今日开服,多平台联运人气爆满,更有超值的累计充值抽奖限时进行中!无双大圣、灵匣寻宝、吉星高照、成就达人、冲榜比赛等多重新服活动今日同步开启,福利满满快来拿!活动时间:5月7日12:00至6月17日23:59。开大圣灵匣,寻稀世珍宝。完成对应的活动任务即可领取抽奖机会,每次抽奖消耗1次机会。奖池内有iPhone15Pro256G(颜色随机)、问道定制金银钞夜灯套装、1000银元宝等奖励。在“灵匣寻宝”活动页面绑定新服“圣无双”角色,可直接获得限时30天的“龙

Hibernate 如何实现多态映射? Hibernate 如何实现多态映射? Apr 17, 2024 pm 12:09 PM

Hibernate多态映射可映射继承类到数据库,提供以下映射类型:joined-subclass:为子类创建单独表,包含父类所有列。table-per-class:为子类创建单独表,仅包含子类特有列。union-subclass:类似joined-subclass,但父类表联合所有子类列。

iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 Jul 18, 2024 am 05:48 AM

苹果公司最新发布的iOS18、iPadOS18以及macOSSequoia系统为Photos应用增添了一项重要功能,旨在帮助用户轻松恢复因各种原因丢失或损坏的照片和视频。这项新功能在Photos应用的"工具"部分引入了一个名为"已恢复"的相册,当用户设备中存在未纳入其照片库的图片或视频时,该相册将自动显示。"已恢复"相册的出现为因数据库损坏、相机应用未正确保存至照片库或第三方应用管理照片库时照片和视频丢失提供了解决方案。用户只需简单几步

《神魔大陆2》正式服新服'拂晓之光”4月18日开启 《神魔大陆2》正式服新服'拂晓之光”4月18日开启 Apr 11, 2024 pm 02:49 PM

4月18日《神魔大陆2》一场魔幻冒险的盛宴即将拉开帷幕!准备好迎接全新服务器的开启了吗?探索克兰蒙多大陆,结交志同道合的伙伴,等待与你共同书写属于你们的冒险篇章!为了让冒险之旅更加精彩和有趣,即刻起邀请您的好友回归克兰蒙多大陆入驻新服,就有机会获得丰厚的奖励噢!4月11日12点起邀请好友入驻新服,开服后随着等级的提升可以获得积分,积分能够兑换“呼朋唤友大礼包”噢!4月16日12点,勇士即可在新服进行预创建角色,不仅可以抢注中意的角色名,成功预创建角色后还可领取“新服预约礼包”。1.预约&奖励说明

如何在PHP中处理数据库连接错误 如何在PHP中处理数据库连接错误 Jun 05, 2024 pm 02:16 PM

PHP中处理数据库连接报错,可以使用以下步骤:使用mysqli_connect_errno()获取错误代码。使用mysqli_connect_error()获取错误消息。通过捕获并记录这些错误信息,可以轻松识别并解决数据库连接问题,确保应用程序的顺畅运行。

Go WebSocket 如何与数据库集成? Go WebSocket 如何与数据库集成? Jun 05, 2024 pm 03:18 PM

如何将GoWebSocket与数据库集成:设置数据库连接:使用database/sql包连接到数据库。将WebSocket消息存储到数据库:使用INSERT语句将消息插入数据库。从数据库检索WebSocket消息:使用SELECT语句检索数据库中的消息。

See all articles