`
MicroJoey
  • 浏览: 87068 次
  • 性别: 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进程阻塞的检查和解决办法

    Stored Procedure sp_Kill_lockProcess 是一个用于解决 SQL Server 进程阻塞问题的存储过程。该存储过程可以杀死阻塞的进程,从而释放系统资源和提高系统性能。 在 sp_Kill_lockProcess 存储过程中,我们首先创建...

    用多进程同步方法解决生产者-消费者问题

    当一个进程获得互斥量后,其他试图获取该互斥量的进程会被阻塞,直到拥有互斥量的进程释放它。 5. **条件变量**:条件变量允许进程在满足特定条件时挂起执行,等待条件变为真时再恢复。在生产者-消费者问题中,生产...

    如何解决fgets读取popen内容阻塞的问题

    "fgets 读取 popen 内容阻塞的问题解决方案" fgets 读取 popen 内容阻塞的问题是一个常见的 Linux 应用程序开发中遇到的问题。该问题的解决方案涉及到 Linux 操作系统中进程间通信、管道和文件指针的使用。 在 ...

    linux下用多进程同步方法解决生产者-消费者问题源代码

    生产者-消费者问题是计算机科学中的一个经典同步问题,主要探讨如何在多个进程中有效地共享有限的资源,以防止数据竞争和死锁的发生。在Linux操作系统环境下,这个问题通常通过信号量(semaphore)或管道(pipe)等...

    进程 创建 撤销 控制

    - **互斥**:确保同一时间只有一个进程可以访问某个资源,从而避免了数据不一致等问题的发生。 #### 代码解读 给出的代码实现了一个简单的进程管理模型,其中包含了进程的创建、排序、打印和运行等功能。 - **...

    经典进程同步问题-生产者与消费者

    经典进程同步问题之一就是“生产者-消费者”问题,这是一个多线程或多进程环境下常见的同步问题模型,用于演示如何避免数据竞争和死锁等问题。 生产者-消费者问题是这样设定的:有一个缓冲区(通常假设为有限大小)...

    进程同步实验报告

    `V()`(Signal)操作会增加信号量的值,如果值为负,则会唤醒一个被阻塞的进程。 在Java中,我们可以通过`synchronized`关键字实现线程同步,这相当于创建了一个互斥锁。在`put()`和`get()`方法中,我们使用`...

    多进程处理生产者消费者问题

    生产者消费者问题是多进程处理中的一个经典模型,用于展示如何有效地共享有限资源。在Linux环境下,我们可以利用其强大的多进程支持来解决这个问题。 生产者消费者问题是这样的:有一个有限大小的缓冲区,生产者...

    进程管理和控制

    在操作系统中,进程是程序执行的实例,具有独立的资源和执行路径。进程管理是操作系统的核心功能之一...在实际应用中,还需要考虑更复杂的进程同步和通信机制,如信号量、管道、共享内存等,以解决并发执行带来的问题。

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

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

    操作系统的进程同步问题 C++代码

    进程同步是解决多个进程间协作的关键技术。常见的进程同步机制包括: - **信号量机制**:通过信号量控制对临界资源的访问。 - **互斥锁**:确保同一时刻只有一个进程可以访问共享资源。 - **条件变量**:允许进程...

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

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

    操作系统中进程相关题目

    信号量是操作系统中的一种机制,用于解决多个进程对共享资源的访问问题。信号量机制可以实现进程的互斥访问和同步。 三、 说明发生死锁的原因及避免死锁的方法。 死锁是指两个或多个进程互相等待对方释放资源,...

    操作系统课件中生产者-消费者进程同步问题的程序

    信号量是一种用于控制多个进程对共享资源访问的机制,可以用来解决进程间的互斥和同步问题。在这个问题中,我们可以使用两种类型的信号量:互斥信号量(Mutex Semaphore)和条件信号量(Binary Semaphore)。 1. **...

    多进程编程卡死解决方案

    解决这一问题的关键在于将计算密集型任务移到单独的进程中执行,让主线程专注于处理用户界面事件。 1. **使用后台线程**:在多进程编程中,可以创建额外的线程来执行耗时任务,这样不会影响主线程。例如,在Python...

    进程同步读者写者问题

    进程同步的读者写者问题是多线程编程中的一个经典问题,它主要涉及到多个读者和一个写者对共享资源的访问控制。在这个问题中,多个读者可以同时读取资源,但只有一个写者能写入资源,而且写者写入时不能有其他读者或...

    通过研究经典的进程同步问题,采用“读写平等”的策略,用信号量 和 PV 操作实现对读者/写者问题的并发控制

    本设计旨在通过对经典进程同步问题的研究,利用信号量和PV操作来解决读者/写者问题中的并发控制。其中,“读写平等”策略确保了所有请求都按照它们到达的顺序被处理,从而避免了优先级反转或饥饿等问题。 #### 二、...

    进程的管道通信实验 操作系统 课程设计

    在这个课程设计中,你将通过实践加深对操作系统内核的理解,掌握进程通信的基本原理,提升解决问题的能力。同时,这也是对C语言编程技巧和系统调用使用的良好锻炼。记得在实验过程中多思考、多尝试,将理论知识与...

    操作系统进程管理演示

    通过这样的信息,我们可以分析系统性能,优化进程调度策略,甚至排查和解决问题。 在压缩包中的"操作系统"文件,可能包含了一些模拟或实验性的程序,用于演示上述的进程管理过程。这些工具对于学习和理解操作系统的...

Global site tag (gtag.js) - Google Analytics