oracle怎么查阻塞 oracle查询阻塞

如何查看Oracle数据库的session阻塞转: oracle session通常具有三个特征: (1)一个session可能阻塞多个session; (2)一个session最多被一个session阻塞; (3)session阻塞关系不会形成环路 。(环路即死锁 , oracle能自动解除)因此session的阻塞关系为一棵树 , 进而DB系统所有session的BLOCK阻塞关系是一个由若干session阻塞关系树构成的森林 , 而异常session一定会在故障爆发时成为根(root) 。因此,找寻异常锁表session的过程就是找出异常的root 。一般认为异常root有两个特征: (1)block树的规模过大,阻塞树规模即被root层层阻塞的session总数; (2)阻塞的平均等待时间过长 。查找异常session的方法一: OEM— performance— Blocking Sessions 查找异常session的方法二: select r.root_sid, s.serial#, r.blocked_num, r.avg_wait_seconds, s.username,s.status,s.event,s.MACHINE, s.PROGRAM,s.sql_id,s.prev_sql_id from (select root_sid, avg(seconds_in_wait) as avg_wait_seconds, count(*) - 1 as blocked_num from (select CONNECT_BY_ROOT sid as root_sid, seconds_in_wait from v$session start with blocking_session is null connect by prior sid = blocking_session) group by root_sid having count(*)1) r, v$session s where r.root_sid = s.sid order by r.blocked_num desc, r.avg_wait_seconds desc; 该SQL语句即是根据v$session的字段blocking_session统计阻塞树根阻塞session的计数以及平均阻塞时间、并进行排序,排名最前的往往是异常session 。
oracle sql阻塞怎么解决使用v$locked_object视图查看阻塞会话oracle怎么查阻塞的session idoracle怎么查阻塞,然后通过v$session v$sql视图查看一下正在执行什么操作 。如果可以oracle怎么查阻塞 , 使用alter session命令kill掉即可解决阻塞 。
oracle 如何查询阻塞别的会话最大的事务查看被锁oracle怎么查阻塞的表:
select p.spid,c.object_name,b.session_id,b.oracle_username,b.os_user_name from
v$process p,v$session a, v$locked_object b,all_objects c
where p.addr=a.paddr and a.process=b.process and c.object_id=b.object_id
解锁oracle怎么查阻塞:
alter system kill session '146';(其中146为锁住oracle怎么查阻塞的进程号)
oracle 怎么查看数据被锁1.创建测试表 , 如下图 。
createtabletest_lock(idnumber,valuevarchar2(200));
2.执行append语句;并且不做提交,insert/* append*/intotest_lockvalues(1,1)如下图 。
3.再次执行清表语句,truncatetabletest_lock;报锁表错误,如下图 。
4.查看锁表语句,发现被锁表
selectb.object_name,t.*
fromv$locked_objectt,user_objectsb
wheret.object_id=b.object_id
注意事项:
简化数据:可以将复杂的查询创建为其他人可以使用的视图 , 而不必了解复杂的业务或逻辑关系 。这简化并掩盖了视图用户数据的复杂性 。
表结构设计的补充:在设计的系统才刚刚开始,大部分的程序直接访问数据表结构,但是随着业务的变化,系统更新,等等,引起了一些表结构不适用,这次修改系统的表结构太大,开发成本较高的影响 。
这个时候可以创建一个视图来补充表结构设计,降低开发成本 。程序可以通过查询视图直接获得它想要的数据 。
添加安全性:视图可以向用户显示表中的指定字段,而不是向用户显示表中的所有字段 。在实际开发中,视图通常作为提供数据的一种方式提供,并将只读权限提供给第三方以供查询使用 。
一条查询Oracle中的阻塞锁(以及阻塞在哪个查看被锁的表
123
select p.spid,a.serial#,c.object_name,b.session_id,b.oracle_username,b.os_user_name from v$process p,v$session a, v$locked_object b,all_objects c where p.addr=a.paddr and a.process=b.process and c.object_id=b.object_id ;
查看那个用户那个进程造成死锁,锁的级别
1
select b.owner,b.object_name,l.session_id,l.locked_mode fromv$locked_object l, dba_objects
4、查看连接的进程
1
【oracle怎么查阻塞 oracle查询阻塞】SELECT sid, serial#, username, osuser FROMv$session;
5、查看是哪个session引起的
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;
6、杀掉进程
1
alter system kill session 'sid,serial#';
oracle查看历史session一、如何查询session执行的历史sql语句
如何知道一个session都执行过哪些SQL语句?(查看当前比较容易 , 历史的呢?怎么复原sql的执行场景——事务关系、执行序列、单SQL还是存储过程)
【方法一】查询v$sqltext、v$sqlarea、v$sqlstats视图
select * from v$sqlarea t where t.PARSING_SCHEMA_NAME in ('schema') order by t.LAST_ACTIVE_TIME desc;
#对v$sqltext、v$sqlarea查看的是shared pool中的SQL , 其时间索引是其解析历史,因为共享的问题这个查询可能并不能完整地反映出执行的历史 。
#v$sqlstats信息保留时间比v$sql、v$sqltext、v$sqlarea长,及时SQL已经换出shared pool仍然可查到
【方法二】
联合v$active_session_history和v$sqlarea
#v$active_session_history 这个表只是个取样数据,按秒进行,只有在那一秒采样点处于on cpu或非idle等待的session统计在内 。所以可能会不全 , 有些执行很短的SQL会忽略 。这个视图无法还原完整的session历史 。
#v$sqlarea中有执行过的SQL语句 , 但并无到session的关联信息,v$session中只关联了当前的sql,所以也不行 。
查看视图:dba_hist_sqlstats、dba_hist_sqltext(历史数据)
二、如何使用PL/SQL Developer查看和杀掉session
oracle多用户操作有时候会造成session阻塞,形成了锁表等问题 。
可以使用sql语句进行查询,但用工具更为方便 。本文就介绍使用PL/SQL developer工具查看或杀掉oracle的session 。
工具/原料 PL/SQL Developer 版本为 8.0.0.1480 方法/步骤 打开PL/SQL Developer,输入用户名密码和数据库等信息 。在工具栏中选择tools,在弹出的窗口选择Sessions 。
即可 。如图所示,所有的session和起sid都列了出来 , 我们需要找Status为active(活动)的 。
点击一下即可,或者选择如图的下拉菜单,选择 Active sessions. 如图,现在有两个活动的session , 选择其中一个session后在下方可以查看此session的更多信息 。在SQL Text一栏中可以查看正在执行的sql语句 。
在Locks一栏中 , 可以查看现在锁表等信息 。若要杀掉其中一个session,那么,对这个session一行点击右键 , 选择“kill”即可 。
三、如何查看PL/SQL执行的历史
除了PL/SQL的ctrl e的查看方法外还有如下方法:【方法一】查询v$sql、v$sqltext、v$sqlarea、v$sqlstats视图select * from v$sqlarea t where t.PARSING_SCHEMA_NAME in ('schema') order by t.LAST_ACTIVE_TIME desc;#对v$sqltext、v$sqlarea查看的是shared pool中的SQL,其时间索引是其解析历史 , 因为共享的问题这个查询可能并不能完整地反映出执行的历史 。
#v$sqlstats反应的是实例启动起来的sql执行统计,sql语句本身比v$sqltext/area完整,因为后者有可能失效换出缓存 。【方法二】联合v$active_session_history和v$sqlarea#v$active_session_history 这个表只是个取样数据,按秒进行,只有在那一秒采样点处于on cpu或非idle等待的session统计在内 。
所以可能会不全,有些执行很短的SQL会忽略 。这个视图无法还原完整的session历史 。
#v$sqlarea中有执行过的SQL语句,但并无到session的关联信息,v$session中只关联了当前的sql,所以也不行 。从v$sqlstat可以查看到数据库启动起来的所有SQL信息,但是没有时间顺序关系、没有执行用户信息,只有执行次数与资源统计 。
从dba_hist_sqlstat可以看到AWR snapshot之间的SQL统计信息,与v$sqlstats比不受实例重启的影响,因为实例重启之后v$sqlstats中的信息就清除了 。【方法三:session trace】SQL execute dbms_session.session_trace_enable(true,true);PL/SQL procedure successfully pleted.SQL select count(*) from dba_hist_sqltext; COUNT(*)---------- 478SQL select * from V$sesstat where rownum=1; SID STATISTIC# VALUE---------- ---------- ---------- 134 0 1SQL execute dbms_session.session_trace_disable;PL/SQL procedure successfully pleted.$ cd $ORACLE_HOME/admin/test/udump$ ls -lrt$ tkprof test_ora_2195620.trc report.txt sys=no explain=no aggregate=yes$ more report.txt --这个文件包括了启停trace之间所有SQL语句的执行信息,执行计划、统计【方法四:logminer】只包含DML与DDL语句,不能查询select语句 。
另外需要开启supplemental logging,默认是没有开启的 。conn / as sysdba--安装LOGMINERSQL @$ORACLE_HOME/rdbms/admin/dbmslmd.sql;SQL @$ORACLE_HOME/rdbms/admin/dbmslm.sql;SQL @$ORACLE_HOME/rdbms/admin/dbmslms.sql;SQL @$ORACLE_HOME/rdbms/admin/prvtlm.plb;--开启附加日志alter database add supplemental log data;--模拟DML操作conn p_chenming/ 。
SQL select * from test2;SQL insert into test2 values(7,77);SQL mit;conn / as sysdba--切归档SQL alter system switch logfile;SQL select name,dest_id,thread#,sequence# from v$archived_log; --最后一个即为新的归档--新建LOG MINERSQL execute dbms_logmnr.add_logfile(logfilename='/oracle/archive_10g/test/test_1_138_786808434.arc',options=dbms_logmnr.new); --开始minerSQL execute dbms_logmnr.start_logmnr(options=dbms_logmnr.dict_from_online_catalog);--查看结果SQL col username format a8;SQL col sql_redo format a50 SQL select username,s,timestamp,sql_redo from v$logmnr_contents where table_name='TEST2'; SQL select username,s,timestamp,sql_redo from v$logmnr_contents where username='P_CHENMING'; --关闭MINERSQL execute dbms_logmnr.end_logmnr;--关闭辅助日志SQL alter database drop supplemental log data;【总结】查看v$sqlarea只能查看粗略的历史,因为很多SQL是共享的 。查看ASH也不全,因为这是采样数据,测试的时候基本没有把SQL查询出来 。
查看V$SQLSTATS能看到所有执行过的sql,以及其执行统计,但是没有时序、没有用户信息 。查看TRACE应该是最完整的,但需要在执行SQL前开启 。
查看logminer不能查看select语句,而且默认的系统没有开启supplementing log , 所以能查看的内容有限 。或许还有审计的方法可用,我没测试 。
每种方法都有各自的缺陷 , 看来很难有一种完备的查看SQL执行历史的方法 。
四、如何查看PL/SQL执行的历史
除了PL/SQL的ctrl e的查看方法外还有如下方法:【方法一】查询v$sql、v$sqltext、v$sqlarea、v$sqlstats视图select * from v$sqlarea t where t.PARSING_SCHEMA_NAME in ('schema') order by t.LAST_ACTIVE_TIME desc;#对v$sqltext、v$sqlarea查看的是shared pool中的SQL,其时间索引是其解析历史,因为共享的问题这个查询可能并不能完整地反映出执行的历史 。
#v$sqlstats反应的是实例启动起来的sql执行统计,sql语句本身比v$sqltext/area完整,因为后者有可能失效换出缓存 。【方法二】联合v$active_session_history和v$sqlarea#v$active_session_history 这个表只是个取样数据,按秒进行,只有在那一秒采样点处于on cpu或非idle等待的session统计在内 。
所以可能会不全,有些执行很短的SQL会忽略 。这个视图无法还原完整的session历史 。
#v$sqlarea中有执行过的SQL语句,但并无到session的关联信息,v$session中只关联了当前的sql,所以也不行 。从v$sqlstat可以查看到数据库启动起来的所有SQL信息,但是没有时间顺序关系、没有执行用户信息,只有执行次数与资源统计 。
从dba_hist_sqlstat可以看到AWR snapshot之间的SQL统计信息,与v$sqlstats比不受实例重启的影响 , 因为实例重启之后v$sqlstats中的信息就清除了 。【方法三:session trace】SQL execute dbms_session.session_trace_enable(true,true);PL/SQL procedure successfully pleted.SQL select count(*) from dba_hist_sqltext; COUNT(*)---------- 478SQL select * from V$sesstat where rownum=1; SID STATISTIC# VALUE---------- ---------- ---------- 134 0 1SQL execute dbms_session.session_trace_disable;PL/SQL procedure successfully pleted.$ cd $ORACLE_HOME/admin/test/udump$ ls -lrt$ tkprof test_ora_2195620.trc report.txt sys=no explain=no aggregate=yes$ more report.txt --这个文件包括了启停trace之间所有SQL语句的执行信息,执行计划、统计【方法四:logminer】只包含DML与DDL语句,不能查询select语句 。
另外需要开启supplemental logging,默认是没有开启的 。conn / as sysdba--安装LOGMINERSQL @$ORACLE_HOME/rdbms/admin/dbmslmd.sql;SQL @$ORACLE_HOME/rdbms/admin/dbmslm.sql;SQL @$ORACLE_HOME/rdbms/admin/dbmslms.sql;SQL @$ORACLE_HOME/rdbms/admin/prvtlm.plb;--开启附加日志alter database add supplemental log data;--模拟DML操作conn p_chenming/ 。
SQL select * from test2;SQL insert into test2 values(7,77);SQL mit;conn / as sysdba--切归档SQL alter system switch logfile;SQL select name,dest_id,thread#,sequence# from v$archived_log; --最后一个即为新的归档--新建LOG MINERSQL execute dbms_logmnr.add_logfile(logfilename='/oracle/archive_10g/test/test_1_138_786808434.arc',options=dbms_logmnr.new); --开始minerSQL execute dbms_logmnr.start_logmnr(options=dbms_logmnr.dict_from_online_catalog);--查看结果SQL col username format a8;SQL col sql_redo format a50 SQL select username,s,timestamp,sql_redo from v$logmnr_contents where table_name='TEST2'; SQL select username,s,timestamp,sql_redo from v$logmnr_contents where username='P_CHENMING'; --关闭MINERSQL execute dbms_logmnr.end_logmnr;--关闭辅助日志SQL alter database drop supplemental log data;【总结】查看v$sqlarea只能查看粗略的历史,因为很多SQL是共享的 。查看ASH也不全,因为这是采样数据,测试的时候基本没有把SQL查询出来 。
查看V$SQLSTATS能看到所有执行过的sql,以及其执行统计 , 但是没有时序、没有用户信息 。查看TRACE应该是最完整的,但需要在执行SQL前开启 。
查看logminer不能查看select语句 , 而且默认的系统没有开启supplementing log,所以能查看的内容有限 。或许还有审计的方法可用,我没测试 。
每种方法都有各自的缺陷,看来很难有一种完备的查看SQL执行历史的方法 。
五、如何查看oracle中存储过程执行的历史记录
select t.sql_id,
t.sql_text,
s.plan_hash_value,
s.optimizer_cost,
s.executions_total,
s.elapsed_time_total,
s.disk_reads_total,
s.buffer_gets_total
from DBA_HIST_SQLSTAT s, DBA_HIST_SQLTEXT t
where s.sql_id=t.sql_id
and t.sql_text like'%存储过程名称%';
没有想到其他好办法 , 确实不太好查了,把存储过程当作SQL来查找吧 。
六、oracle 中查询占用session最多的进程
在故障发生时,尝试用下面的语句抓取数据库引起故障的点 。
/*********************************************************************************************/在oracle中监控死锁/*********************************************************************************************/SELECT sn.username, m.SID, sn.SERIAL#, m.TYPE, DECODE(m.lmode, 0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.', 4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive', lmode, LTRIM(TO_CHAR(lmode, '990'))) lmode, DECODE(m.request, 0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.', 4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive', request, LTRIM(TO_CHAR(m.request, '990'))) request, m.id1, m.id2 FROM v$session sn, v$lock m WHERE (sn.SID = m.SID AND m.request != 0) --存在锁请求,即被阻塞 OR (sn.SID = m.SID --不存在锁请求 , 但是锁定的对象被其他会话请求锁定 AND m.request = 0 AND lmode != 4 AND (id1, id2) IN (SELECT s.id1, s.id2 FROM v$lock s WHERE request != 0 AND s.id1 = m.id1 AND s.id2 = m.id2)) ORDER BY id1, id2, m.request; /*********************************************************************************************/定位引起oracle死锁的sql/*********************************************************************************************/select sql_text from v$sql where hash_value in (select sql_hash_value from v$session where sid in (select session_id from v$locked_object)) /*********************************************************************************************/下面的SQL查询可以用于确定锁住数据库对象的锁:/*********************************************************************************************/select c.owner, c.object_name, c.object_type, b.sid, b.serial#, b.status, b.osuser, b.machine from v$locked_object a , v$session b, dba_objects c where b.sid = a.session_id and a.object_id = c.object_id; /*********************************************************************************************/显示哪些会话被锁住/*********************************************************************************************//* showlock.sql */COLUMN o_name format a10COLUMN lock_type format a20COLUMN object_name format a15SELECT RPAD (oracle_username, 10) o_name, session_id SID, DECODE (locked_mode, 0, 'None', 1, 'Null', 2, 'Row share', 3, 'Row Execlusive', 4, 'Share', 5, 'Share Row Exclusive', 6, 'Exclusive' ) lock_type, object_name, xidusn, xidslot, xidsqn FROM v$locked_object, all_objectsWHERE v$locked_object.object_id = all_objects.object_id;/*********************************************************************************************/显示所有的TM和TX锁/*********************************************************************************************//* showalllock.sql */SELECT SID, TYPE, id1, id2, DECODE (lmode, 0, 'None', 1, 'Null', 2, 'Row share', 3, 'Row Exclusive', 4, 'Share', 5, 'Share Row Exclusive', 6, 'Exclusive' ) lock_type, request, ctime, BLOCK FROM v$lockWHERE TYPE IN ('TX', 'TM');/*********************************************************************************************/ 在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为: 被kill掉的session,状态会被标记为killed,Oracle会在该用户下一次touch时清除该进程.我们发现当一个session被kill掉以后,该session的paddr被修改 , 如果有多个session被kill,那么多个session的paddr都被更改为相同的进程地址:/*********************************************************************************************/alter system kill session 'sid,serial#' ; /*********************************************************************************************/ 在oracle中kill掉的进程有时还需要等待pmon回滚数据库已经占有的资源有时候我们需要使用下面的脚本找出那些已经在oracle中kill掉的进程,在操作系统中在kill一次/*********************************************************************************************/select p.addr from v$process p where pid 1 minus select s.paddr from v$session s;$ kill -9 paddr 。
oracle怎么查阻塞的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于oracle查询阻塞、oracle怎么查阻塞的信息别忘了在本站进行查找喔 。

    推荐阅读