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

教你快速掌握Oracle中"Kill"进程的方法 .

 
阅读更多

教你快速掌握Oracle中"Kill"进程的方法

 

原文:

http://blog.csdn.net/hhb200766/article/details/6695876

 

 

1:首先,我们需要在Oracle中找到锁住的对象:

 

select xidusn, object_id, session_id, locked_mode from v$locked_object;

 

 

2:得到session_id后,再根据session_id找到v$session对应的sid号和serial#:

 

select username,sid,serial# from v$session where sid=session_id;

 

 

3:用oracle的slq kill掉相关的session sql语句:

 

alter system kill session 'sid,serial#';

 

 

 

 

4:如果不能kill掉,报ora-00031错:说明之前有kill过,这样找到这个进程spid slq语句:

 

select pro.spid from v$session ses, v$process pro where ses.sid=129 and ses.paddr=pro.addr;

 

 

 

 

5:根据这个spid对应linux下的进程pid

linux命令:

 

ps -ef | grep     'ora' (找到所有ora开头的进程) kill -9 (pid)

 

 

下面主要介绍如果这个进程是Killed状态的时候该怎么处理:

 

首先介绍三个视图:v$process是ORACLE处理的进程,v$session是ORACLE处理的会话,v$sqlarea是Oracle处理的SQL语句存放区就是共享池那东西。三个表联合查一下。

 

SELECT P.pid,S.sid,s.serial#,P.spid,S.username,S.osuser, P.serial#,P.terminal,P.program,P.background,S.status, A.sql_text FROM v$process P, v$session S,v$sqlarea A WHERE P.addr = s.paddr AND S.sql_address = a.address (+) order by P.spid;

 

 

 

这里面查出来的就是Oracle实时正在处理的SQL语句过程等。当然还包含基本的(PMON)(DBW0)(LGWR)等后台进程。有时候大家在编译时,会发生怎么都编译不过去的现象,其实过程是好着的.这就是Oracle出现了死锁。死锁了肯定是锁最后一个会话,那就是你编译的那个.这时候大家有可以要重新SHUTDOWN IMMEDIATE才行解决问题.其实运行上面的语句再配合下面的就可以了。

在Oracle数据库中,可以通过kill session的方式来终止一个进程,alter system kill session 'sid,serial#' ;这里sid,serial#就是上面的v$session.sid,v$session.serial#这二值,多运行几次上面的SELECT语句就可以查出你被锁住的那个过程.其它不明的不能通杀了.这里关键就是要查出你要杀的v$session.sid,v$session.serial#二个值.然后做alter system kill session 'sid,serial#' ;做完以后.你的客户端一般就直接提示SESSION KILLED.但也有不提示没反映.再运行SELECT语句,发现v$session.status为KILLED.再等待还是一样.

从书上查知被kill掉的session,状态会被标记为killed,Oracle会在该用户下一次touch时清除该进程.Oracle就等待PMON去清除这些Session.通常等待一个被标记为Killed的Session退出需要花费很长的时间.但我从来都没等及过.这不又白杀了.没关系,用必杀招,在LINUX下杀.你用SELECT查出来的时候还有一个v$process.spid列.在LIUNX的$下运行TOP.[/img]你知发现了原来这一列的值,就是TOP下的PID值.那这样好办了.直接在LIUNX的$下 KILL -9 v$process.spid 这个值是要你在SELECT下要记录下的.好了.这就必杀了.过程编译不过去,肯定是有会话地运行.

 

 

 

SELECT P.pid,S.sid,s.serial#,P.spid,S.username,S.osuser, P.serial#,P.terminal,P.program,P.background,S.status,A.sql_text FROM v$process P, v$session S,v$sqlarea A WHERE P.addr = s.paddr AND S.sql_address = a.address (+) order by P.spid;和LIUNX的下的TOP你们会发现很多东西的. 比如说接口程序是很占CPU的还有查到实时会话.

 

 

ps和top都可以看系统中正在运行的进程

ps命令提供了当前运行进程的快照。

使用带有 -ef 选项的 ps ,返回系统中所有用户的所有进程的完整列表。如果您将此 ps 命令的结果传送到 grep 中,则该结果更易于查看。例如:

 

$ ps -ef | grep oracle

 

 

 

这条命令会显示:

 

UID PID PPID C STIME TTY TIME CMD oracle 1633 1 0 13:58 ?00:00:00 ora_pmon_ora1 oracle 1635 1 0 13:58 ?00:00:00 ora_dbw0_ora1 oracle 1637 1 0 13:58 ?00:00:01 ora_lgwr_ora1 oracle 1639 1 0 13:58 ?00:00:02 ora_ckpt_ora1

 

 

下面是ps的选项

-A:列出所有的进程。

-l:显示长列表。

-m:显示内存信息。

