Oracle的KILL锁表及清除session方法

一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。但是shutdown immediate又怕可能进程杀不掉会一直停留在shutdown immediate,直接shutdown abort又怕损坏数据库。
现在提供一种方法解决这种问题,那就是在ORACLE中杀不掉的,在OS一级再杀。
一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。但是shutdown immediate又怕可能进程杀不掉会一直停留在shutdown immediate,直接shutdown abort又怕损坏数据库。
现在提供一种方法解决这种问题,那就是在ORACLE中杀不掉的,在OS一级再杀。
1.下面的语句用来查询哪些对象被锁:
SELECT S.USERNAME,S.OSUSER,S.SID,S.SERIAL#,P.SPID FROM V$SESSION S,V$PROCESS
P WHERE S.PADDR=P.ADDR AND S.USERNAME IS NOT NULL;
2.下面的语句用来杀死一个进程:
alter system kill session 'sid,serial#';
【注】以上两步,可以通过Oracle的管理控制台来执行。
如果出现题目的错误,可以
select a.spid,b.sid,b.serial#,b.username from v$process a,v$session b where a.addr=b.paddr and b.status='KILLED' ;
3.如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号:
select spid, osuser, s.program from v$session s,v$process p where
s.paddr=p.addr and s.sid=33 (33就是上面的sid)
4.在OS上杀死这个进程(线程):
1)在unix上,用root身份执行命令:
#kill -9 12345(即第3步查询出的spid)
2)在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:
orakill sid thread
其中:
sid:表示要杀死的进程属于的实例名
thread:是要杀掉的线程号,即第3步查询出的spid。
例:c:>orakill orcl 12345
Ps:这里要注意的是kill OS进程是在服务端操作,而不是你程序所在客户机。

<think>嗯,用户想了解Oracle的相关内容。首先,我需要确认用户所说的“”具体指的是什么。在Oracle数据库中,通常发生在多个会话同时访问同一资源时,比如一个会话正在执行DML操作(如UPDATE、DELETE),而另一个会话试图修改同一数据或执行DDL操作,这时候可能会发生冲突。 接下来,我应该分步骤解释如何识别和处理。首先,用户需要确定哪个会话持有,哪个会话在等待。这可以通过查询数据字典视图如DBA_BLOCKERS、DBA_WAITERS,或者使用v$session和v$lock视图来实现。可能还需要提到DBA_DDL_LOCKS之类的视图,但需要确保准确性。 然后,处理方法通常包括提交或回滚持有的会话,或者强制终止会话。需要详细说明如何找到相关的SID和SERIAL#,以及使用ALTER SYSTEM KILL SESSION命令。同时,要提醒用户谨慎使用强制终止,因为这可能导致数据不一致或其他问题。 另外,用户可能还关心如何预防的问题,比如优化事务设计,减少持有时间,使用适当的隔离级别等。这部分内容对用户来说也很重要,可以帮助他们避免未来出现类似问题。 需要注意的是,用户可能对某些术语不太熟悉,比如会话、SID、SERIAL#等,可能需要用更易懂的语言解释。同时,示例代码的正确性很重要,比如查询语句是否正确,命令是否有语法错误。需要确保提供的SQL命令在Oracle环境中有效,比如连接正确的视图和列名。 还要考虑用户的使用场景,可能是开发人员或DBA,所以需要提供不同层面的解决方案。如果是开发人员,可能需要指导他们检查应用程序中的事务逻辑;如果是DBA,可能需要更直接的解步骤。 最后,要确保整个回答结构清晰,步骤明确,用户能够按照指引逐步解决问题。同时,提醒用户在生产环境中谨慎操作,尤其是在终止会话时,避免影响其他正在进行的操作。</think>### Oracle操作指南 #### 一、定的常见场景 当发生以下情况时可能触发: - 长时间未提交的DML操作(UPDATE/DELETE) - 并行会话尝试修改相同数据 - DDL操作(ALTER TABLE)与DML操作冲突 - 事务异常中断未释放 #### 二、定检测步骤 1. **查询信息** ```sql SELECT s.sid, s.serial#, s.username, s.machine, l.type lock_type, o.object_name FROM v$locked_object lo JOIN dba_objects o ON lo.object_id = o.object_id JOIN v$session s ON lo.session_id = s.sid WHERE o.object_name = '你的名'; ``` 2. **查看阻塞关系** ```sql SELECT blocker.sid blocker_sid, waiter.sid waiter_sid, blocker.sql_id blocker_sql FROM v$session blocker, v$session waiter WHERE waiter.blocking_session = blocker.sid; ``` #### 三、解解决方案 1. **正常释放** ```sql -- 提交事务(由持有的会话执行) COMMIT; -- 回滚事务(由持有的会话执行) ROLLBACK; ``` 2. **强制解(需DBA权限)** ```sql -- 终止会话(替换实际查到的sid和serial#) ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE; -- 强制断开连接(Oracle 12c+) ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION; ``` 3. **系统级清除(极端情况)** ```sql -- 重启数据库(需停机) SHUTDOWN IMMEDIATE; STARTUP; ``` #### 四、预防措施 1. **事务优化** - 保持事务短小精悍 - 避免在事务中执行长时间操作 - 使用`SELECT ... FOR UPDATE NOWAIT` 2. **监控配置** ```sql -- 设置超时(单位:秒) ALTER SYSTEM SET ddl_lock_timeout = 30; ``` 3. **开发规范** - DDL操作前检查使用状态 - 使用`DBMS_LOCK`包管理自定义 - 定期分析`AWR`报告中的事件 #### 五、注意事项 1. 强制kill会话可能导致: - 未提交事务回滚 - 临时对象泄漏 - 应用程序连接异常 2. 建议优先联系持有的用户协商解决 3. 对关键业务操作建议在维护窗口进行 > 建议结合`ASH`(Active Session History)和`ADDM`(Automatic Database Diagnostic Monitor)进行深度分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值