- 浏览: 341569 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (198)
- HIBERNATE (8)
- JAVA (13)
- 数据库 (24)
- SPRING (1)
- LINUX (0)
- 需求管理 (3)
- 职业提升 (6)
- 团队建设 (1)
- 日常用到语句 (1)
- FLEX (6)
- 用户体验 (3)
- 设计模式 (6)
- weblogic (2)
- PowerDesigner (3)
- HTML (7)
- ANT (7)
- 工具. (1)
- bat (5)
- 存储过程 (1)
- strus2 (1)
- DWR (2)
- jfreechart (4)
- 上线测试优化 (17)
- JVM (9)
- 工具使用 (2)
- 算法 (3)
- 私事 (0)
- 数据库-Oracle session (1)
- 软件开发 (5)
- 产品 (2)
- 项目管理 (4)
- oracle语句 (1)
- IntelliJ IDEA (4)
- GRAILS (10)
- Groovy (1)
- JS (1)
- DUBBO (1)
- JAVA EXCEL (3)
- netty websocket (1)
- kafka (1)
- 秘钥体系 (2)
- golang (6)
- gradle (1)
- spring cloud (0)
最新评论
-
wujt:
...
Grails_数据库逆向工程插件 db-reverse-engineer -
yy8093:
我也遇到这个问题,不过并不觉得是个好的方法。。。。不过最后也确 ...
关于dubbo服务产生异常之:Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting s -
wujt:
# ----- Execute The Requested C ...
jconsole基础配置(原创) -
gaowei52306:
你好,请问remotedir="/home/dmwe ...
Ant FTP -
抢街饭:
ant生成日志 在命令行也能看见 怎么去做啊
ant生成日志
查询Oracle中的阻塞锁(以及阻塞在哪个数据上)的SQL
数据库阻塞检查处理方法
当应用服务器发生阻塞时(特别是集群1),应先按下面方法检查数据库,以判明应用服务器阻塞是否由数据库阻塞引起。
如果 select * from dba_waiters 有输出,转 阻塞情形A ;
如果 SELECT * FROM v$session_wait WHERE event LIKE 'library%' 有输出,转 阻塞情形B ;
ELSE 马上联系DBA。
阻塞情形A:
1、查看dba_waiters
select * from dba_waiters
发现有大量的等待session。如果无输出,数据库应没有问题。
2、查看等待事件情况
select p.spid pid,
s.sid,
s.SERIAL#,
s.username,
event,
w.p1,
w.P1TEXT,
w.p2,
w.P2TEXT,
w.p3,
w.P3TEXT,
sq.SQL_TEXT,
w.WAIT_TIME,
w.SECONDS_IN_WAIT,
w.STATE
from v$session_wait w, v$session s, v$process p, v$sql sq
where event not like 'SQL%' and w.sid = s.sid and s.paddr = p.addr and
s.SQL_ADDRESS = sq.ADDRESS and s.SQL_HASH_VALUE = sq.HASH_VALUE
发现有大量EVENT列的值是enqueue的记录。
3、查看锁等待情况
SELECT lpad(' ', DECODE(request, 0, 0, 1)) || sid sess,
id1,
id2,
lmode,
request,
type
FROM V$LOCK
WHERE id1 IN (SELECT id1 FROM V$LOCK WHERE lmode = 0)
ORDER BY id1, request
检查是否存在lmode为3的记录,发现session 441把持着一个个DML级的三级锁(存在一条sess=441,lmode=3的记录)
4、查看sid 为441的session情况,记录以下输出并发出到公告版:
select p.SPID, s.*
from v$session s, v$process p
where sid in (441) and p.ADDR = s.PADDR
SPID SID SERIAL#
26358 441 47439
查看该session的用户名、机器名、程序名、执行的sql等信息:
SELECT a.username,
a.machine,
a.program,
a.sid,
a.serial#,
a.status,
c.piece,
c.sql_text
FROM v$session a,
v$sqltext c
WHERE a.sid = <SID>
and a.sql_address=c.address(+)
ORDER BY c.piece
查看该session锁住的对象:
select b.object_name, a.* from v$locked_object a, dba_objects b
where session_id = <SID> and a.object_id = b.object_id
and a.locked_mode = 3
--查看是否有其他进程block这些进程
select * from dba_waiters WHERE waiting_session IN (XXX)
--查看这些session在等待什么事件
SELECT * FROM v$session_wait WHERE sid IN (XXX)
SQL*Net message from client 为 等待和客户端的通讯
5、杀掉sid为441的session
alter system kill session '441,47439';(其中441,47439分别是第四步查出的SID和SERIAL#的值)
6、如果第五步不成功,就需要在操作系统下终止进程。
kill -9 26358 (其中26358 是第四步查出SPID的值)
处理完成后,select * from dba_waiters无记录返回,数据库恢复正常。
阻塞情形B:
[一、分析解决过程]
1。查询发现数据库中有大量的library cache pin等待
SELECT * FROM v$session_wait WHERE event LIKE 'library%'
SID SEQ# EVENT P1TEXT P1
49 10781 library cache pin
75 60508 library cache pin
71 56470 library cache pin
...
2。分析library cache pin在等待的对象,发现是p_zs_bdsp_gb
SELECT kglnaown "Owner", kglnaobj "Object",sw.P1RAW
FROM x$kglob p,v$session_wait sw
WHERE p.kglhdadr=sw.P1RAW and sw.SID=987
db_zgxt p_zs_bdsp_gb 00000008E9AC7710
3。随便选等待中的一个session,查找引起library cache pin等待的session。发现其他session都在等待173
SELECT s.sid, kglpnmod "Mode", kglpnreq "Req"
FROM x$kglpn p, v$session s,V$SESSION_WAIT SW
WHERE p.kglpnuse=s.saddr
AND P.kglpnhdl=sw.P1RAW AND Sw.SID=987 order by mode desc
SID Mode Req
173 3 0
1224 0 2
1322 0 2
692 0 2
...
4。查找173的等待情况,发现它也是在等待library cache pin。
SELECT * FROM v$session_wait WHERE sid= 173
173 5502 library cache pin handle address 38280132368 00000008E9AC7710
5。继续查找是哪个session引起173的等待,发现是121
SELECT s.sid, kglpnmod "Mode", kglpnreq "Req"
FROM x$kglpn p, v$session s,V$SESSION_WAIT SW
WHERE p.kglpnuse=s.saddr
AND P.kglpnhdl=sw.P1RAW AND Sw.SID=173
121 2 0
173 0 3
6。查找121的session等待情况,发现它是在等待SQL*Net message from client,这是客户端和服务器之间
的通讯。因此可判定121是引起一系列等待的原因。
SID SEQ# EVENT P1TEXT P1 P1RAW
121 22946 SQL*Net message from client
7。查看121session的情况
select p.spid,s.* from v$session s ,v$process p where s.paddr=p.addr and S.sid in (121)
25645 00000008D5364860 121 89 3844244 00000008D438D518 40 DB_ZGXT 2 2147483644 00000008E130CDA0 ACTIVE DEDICATED 40 DB_ZGXT weblogic app02
8。在操作系统中发现25645进程(也即是121session)已经运行了6个多小时。
[db2:oracle2]prstat
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
25645 oracle2 24G 13G cpu194 0 0 6:16:02 2.3% oracle/2
9946 oracle2 24G 13G sleep 60 0 0:24:33 2.1% oracle/2
9。杀掉session 121后,应用恢复正常。
SQL> alter system kill session '121,89';
alter system kill session '121,89'
*
ERROR at line 1:
ORA-00031: session marked for kill
[db2:oracle2]kill -9 25645
------------------------
----------------------------------------------------------
-- 查找使用了什么语句,这个不一定有用(对于等待commit/rollback)
-- 的操作失效
select st.SQL_TEXT
from v$sqltext st,
v$session si
where st.ADDRESS = si.SQL_ADDRESS
and st.HASH_VALUE = si.SQL_HASH_VALUE
and si.SID in ()
order by st.PIECE
----------------------------------------------------------
-- 查找锁的类型、锁住的对象
select distinct lk.TYPE,lk.LMODE,do.owner || '.' || do.object_name
from v$lock lk,
v$locked_object lo,
dba_objects do
where do.object_id = lo.OBJECT_ID
and lo.SESSION_ID = lk.SID
and lk.SID in ()
数据库阻塞检查处理方法
当应用服务器发生阻塞时(特别是集群1),应先按下面方法检查数据库,以判明应用服务器阻塞是否由数据库阻塞引起。
如果 select * from dba_waiters 有输出,转 阻塞情形A ;
如果 SELECT * FROM v$session_wait WHERE event LIKE 'library%' 有输出,转 阻塞情形B ;
ELSE 马上联系DBA。
阻塞情形A:
1、查看dba_waiters
select * from dba_waiters
发现有大量的等待session。如果无输出,数据库应没有问题。
2、查看等待事件情况
select p.spid pid,
s.sid,
s.SERIAL#,
s.username,
event,
w.p1,
w.P1TEXT,
w.p2,
w.P2TEXT,
w.p3,
w.P3TEXT,
sq.SQL_TEXT,
w.WAIT_TIME,
w.SECONDS_IN_WAIT,
w.STATE
from v$session_wait w, v$session s, v$process p, v$sql sq
where event not like 'SQL%' and w.sid = s.sid and s.paddr = p.addr and
s.SQL_ADDRESS = sq.ADDRESS and s.SQL_HASH_VALUE = sq.HASH_VALUE
发现有大量EVENT列的值是enqueue的记录。
3、查看锁等待情况
SELECT lpad(' ', DECODE(request, 0, 0, 1)) || sid sess,
id1,
id2,
lmode,
request,
type
FROM V$LOCK
WHERE id1 IN (SELECT id1 FROM V$LOCK WHERE lmode = 0)
ORDER BY id1, request
检查是否存在lmode为3的记录,发现session 441把持着一个个DML级的三级锁(存在一条sess=441,lmode=3的记录)
4、查看sid 为441的session情况,记录以下输出并发出到公告版:
select p.SPID, s.*
from v$session s, v$process p
where sid in (441) and p.ADDR = s.PADDR
SPID SID SERIAL#
26358 441 47439
查看该session的用户名、机器名、程序名、执行的sql等信息:
SELECT a.username,
a.machine,
a.program,
a.sid,
a.serial#,
a.status,
c.piece,
c.sql_text
FROM v$session a,
v$sqltext c
WHERE a.sid = <SID>
and a.sql_address=c.address(+)
ORDER BY c.piece
查看该session锁住的对象:
select b.object_name, a.* from v$locked_object a, dba_objects b
where session_id = <SID> and a.object_id = b.object_id
and a.locked_mode = 3
--查看是否有其他进程block这些进程
select * from dba_waiters WHERE waiting_session IN (XXX)
--查看这些session在等待什么事件
SELECT * FROM v$session_wait WHERE sid IN (XXX)
SQL*Net message from client 为 等待和客户端的通讯
5、杀掉sid为441的session
alter system kill session '441,47439';(其中441,47439分别是第四步查出的SID和SERIAL#的值)
6、如果第五步不成功,就需要在操作系统下终止进程。
kill -9 26358 (其中26358 是第四步查出SPID的值)
处理完成后,select * from dba_waiters无记录返回,数据库恢复正常。
阻塞情形B:
[一、分析解决过程]
1。查询发现数据库中有大量的library cache pin等待
SELECT * FROM v$session_wait WHERE event LIKE 'library%'
SID SEQ# EVENT P1TEXT P1
49 10781 library cache pin
75 60508 library cache pin
71 56470 library cache pin
...
2。分析library cache pin在等待的对象,发现是p_zs_bdsp_gb
SELECT kglnaown "Owner", kglnaobj "Object",sw.P1RAW
FROM x$kglob p,v$session_wait sw
WHERE p.kglhdadr=sw.P1RAW and sw.SID=987
db_zgxt p_zs_bdsp_gb 00000008E9AC7710
3。随便选等待中的一个session,查找引起library cache pin等待的session。发现其他session都在等待173
SELECT s.sid, kglpnmod "Mode", kglpnreq "Req"
FROM x$kglpn p, v$session s,V$SESSION_WAIT SW
WHERE p.kglpnuse=s.saddr
AND P.kglpnhdl=sw.P1RAW AND Sw.SID=987 order by mode desc
SID Mode Req
173 3 0
1224 0 2
1322 0 2
692 0 2
...
4。查找173的等待情况,发现它也是在等待library cache pin。
SELECT * FROM v$session_wait WHERE sid= 173
173 5502 library cache pin handle address 38280132368 00000008E9AC7710
5。继续查找是哪个session引起173的等待,发现是121
SELECT s.sid, kglpnmod "Mode", kglpnreq "Req"
FROM x$kglpn p, v$session s,V$SESSION_WAIT SW
WHERE p.kglpnuse=s.saddr
AND P.kglpnhdl=sw.P1RAW AND Sw.SID=173
121 2 0
173 0 3
6。查找121的session等待情况,发现它是在等待SQL*Net message from client,这是客户端和服务器之间
的通讯。因此可判定121是引起一系列等待的原因。
SID SEQ# EVENT P1TEXT P1 P1RAW
121 22946 SQL*Net message from client
7。查看121session的情况
select p.spid,s.* from v$session s ,v$process p where s.paddr=p.addr and S.sid in (121)
25645 00000008D5364860 121 89 3844244 00000008D438D518 40 DB_ZGXT 2 2147483644 00000008E130CDA0 ACTIVE DEDICATED 40 DB_ZGXT weblogic app02
8。在操作系统中发现25645进程(也即是121session)已经运行了6个多小时。
[db2:oracle2]prstat
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
25645 oracle2 24G 13G cpu194 0 0 6:16:02 2.3% oracle/2
9946 oracle2 24G 13G sleep 60 0 0:24:33 2.1% oracle/2
9。杀掉session 121后,应用恢复正常。
SQL> alter system kill session '121,89';
alter system kill session '121,89'
*
ERROR at line 1:
ORA-00031: session marked for kill
[db2:oracle2]kill -9 25645
------------------------
----------------------------------------------------------
-- 查找使用了什么语句,这个不一定有用(对于等待commit/rollback)
-- 的操作失效
select st.SQL_TEXT
from v$sqltext st,
v$session si
where st.ADDRESS = si.SQL_ADDRESS
and st.HASH_VALUE = si.SQL_HASH_VALUE
and si.SID in ()
order by st.PIECE
----------------------------------------------------------
-- 查找锁的类型、锁住的对象
select distinct lk.TYPE,lk.LMODE,do.owner || '.' || do.object_name
from v$lock lk,
v$locked_object lo,
dba_objects do
where do.object_id = lo.OBJECT_ID
and lo.SESSION_ID = lk.SID
and lk.SID in ()
发表评论
-
在oracle10g中如何恢复drop掉的表
2014-11-19 15:17 801在oracle10g中如何恢复drop掉的表 在oracl ... -
左关联右关联全关联
2014-11-10 17:06 3887左关联右关联全关联 参考:http://www.cn ... -
win8系统倒入数据imp-00058错误
2014-09-21 17:52 699win8系统倒入数据imp-00058错误 ... -
oracle中如何判断字符串是否全为数字,以及从任意字符串中提取数字
2013-12-18 13:09 1508本文介绍了判断字符串是否全为数字的4种办法,另外还介绍了一个t ... -
查询闪存
2013-12-17 09:36 796(1)查询目标表30分钟前的数据 select * from ... -
ORA-00031: session marked for kill 处理Oracle中杀不掉的锁
2013-08-16 13:35 725ORA-00031: session marked for k ... -
Oracle创建表空间、创建用户以及授权
2013-07-30 11:30 718Oracle创建表空间、创建用户以及授权 创建临时表空间 创 ... -
Oracle中诊断阻塞session的方法 blocking error
2014-10-22 11:36 716Oracle中诊断阻塞session的方法 blocking ... -
查询Oracle中的阻塞锁(以及阻塞在哪个数据上)的SQL
2013-01-19 13:58 0查询Oracle中的阻塞锁(以及阻塞在哪个数据上)的SQL 数 ... -
ORACLE阻塞
2013-01-19 13:56 921ORACLE阻塞 案例一: 34.//SYS窗口 35. ... -
数据库阻塞和死锁的区别(转载)
2013-01-19 13:30 1381数据库阻塞和死锁的区别(转载) 数据库阻塞和死锁在程序开发过程 ... -
oracle 死锁和锁等待的区别(转载)
2013-01-19 13:27 1326oracle 死锁和锁等待的区别(转载) 所谓的锁等待:就是 ... -
关于“ORA-00060:等待资源时检测到死锁”问题的分析(转载)
2013-01-19 13:26 1354关于“ORA-00060:等待资源时检测到死锁”问题的分析(转 ... -
查询Oracle正在执行和执行过的SQL语句
2013-01-18 22:55 0查询Oracle正在执行和执行过的SQL语句 ---正在执 ... -
如何检测被锁住的Oracle存储过程(转帖)
2013-01-18 17:39 871如何检测被锁住的Oracle存储过程(转帖) 1.查看是哪 ... -
Oracle死锁的处理
2013-01-18 17:29 742Oracle死锁的处理 Oracle死锁问题应该如何解决呢?可 ... -
oracle 查询所有表的记录数 SQL
2013-01-18 15:06 1307oracle 查询所有表的记录数 SQL create o ... -
oracle enterprise manager console 出现 ora-12154:TNS:无法处理的服务名
2011-11-27 20:23 1193登录oracle enterprise manager con ... -
启动服务报错ORA-12505
2011-10-25 18:23 1469今天在工作中配置plsqldev时,报错误是找不到服务名 同 ... -
ORACLE-数据库导出(exp)/ 导入(imp)
2011-06-09 09:42 1498exp 将数据库内的各对象以二进制方式下载成dmp 文件, ...
相关推荐
在 Oracle 数据库中,锁表是指用户在进行数据操作时临时锁定的表,以防止其他用户同时对该表进行操作。但是,锁表也可能会导致其他用户无法访问该表,从而影响系统的性能。因此,查询用户锁表是非常必要的,以便诊断...
脚本查询当前数据库阻塞,阻塞会话事物,进程,锁类型等
行级锁在Oracle中以X锁(Exclusive Lock)的形式存在,用于在事务中保护单个数据行。例如,当用户A尝试更新employee_id为100的记录时,Oracle会在该行上设置X锁。如果用户B尝试同时更新同一行,B会被阻塞直到A提交或...
无论是SQL Server还是Oracle,关键在于理解阻塞的根本原因,这可能涉及数据库设计、SQL查询优化、事务管理、索引策略等多个方面。通过使用合适的监控工具,配合数据库日志分析,可以有效地预防和解决数据库阻塞问题...
在Oracle数据库管理中,批量执行SQL脚本是常见的任务,特别是在数据处理、系统维护或自动化测试等场景。本文将深入探讨如何在Oracle环境中批量执行带有多个参数的多个SQL文件,以便进行高效的数据操作和测试。 首先...
在Oracle数据库管理系统中,"查询Oracle锁"是一项关键任务,用于诊断和解决并发操作中的阻塞问题。当多个事务尝试同时访问同一资源时,可能会发生锁冲突,导致某些事务等待其他事务完成。了解如何查询并分析这些锁...
Oracle SQL高级编程是数据库管理与开发领域中的一个重要主题,它涵盖了数据库设计、查询优化、存储过程、触发器、索引策略、并发控制以及安全性等方面的知识。在这个领域,Oracle数据库系统以其强大功能和广泛的企业...
ORACLE经典语句汇总 ...Oracle中恢复某张表丢失数据的方法 -- 把SELECT出来的结果导到一个文本文件中 -- 查询新建用户 -- 查询那些用户,操纵了那些表造成了锁机 --看锁阻塞的方法 --ORACLE获得系统信息
然而,在Oracle 8.0.x中执行"获取正在等待锁资源的用户名"的查询语句是十分缓慢的,而执行"查找阻塞其它用户的用户进程"的查询语句也是如此。 为了解决这个问题,可以通过将问题发生时的 v$lock、v$session 视图中...
这种做法虽然保证了严格的事务顺序,但可能影响系统性能,特别是在数据锁定时间长或锁定范围大的情况下。为了优化这一点,SQL Server 7引入了行级锁定,减少了锁定数据量,降低了锁竞争的可能性。 在SQL Server中,...
在Oracle数据库管理中,"快速查找Oracle锁对象"是一个关键任务,特别是在处理并发事务和解决性能问题时。当多个用户或进程同时访问同一资源时,可能会出现锁冲突,导致某些事务等待,影响数据库的正常运行。了解如何...
乐观锁是在数据变化时才加锁,并发性高,前提是假定用户冲突是很小的。 在 SQL Server 中,锁机制分为四个级别:表级、盘区级、页级、行级。锁的分类有共享锁、更新锁、排它锁、意图锁、系统锁等。 共享锁(S):...
3. **查询数据**:在Oracle数据库中使用`Statement`或`PreparedStatement`执行SQL查询,获取需要同步的数据。 4. **数据转换**:根据业务需求,可能需要对查询结果进行处理,比如数据类型转换、格式化等。 5. **...
查找阻塞进程sql的方法,查找阻塞进程sql的方法,减少死锁
在Oracle数据库环境中,实现高性能SQL调优是提升系统整体性能的关键步骤。这涉及到对SQL查询的优化,以减少处理时间,降低资源消耗,提高数据访问速度。以下是对"Oracle高性能SQL调整"这一主题的深入探讨。 一、SQL...
通过查询锁信息,DBA能够快速识别出导致阻塞或性能问题的原因,并采取相应的措施进行解决。例如,在高负载环境下,某些长时间运行的查询可能会锁定大量数据,从而导致其他进程等待。在这种情况下,及时释放这些锁...
Oracle锁和阻塞原理解析.pdf 了解锁和阻塞是 oracle troubleshooting 必备的技能;在说锁和阻塞之前,我们先了解下 并发(concurrency)和并行(parallel)。并发意思是在数据库中有超过两个以上用户对同样的数 据做修改...
在Oracle数据库管理中,锁机制是用于控制并发访问的重要手段之一。然而,在某些情况下,不当的锁可能会导致性能问题甚至系统故障,因此掌握如何解锁变得至关重要。本文将详细介绍Oracle解锁方法的相关知识点,包括...