-w:显示加宽可以显示较多的信息。

-e:显示所有进程。

a:显示终端上的所有进程,包括其它用户的进程。

-au:显示较详细的信息。

-aux:显示所有包含其它使用者的进程。

注:如果需要即时查看最活跃的进程,可以使用"top" 。

先查看哪些表被锁住了:

select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;


 

 1.查哪个过程被锁:

  查V$DB_OBJECT_CACHE视图:

  SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND CLOCKS!='0';

  2. 查是哪一个SID,通过SID可知道是哪个SESSION:

  查V$ACCESS视图:

  SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';

  3. 查出SID和SERIAL#:

  查V$SESSION视图:

  SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID';

  查V$PROCESS视图:

  SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';

  4. 杀进程:

  (1)先杀ORACLE进程:

  ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';

  (2)再杀操作系统进程:

  KILL -9 刚才查出的SPID或ORAKILL 刚才查出的SID 刚才查出的SPID。

  Oracle的死锁

  查询数据库死锁:

select t2.username||' '||t2.sid||'
'||t2.serial#||' '||t2.logon_time||'
'||t3.sql_text
from v$locked_object t1,v$session t2,v$sqltext t3
where t1.session_id=t2.sid
and t2.sql_address=t3.address
order by t2.logon_time;

  查询出来的结果就是有死锁的session了,下面就是杀掉,拿到上面查询出来的SID和SERIAL#,填入到下面的语句中:

  alter system kill session 'sid,serial#';

一般情况可以解决数据库存在的死锁了,或通过session id 查到对应的操作系统进程,在Unix中杀掉操作系统的进程。

SELECT a.username,c.spid AS os_process_id,c.pid
AS oracle_process_id FROM v$session a,v$process c
WHERE c.addr=a.paddr and a.sid= and a.serial#= ;


  然后采用kill (unix) 或 orakill(windows )。

  在Unix中:

ps -ef|grep os_process_id
kill -9 os_process_id
ps -ef|grep os_process_id

  经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。

  1)查找死锁的进程:

sqlplus "/as sysdba" (sys/change_on_install)
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;

  2)kill掉这个死锁的进程:

  alter system kill session ‘sid,serial#’; (其中sid=l.session_id)

  3)如果还不能解决:

select pro.spid from v$session ses,
v$process pro where ses.sid=XX and
ses.paddr=pro.addr;

  其中sid用死锁的sid替换:

exit
ps -ef|grep spid

  其中spid是这个进程的进程号,kill掉这个Oracle进程。

 

 

 

 

 -----------------------------------------------------------------------------------------------------------------------

 
select v_s.machine,v_s.program,v_s.username,v_s.sid,v_s.serial# ,
pro.spid,t_o.object_name,t_o.object_type
,' kill -9 '||pro.spid
from v$session v_s,v$locked_object v_l,v$process pro,all_objects t_o where
1=1
and v_s.sid=v_l.session_id
and v_s.paddr=pro.addr
and v_s.sid=v_l.session_id
and t_o.object_id=v_l.object_id
;

 -----------------------------------------------------------------------------------------------------------------------

  

 

 

 

 

 

 

 

 

 

 

select v_s.username,v_s.sid,v_s.serial# ,pro.spid
from v$session v_s,v$locked_object v_l,v$process pro where
1=1
and v_s.sid=v_l.session_id
and v_s.paddr=pro.addr
and v_s.sid=v_l.session_id;

分享到:
评论

