- 浏览: 87077 次
- 性别:
- 来自: 北京
最新评论
同事反映,删除一条数据总是没有反应,请求协助解决.
问题非常明显,肯定是有某个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 792DECLARE V_INTA NUMBER ... -
what is the difference between object_id and data_object_id?
2011-08-24 09:17 983The object_id is the primary k ... -
oracle EXECUTE IMMEDIATE ora-00911
2011-08-14 10:15 1550I get an error when I try to ex ... -
Will the valid status of index impact dml operation?
2011-08-05 10:34 882DROP TABLE tab01; SELECT * FRO ... -
where can i find the job number of those jobs defined in dba_scheduler_jobs?
2011-08-01 10:41 877Question: Hello, could anybody ... -
Listener HPUX Error: 242: No route to host
2011-05-17 14:55 1016现象: 引用LSNRCTL> status Conne ... -
open database with ORA-00704 and ORA-39700
2011-05-06 16:13 29461,Error 1)alter.log Fri May ... -
oracle text index create and use
2011-05-06 13:41 1958一、Install Text Index 1,The ste ... -
offline datafile and offline tablespace
2011-05-04 11:43 25541)offline datafile OFFLINE Spe ... -
oracle three type of block size
2011-04-28 17:35 796Tools: 引用[oracle@node oracle]$ ... -
bbed一(安装)
2011-04-26 14:54 1545bbed ----------------------- bl ... -
Strategies for RAC inter-instance parallelized queries
2011-04-25 14:14 1171I recently had to sit down and ... -
Enable Row Movement in Partitioning and Overhead
2011-04-24 14:03 1594Question 1: Hi, I am partitio ... -
Row Movement in Oracle
2011-04-23 22:23 2028One of the relatively newer fea ... -
ORA-14402 updating partition key column
2011-04-23 19:48 6440做DBA几年来,经常遇到项目到了维护期总是修改表的结构,原因很 ... -
ORACLE DSI 介绍
2011-04-19 18:33 927DSI是Data Server Internals的缩写,是O ... -
Oracle / Buffer cache
2011-04-19 17:18 818引用8.7 Tuning the Operating Syst ...
相关推荐
Stored Procedure sp_Kill_lockProcess 是一个用于解决 SQL Server 进程阻塞问题的存储过程。该存储过程可以杀死阻塞的进程,从而释放系统资源和提高系统性能。 在 sp_Kill_lockProcess 存储过程中,我们首先创建...
当一个进程获得互斥量后,其他试图获取该互斥量的进程会被阻塞,直到拥有互斥量的进程释放它。 5. **条件变量**:条件变量允许进程在满足特定条件时挂起执行,等待条件变为真时再恢复。在生产者-消费者问题中,生产...
"fgets 读取 popen 内容阻塞的问题解决方案" fgets 读取 popen 内容阻塞的问题是一个常见的 Linux 应用程序开发中遇到的问题。该问题的解决方案涉及到 Linux 操作系统中进程间通信、管道和文件指针的使用。 在 ...
生产者-消费者问题是计算机科学中的一个经典同步问题,主要探讨如何在多个进程中有效地共享有限的资源,以防止数据竞争和死锁的发生。在Linux操作系统环境下,这个问题通常通过信号量(semaphore)或管道(pipe)等...
- **互斥**:确保同一时间只有一个进程可以访问某个资源,从而避免了数据不一致等问题的发生。 #### 代码解读 给出的代码实现了一个简单的进程管理模型,其中包含了进程的创建、排序、打印和运行等功能。 - **...
经典进程同步问题之一就是“生产者-消费者”问题,这是一个多线程或多进程环境下常见的同步问题模型,用于演示如何避免数据竞争和死锁等问题。 生产者-消费者问题是这样设定的:有一个缓冲区(通常假设为有限大小)...
`V()`(Signal)操作会增加信号量的值,如果值为负,则会唤醒一个被阻塞的进程。 在Java中,我们可以通过`synchronized`关键字实现线程同步,这相当于创建了一个互斥锁。在`put()`和`get()`方法中,我们使用`...
生产者消费者问题是多进程处理中的一个经典模型,用于展示如何有效地共享有限资源。在Linux环境下,我们可以利用其强大的多进程支持来解决这个问题。 生产者消费者问题是这样的:有一个有限大小的缓冲区,生产者...
在操作系统中,进程是程序执行的实例,具有独立的资源和执行路径。进程管理是操作系统的核心功能之一...在实际应用中,还需要考虑更复杂的进程同步和通信机制,如信号量、管道、共享内存等,以解决并发执行带来的问题。
有vc++ 实现进程调用的功能 PA 进程把内容读进缓冲区一 PB进程复制缓冲区一内容到缓冲区二 pc进程打印缓冲区二中的内容
进程同步是解决多个进程间协作的关键技术。常见的进程同步机制包括: - **信号量机制**:通过信号量控制对临界资源的访问。 - **互斥锁**:确保同一时刻只有一个进程可以访问共享资源。 - **条件变量**:允许进程...
1。生产者消费者问题(信号量+mutex) 参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,...编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
信号量是操作系统中的一种机制,用于解决多个进程对共享资源的访问问题。信号量机制可以实现进程的互斥访问和同步。 三、 说明发生死锁的原因及避免死锁的方法。 死锁是指两个或多个进程互相等待对方释放资源,...
信号量是一种用于控制多个进程对共享资源访问的机制,可以用来解决进程间的互斥和同步问题。在这个问题中,我们可以使用两种类型的信号量:互斥信号量(Mutex Semaphore)和条件信号量(Binary Semaphore)。 1. **...
解决这一问题的关键在于将计算密集型任务移到单独的进程中执行,让主线程专注于处理用户界面事件。 1. **使用后台线程**:在多进程编程中,可以创建额外的线程来执行耗时任务,这样不会影响主线程。例如,在Python...
进程同步的读者写者问题是多线程编程中的一个经典问题,它主要涉及到多个读者和一个写者对共享资源的访问控制。在这个问题中,多个读者可以同时读取资源,但只有一个写者能写入资源,而且写者写入时不能有其他读者或...
本设计旨在通过对经典进程同步问题的研究,利用信号量和PV操作来解决读者/写者问题中的并发控制。其中,“读写平等”策略确保了所有请求都按照它们到达的顺序被处理,从而避免了优先级反转或饥饿等问题。 #### 二、...
在这个课程设计中,你将通过实践加深对操作系统内核的理解,掌握进程通信的基本原理,提升解决问题的能力。同时,这也是对C语言编程技巧和系统调用使用的良好锻炼。记得在实验过程中多思考、多尝试,将理论知识与...
通过这样的信息,我们可以分析系统性能,优化进程调度策略,甚至排查和解决问题。 在压缩包中的"操作系统"文件,可能包含了一些模拟或实验性的程序,用于演示上述的进程管理过程。这些工具对于学习和理解操作系统的...