`
MicroJoey
  • 浏览: 85983 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一进程阻塞问题解决

阅读更多
同事反映,删除一条数据总是没有反应,请求协助解决.

问题非常明显,肯定是有某个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的





分享到:
评论

相关推荐

    SQLServer进程阻塞的检查和解决办法

    SQLServer进程阻塞的检查和解决办法,有具体的代码,使用方便~

    进程调用问题 实现打印问题 又三个进程

    有vc++ 实现进程调用的功能 PA 进程把内容读进缓冲区一 PB进程复制缓冲区一内容到缓冲区二 pc进程打印缓冲区二中的内容

    进程线程之间的同步生产者消费者信号量读者写者写者优先

    1。生产者消费者问题(信号量+mutex) 参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,...编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。

    操作系统实验二:进程、线程之间的同步

    1。生产者消费者问题(信号量+mutex) 参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,...编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。

    进程 创建 撤销 控制

    通过进程的创建和控制的设计来达到如下目的: 加深对进程概念的理解,明确进程和程序的区别; 进一步认识并发执行的概念,区别顺序执行和并发执行;... 分析进程争用临界资源的现象,学习解决进程互斥的方法;

    银行家算法的思想,编写程序,解决并发进程的死锁问题。

    根据银行家算法的思想,编写程序,解决并发进程的死锁问题。 本实验要求设计并实现银行家算法。银行家算法是死锁避免的经典算法,其核心思想是:进程动态地申请资源,每次申请资源时系统都执行安全状态检查算法判断...

    生产者与消费者 进程的同步与互斥模拟

    如果申请的资源被阻塞则进入相应的等待队列,调度程序调度就绪队列中的下一个进程。进程运行结束时,会检查对应的等待队列,激活队列中的进程进入就绪队列。运行结束的进程进入over链表。重复这一过程直至就绪队列为...

    操作系统上机实验报告-进程的管道通信

    在父进程中调用wait(),则父进程被阻塞,进入等待队列,等待子进程结束。当子进程结束时,父进程从wait()返回继续执行原来的程序。 返回值:大于0时,为子进程的ID值;等于-1时,调用失败。 3) exit() 是进程结束时...

    进程间通讯进程间通讯

    花了两天时间整理了进程间通讯的代码,包括剪切板,匿名管道。匿名管道读取数据时容易发生阻塞,界面卡死,通过优化流程,解决了阻塞问题。欢迎下载交流,如果有问题敬请留言,谢谢!

    Python之进程+线程+协程(异步、selectors模块、阻塞、非阻塞IO)

    本篇文字是关于IO多路复用的更深入一步的总结,上一篇Python之进程+线程+协程(事件驱动模型、IO多路复用、select与epoll)对IO多路复用进行了概念性的分析,本篇则是对阻塞IO、非阻塞IO、与异步进行通俗性的比较和...

    同步互斥解决理发师问题

     引入3个信号量和一个控制变量: 1)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0; 2)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0; 3)信号量...

    操作系统课设-生产者消费者问题.zip

    当缓冲池已满而生产者试图生产产品并向缓冲池放入产品时,生产者进程阻塞,公共缓冲池里的每一个产品变成黄色,问题提示框显示warning: it's full!Producer is block。整个模拟过程通俗易懂,利于理解,能很好的帮助...

    计算机操作系统作业二.doc

    进程阻塞(等待) D.新进程创建 17.下列的进程状态变化中不可能发生的变化就是___A___。 A.等待 运行 B.运行 等待 C.运行 就绪 D.等待 就绪 18.如果有三个进程共享同一互斥段,而且每次最多允许两个进程进入该互斥段,则...

    操作系统课程设计 进程调度

    设计技术参数:①本程序用两种算法对五个进程进行调度,每个进程可有三个状态(就绪、运行、阻塞),并假设初始状态为就绪状态。②为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转...

    生产者与消费者 进程调度模拟(c++)

    如果申请的资源被阻塞则进入相应的等待队列,调度程序调度就绪队列中的下一个进程。进程运行结束时,会检查对应的等待队列,激活队列中的进程进入就绪队列。运行结束的进程进入over链表。重复这一过程直至就绪队列为...

    读者写者问题(linux)实现代码

    教材中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。

    操作系统——生产者与消费者

    利用Windows提供的API函数,编写程序,解决生产者与消费者问题,实现进程的互斥与同步。 背景知识 1. 本实验要求设计在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供...

    SqlServer中如何解决session阻塞问题

    对于数据库运维人员来说创建session或者查询时产生问题是常规情况,下面介绍一种很有效且不借助第三方工具的方式来解决类似问题。 最近开始接触运维工作,所以自己总结一些方案便于不懂数据库的同事解决一些不太紧要...

    华南理工大学操作系统实验:读者写者问题

    教材中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。

    操作系统课后+复习+实验

    答:1)就绪状态→执行状态:进程分配到CPU资源 2)执行状态→就绪状态:时间片用完 3)执行状态→阻塞状态:I/O请求 4)阻塞状态→就绪状态:I/O完成 2、文件的“打开”和“关闭”操作 “打开”是指系统将指名文件...

Global site tag (gtag.js) - Google Analytics