- 浏览: 85983 次
- 性别:
- 来自: 北京
最新评论
同事反映,删除一条数据总是没有反应,请求协助解决.
问题非常明显,肯定是有某个session在block他的session,导致一直在等待资源的释放.于是很快将问题定位,得到如下数据:
那session 389究竟在干什么呢? 于是问题就来了,发现该session的状态是inactive,没有任何SQL在运行,通过prev_hash_value找到给session上次执行的SQL,看看是否能够找到问题,发现SQL如下:
这是什么SQL?
当前这个sesion现在没有执行任何SQL,怎么会block住另外一个session呢?原因是,我们去查询另外一个表v$transaction就会知道,该session拥有一个事务,事务的状态是active的,session的状态表示有没有正在运行的SQL,不能代表有没有活动事务存在.
而该事务有事在干什么呢?经查询得知,这个SQL是由client端发出的SQL,从而导致了一些辅助的输出信息,导致了真正的SQL语句.
---
1.sqlplus 远程连接服务器
2.pl/sql developer 远程连接服务器
3.ssh 连接上服务器登陆 sqlplus
1、2、3 有什么区别呢?
为什么要看这个区别呢?起因是 我在plsql developer 执行过sql后,总是通过v$session 和v$sql 连接总是找不到执行过的sql,觉得很奇怪
所有有了以下的测试过程
--测试一下
--要测试执行的sql
select * from v$MYSTAT WHERE ROWNUM<2;
exec dbms_monitor.session_trace_enable;
select * from t_order order by a desc,b;
exec dbms_monitor.session_trace_disable;
--测试过程中检查的sql,在执行select * from t_order order by a desc,b;后 进行检查
select sql_id,prev_sql_id from v$session where SID=&sid; --得到运行过select * from t_order order by a desc,b;的 sql_id,prev_sql_id
SELECT SQL_ID,SQL_TEXT FROM V$SQL WHERE SQL_ID IN(&sqlid1,&sqlid2); --根据sql_id,prev_sql_id 得到sql
select spid from v$process where addr=(select paddr from v$session where sid=&sid); --根据sid 得到后台跟踪日志的名字(sid_ora_spid.trc)
1.sqlplus 远程连接服务器 执行
SQL> COL SQL_TEXT FOR A60
SQL> select sql_id,prev_sql_id from v$session where SID=409;
SQL_ID PREV_SQL_ID
------------- -------------
9babjv8yq8ru3
SQL> SELECT SQL_ID,SQL_TEXT FROM V$SQL WHERE SQL_ID IN('9babjv8yq8ru3','9babjv8yq8ru3');
SQL_ID SQL_TEXT
------------- ------------------------------------------------------------
9babjv8yq8ru3 BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END; --得到了 “BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END;” 的sql
SQL> select spid from v$process where addr=(select paddr from v$session where sid=409);
SPID
------------
27909
--查看跟踪日志
sql执行的内部过程(不包含sys用户执行的sql):
BEGIN dbms_monitor.session_trace_enable; END;
BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END;
SELECT NVL(SUM(C1),:"SYS_B_0"), NVL(SUM(C2),:"SYS_B_1") FROM (SELECT :"SYS_B_2" AS C1, :"SYS_B_3" AS C2 FROM "T_ORDER" "T_ORDER") SAMPLESUB
select * from t_order order by a desc,b
BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END;
BEGIN dbms_monitor.session_trace_disable; END;
2.pl/sql developer 远程连接服务器
SQL> COL SQL_TEXT FOR A60
SQL> select sql_id,prev_sql_id from v$session where SID=401;
SQL_ID PREV_SQL_ID
------------- -------------
9m7787camwh4m
SQL> SELECT SQL_ID,SQL_TEXT FROM V$SQL WHERE SQL_ID IN('9m7787camwh4m','9m7787camwh4m');
SQL_ID SQL_TEXT
------------- ------------------------------------------------------------
9m7787camwh4m begin :id := sys.dbms_transaction.local_transaction_id; end; --得到“begin :id := sys.dbms_transaction.local_transaction_id; end;”的sql
SQL> select spid from v$process where addr=(select paddr from v$session where sid=401);
SPID
------------
28716
--查看跟踪日志
sql执行的内部过程(不包含sys用户执行的sql):
begin dbms_monitor.session_trace_enable; end;
begin
sys.dbms_output.get_line(line => :line, status => :status);
end;
begin :id := sys.dbms_transaction.local_transaction_id; end;
select 'x' from dual
begin :id := sys.dbms_transaction.local_transaction_id; end;
SELECT NVL(SUM(C1),:"SYS_B_0"), NVL(SUM(C2),:"SYS_B_1") FROM (SELECT :"SYS_B_2" AS C1, :"SYS_B_3" AS C2 FROM "T_ORDER" "T_ORDER") SAMPLESUB
select * from t_order order by a desc,b
begin :id := sys.dbms_transaction.local_transaction_id; end;
begin
sys.dbms_output.get_line(line => :line, status => :status);
end;
begin :id := sys.dbms_transaction.local_transaction_id; end;
begin dbms_monitor.session_trace_disable; end;
3.ssh 连接上服务器登陆 sqlplus
SQL> select sql_id,prev_sql_id from v$session where SID=417;
SQL_ID PREV_SQL_ID
------------- -------------
btm331qqa163c
SQL> SELECT SQL_ID,SQL_TEXT FROM V$SQL WHERE SQL_ID IN('btm331qqa163c','btm331qqa163c');
SQL_ID SQL_TEXT
------------- ------------------------------------------------------------
btm331qqa163c select * from t_order order by a desc,b --得到了执行的sql :select * from t_order order by a desc,b
btm331qqa163c
SQL> select spid from v$process where addr=(select paddr from v$session where sid=417);
SPID
------------
26220
--查看跟踪日志
sql执行的内部过程(不包含sys用户执行的sql):
BEGIN dbms_monitor.session_trace_enable; END;
SELECT NVL(SUM(C1),:"SYS_B_0"), NVL(SUM(C2),:"SYS_B_1") FROM (SELECT :"SYS_B_2" AS C1, :"SYS_B_3" AS C2 FROM "T_ORDER" "T_ORDER") SAMPLESUB
select * from t_order order by a desc,b
BEGIN dbms_monitor.session_trace_disable; END;
总结:1、在客户端执行sql过程中,我们比较难得到执行过了什么sql,因为他们都被 dbms_output.get_line,DBMS_OUTPUT.GET_LINES 这样的sql覆盖了
2、在服务器上执行sql过程中,是比较容易得到sql的
问题非常明显,肯定是有某个session在block他的session,导致一直在等待资源的释放.于是很快将问题定位,得到如下数据:
SESS ID1 ID2 LMODE REQUEST TYPE CTIME BLOCK Holder: 389 17267 0 3 0 TM 8758 1 Waiter: 182 17267 0 0 4 TM 1946 0
那session 389究竟在干什么呢? 于是问题就来了,发现该session的状态是inactive,没有任何SQL在运行,通过prev_hash_value找到给session上次执行的SQL,看看是否能够找到问题,发现SQL如下:
引用
begin :id := sys.dbms_transaction.local_transaction_id; end;
这是什么SQL?
当前这个sesion现在没有执行任何SQL,怎么会block住另外一个session呢?原因是,我们去查询另外一个表v$transaction就会知道,该session拥有一个事务,事务的状态是active的,session的状态表示有没有正在运行的SQL,不能代表有没有活动事务存在.
而该事务有事在干什么呢?经查询得知,这个SQL是由client端发出的SQL,从而导致了一些辅助的输出信息,导致了真正的SQL语句.
---
1.sqlplus 远程连接服务器
2.pl/sql developer 远程连接服务器
3.ssh 连接上服务器登陆 sqlplus
1、2、3 有什么区别呢?
为什么要看这个区别呢?起因是 我在plsql developer 执行过sql后,总是通过v$session 和v$sql 连接总是找不到执行过的sql,觉得很奇怪
所有有了以下的测试过程
--测试一下
--要测试执行的sql
select * from v$MYSTAT WHERE ROWNUM<2;
exec dbms_monitor.session_trace_enable;
select * from t_order order by a desc,b;
exec dbms_monitor.session_trace_disable;
--测试过程中检查的sql,在执行select * from t_order order by a desc,b;后 进行检查
select sql_id,prev_sql_id from v$session where SID=&sid; --得到运行过select * from t_order order by a desc,b;的 sql_id,prev_sql_id
SELECT SQL_ID,SQL_TEXT FROM V$SQL WHERE SQL_ID IN(&sqlid1,&sqlid2); --根据sql_id,prev_sql_id 得到sql
select spid from v$process where addr=(select paddr from v$session where sid=&sid); --根据sid 得到后台跟踪日志的名字(sid_ora_spid.trc)
1.sqlplus 远程连接服务器 执行
SQL> COL SQL_TEXT FOR A60
SQL> select sql_id,prev_sql_id from v$session where SID=409;
SQL_ID PREV_SQL_ID
------------- -------------
9babjv8yq8ru3
SQL> SELECT SQL_ID,SQL_TEXT FROM V$SQL WHERE SQL_ID IN('9babjv8yq8ru3','9babjv8yq8ru3');
SQL_ID SQL_TEXT
------------- ------------------------------------------------------------
9babjv8yq8ru3 BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END; --得到了 “BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END;” 的sql
SQL> select spid from v$process where addr=(select paddr from v$session where sid=409);
SPID
------------
27909
--查看跟踪日志
sql执行的内部过程(不包含sys用户执行的sql):
BEGIN dbms_monitor.session_trace_enable; END;
BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END;
SELECT NVL(SUM(C1),:"SYS_B_0"), NVL(SUM(C2),:"SYS_B_1") FROM (SELECT :"SYS_B_2" AS C1, :"SYS_B_3" AS C2 FROM "T_ORDER" "T_ORDER") SAMPLESUB
select * from t_order order by a desc,b
BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END;
BEGIN dbms_monitor.session_trace_disable; END;
2.pl/sql developer 远程连接服务器
SQL> COL SQL_TEXT FOR A60
SQL> select sql_id,prev_sql_id from v$session where SID=401;
SQL_ID PREV_SQL_ID
------------- -------------
9m7787camwh4m
SQL> SELECT SQL_ID,SQL_TEXT FROM V$SQL WHERE SQL_ID IN('9m7787camwh4m','9m7787camwh4m');
SQL_ID SQL_TEXT
------------- ------------------------------------------------------------
9m7787camwh4m begin :id := sys.dbms_transaction.local_transaction_id; end; --得到“begin :id := sys.dbms_transaction.local_transaction_id; end;”的sql
SQL> select spid from v$process where addr=(select paddr from v$session where sid=401);
SPID
------------
28716
--查看跟踪日志
sql执行的内部过程(不包含sys用户执行的sql):
begin dbms_monitor.session_trace_enable; end;
begin
sys.dbms_output.get_line(line => :line, status => :status);
end;
begin :id := sys.dbms_transaction.local_transaction_id; end;
select 'x' from dual
begin :id := sys.dbms_transaction.local_transaction_id; end;
SELECT NVL(SUM(C1),:"SYS_B_0"), NVL(SUM(C2),:"SYS_B_1") FROM (SELECT :"SYS_B_2" AS C1, :"SYS_B_3" AS C2 FROM "T_ORDER" "T_ORDER") SAMPLESUB
select * from t_order order by a desc,b
begin :id := sys.dbms_transaction.local_transaction_id; end;
begin
sys.dbms_output.get_line(line => :line, status => :status);
end;
begin :id := sys.dbms_transaction.local_transaction_id; end;
begin dbms_monitor.session_trace_disable; end;
3.ssh 连接上服务器登陆 sqlplus
SQL> select sql_id,prev_sql_id from v$session where SID=417;
SQL_ID PREV_SQL_ID
------------- -------------
btm331qqa163c
SQL> SELECT SQL_ID,SQL_TEXT FROM V$SQL WHERE SQL_ID IN('btm331qqa163c','btm331qqa163c');
SQL_ID SQL_TEXT
------------- ------------------------------------------------------------
btm331qqa163c select * from t_order order by a desc,b --得到了执行的sql :select * from t_order order by a desc,b
btm331qqa163c
SQL> select spid from v$process where addr=(select paddr from v$session where sid=417);
SPID
------------
26220
--查看跟踪日志
sql执行的内部过程(不包含sys用户执行的sql):
BEGIN dbms_monitor.session_trace_enable; END;
SELECT NVL(SUM(C1),:"SYS_B_0"), NVL(SUM(C2),:"SYS_B_1") FROM (SELECT :"SYS_B_2" AS C1, :"SYS_B_3" AS C2 FROM "T_ORDER" "T_ORDER") SAMPLESUB
select * from t_order order by a desc,b
BEGIN dbms_monitor.session_trace_disable; END;
总结:1、在客户端执行sql过程中,我们比较难得到执行过了什么sql,因为他们都被 dbms_output.get_line,DBMS_OUTPUT.GET_LINES 这样的sql覆盖了
2、在服务器上执行sql过程中,是比较容易得到sql的
发表评论
-
dbms_output can not put the zero
2011-08-25 09:29 760DECLARE V_INTA NUMBER ... -
what is the difference between object_id and data_object_id?
2011-08-24 09:17 959The object_id is the primary k ... -
oracle EXECUTE IMMEDIATE ora-00911
2011-08-14 10:15 1519I get an error when I try to ex ... -
Will the valid status of index impact dml operation?
2011-08-05 10:34 852DROP TABLE tab01; SELECT * FRO ... -
where can i find the job number of those jobs defined in dba_scheduler_jobs?
2011-08-01 10:41 856Question: Hello, could anybody ... -
Listener HPUX Error: 242: No route to host
2011-05-17 14:55 989现象: 引用LSNRCTL> status Conne ... -
open database with ORA-00704 and ORA-39700
2011-05-06 16:13 29251,Error 1)alter.log Fri May ... -
oracle text index create and use
2011-05-06 13:41 1925一、Install Text Index 1,The ste ... -
offline datafile and offline tablespace
2011-05-04 11:43 25341)offline datafile OFFLINE Spe ... -
oracle three type of block size
2011-04-28 17:35 776Tools: 引用[oracle@node oracle]$ ... -
bbed一(安装)
2011-04-26 14:54 1519bbed ----------------------- bl ... -
Strategies for RAC inter-instance parallelized queries
2011-04-25 14:14 1142I recently had to sit down and ... -
Enable Row Movement in Partitioning and Overhead
2011-04-24 14:03 1567Question 1: Hi, I am partitio ... -
Row Movement in Oracle
2011-04-23 22:23 2003One of the relatively newer fea ... -
ORA-14402 updating partition key column
2011-04-23 19:48 6392做DBA几年来,经常遇到项目到了维护期总是修改表的结构,原因很 ... -
ORACLE DSI 介绍
2011-04-19 18:33 882DSI是Data Server Internals的缩写,是O ... -
Oracle / Buffer cache
2011-04-19 17:18 799引用8.7 Tuning the Operating Syst ...
相关推荐
SQLServer进程阻塞的检查和解决办法,有具体的代码,使用方便~
有vc++ 实现进程调用的功能 PA 进程把内容读进缓冲区一 PB进程复制缓冲区一内容到缓冲区二 pc进程打印缓冲区二中的内容
1。生产者消费者问题(信号量+mutex) 参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,...编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
1。生产者消费者问题(信号量+mutex) 参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,...编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
通过进程的创建和控制的设计来达到如下目的: 加深对进程概念的理解,明确进程和程序的区别; 进一步认识并发执行的概念,区别顺序执行和并发执行;... 分析进程争用临界资源的现象,学习解决进程互斥的方法;
根据银行家算法的思想,编写程序,解决并发进程的死锁问题。 本实验要求设计并实现银行家算法。银行家算法是死锁避免的经典算法,其核心思想是:进程动态地申请资源,每次申请资源时系统都执行安全状态检查算法判断...
如果申请的资源被阻塞则进入相应的等待队列,调度程序调度就绪队列中的下一个进程。进程运行结束时,会检查对应的等待队列,激活队列中的进程进入就绪队列。运行结束的进程进入over链表。重复这一过程直至就绪队列为...
在父进程中调用wait(),则父进程被阻塞,进入等待队列,等待子进程结束。当子进程结束时,父进程从wait()返回继续执行原来的程序。 返回值:大于0时,为子进程的ID值;等于-1时,调用失败。 3) exit() 是进程结束时...
花了两天时间整理了进程间通讯的代码,包括剪切板,匿名管道。匿名管道读取数据时容易发生阻塞,界面卡死,通过优化流程,解决了阻塞问题。欢迎下载交流,如果有问题敬请留言,谢谢!
本篇文字是关于IO多路复用的更深入一步的总结,上一篇Python之进程+线程+协程(事件驱动模型、IO多路复用、select与epoll)对IO多路复用进行了概念性的分析,本篇则是对阻塞IO、非阻塞IO、与异步进行通俗性的比较和...
引入3个信号量和一个控制变量: 1)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0; 2)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0; 3)信号量...
当缓冲池已满而生产者试图生产产品并向缓冲池放入产品时,生产者进程阻塞,公共缓冲池里的每一个产品变成黄色,问题提示框显示warning: it's full!Producer is block。整个模拟过程通俗易懂,利于理解,能很好的帮助...
进程阻塞(等待) D.新进程创建 17.下列的进程状态变化中不可能发生的变化就是___A___。 A.等待 运行 B.运行 等待 C.运行 就绪 D.等待 就绪 18.如果有三个进程共享同一互斥段,而且每次最多允许两个进程进入该互斥段,则...
设计技术参数:①本程序用两种算法对五个进程进行调度,每个进程可有三个状态(就绪、运行、阻塞),并假设初始状态为就绪状态。②为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转...
如果申请的资源被阻塞则进入相应的等待队列,调度程序调度就绪队列中的下一个进程。进程运行结束时,会检查对应的等待队列,激活队列中的进程进入就绪队列。运行结束的进程进入over链表。重复这一过程直至就绪队列为...
教材中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
利用Windows提供的API函数,编写程序,解决生产者与消费者问题,实现进程的互斥与同步。 背景知识 1. 本实验要求设计在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供...
对于数据库运维人员来说创建session或者查询时产生问题是常规情况,下面介绍一种很有效且不借助第三方工具的方式来解决类似问题。 最近开始接触运维工作,所以自己总结一些方案便于不懂数据库的同事解决一些不太紧要...
教材中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
答:1)就绪状态→执行状态:进程分配到CPU资源 2)执行状态→就绪状态:时间片用完 3)执行状态→阻塞状态:I/O请求 4)阻塞状态→就绪状态:I/O完成 2、文件的“打开”和“关闭”操作 “打开”是指系统将指名文件...