相关推荐

    Oracle Golden Gate图文并茂快速掌握

    Manager进程是Golden Gate的全局主进程,负责启动、监控、终止其它进程,收集错误报告和事件,并进行其他管理任务。Extract进程负责从源端捕获交易数据,可以捕获并直接传递数据,或捕获后写入trail文件再传递。Pump...

    oracle kill session

    **Oracle Kill Session**是指在Oracle数据库中终止某个或某些会话(session)的操作。这项操作通常由DBA(数据库管理员)执行,用于解决因长时间运行的查询、锁定资源等问题导致的应用程序或系统性能下降的情况。通过...

    Oracle入门知识综合概述.pptx

    在Oracle数据库中,会话是用户与服务器之间的一个连接,始于用户登录并终止于用户退出。通过调整Oracle实例的内存结构(如增大或减小SGA和PGA的大小)和优化后台进程,可以显著影响数据库的性能和响应时间。 了解并...

    讲解Oracle数据库中结束死锁进程的一般方法

    了解和掌握这些方法,有助于在面对Oracle数据库死锁问题时,快速定位并解决,确保数据库的正常运行。在实际操作中,应结合具体的应用场景和业务需求,灵活运用这些策略,以最大程度地预防和减少死锁的发生。

    Oracle启动管理命令

    在日常运维过程中,了解和掌握Oracle的启动和管理命令是非常重要的。本篇将详细讲解Oracle数据库的启动与关闭方法,以及相关的管理知识。 1. **Oracle启动过程** Oracle数据库的启动通常分为三个阶段:装载(Mount...

    ORACLE解锁方法的一点资料

    最常用的方法是通过`ALTER SYSTEM KILL SESSION`命令强制终止锁定的会话: ```sql ALTER SYSTEM KILL SESSION 'SID, SERIAL#'; ``` 其中`SID`和`SERIAL#`是锁定会话的会话ID和序列号。需要注意的是,在执行此类...

    oracle锁表及解锁

    理解并熟练掌握Oracle数据库中的锁机制对于数据库管理员来说至关重要。它不仅能帮助解决并发控制问题,还能提高数据库的整体性能。当遇到由于长时间运行的事务导致的锁等待时,能够快速识别并解锁相关会话,对于保持...

    15-快速学习《Oracle入门》.pptx

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其在企业级应用中占据着重要的地位。本文将深入探讨Oracle入门的一些核心知识点,包括Oracle体系结构、启动和关闭数据库、管理和开发工具,以及表的管理维护...

    Oracle试题、答案

    Oracle数据库是全球广泛使用的数据库管理系统之一,其复杂性和深度使得学习和掌握Oracle知识成为IT专业人士的重要任务。本题集旨在帮助学生和专业人士巩固Oracle的基础知识,特别是物理和逻辑存储结构,后台进程,...

    oracle_dba的unix袖珍参考手册.pdf

    例如,书中给出的一个示例命令 `ps -ef | grep "ora_" | grep -v grep | awk '{print $2}' | xargs kill -9` 就是用来杀死所有 Oracle 进程的一个复合命令。 - **ps -ef**:列出系统上所有进程的信息。 - **grep ...

    浅谈Oracle数据库备份与恢复策略.pdf

    从上面的讨论中,我们可以看到,一个有效的Oracle数据库备份与恢复策略需要综合考虑多种因素,包括不同类型的备份模式、备份策略以及物理备份的方法。合理的备份策略应该结合组织的数据重要性、备份成本和时间等因素...

    Oracle DBA常用的UNIX命令

    Oracle DBA在日常工作中经常会与UNIX/Linux操作系统打交道,掌握一些常用的UNIX命令对于高效管理Oracle数据库至关重要。以下是一些Oracle DBA在UNIX环境下常用的命令及其详细解释: 1. **删除Oracle进程**: - `ps...

    DSI401-ORACLE内部培训内容

    3. **Core Dump**: 当某个Oracle进程异常终止时,系统会自动创建一个包含该进程内存状态的文件,即为核心转储文件。通过对核心转储文件的分析,可以定位导致进程崩溃的原因。 4. **Backup Dump**: 数据库备份过程中...

    Oracle数据库管理维护培训

    ### Oracle数据库管理维护培训知识点详述 ...通过以上详尽的内容,我们可以看到Oracle数据库管理维护培训涵盖了从基础知识到高级技巧的广泛领域,旨在帮助管理员掌握Oracle数据库的全面管理能力。

    大数据技术分享 oracle dba的unix袖珍参考手册 共33页.pdf

    该手册共分为13个章节,涵盖了Unix环境下Oracle数据库管理和运维的关键知识点,旨在帮助DBA快速掌握Unix系统下的Oracle数据库管理技巧。 #### 二、构建Unix命令 在Unix系统中,熟练地构建和使用命令是非常重要的...

    Oracle锁表问题的简捷处理技巧

    然而,在实际应用中,不当的锁管理可能会导致性能下降甚至系统停滞,因此理解和掌握Oracle锁的相关概念及其处理技巧至关重要。 #### Oracle锁类型及含义 Oracle提供了多种类型的锁来满足不同场景的需求: 1. **...

    oracle锁表查询

    - 如果确定某个会话是问题所在,可以直接使用查询结果中返回的`alter system kill session`命令来终止该会话,从而解除锁定。 #### 四、常见问题及解决方法 1. **如何判断是否需要杀死某个会话?** - 在决定杀死...

    较实用的ORACLE数据库死锁查杀

    因此,掌握如何检测和解决Oracle中的死锁是非常重要的技能。 #### 二、死锁产生的原因及影响 **1. 死锁产生的原因:** - **资源竞争:** 当多个事务对同一资源进行加锁操作且按不同的顺序请求资源时,容易导致...

    Oracle 入门级DBA必备

    - 文件和系统信息命令:ls列出文件、date显示日期、who查看登录用户、ps查看系统进程、kill终止进程。 - 查找命令:find用于查找文件、grep用于查找指定字符。 2. vi编辑器使用 - vi简介:一个文本编辑器,用于...

Global site tag (gtag.js) - Google Analytics