用OraKill结束失控的Oracle进程

用OraKill结束失控的Oracle进程

一个用户进程偶尔会挂起或占用过多资源而拒绝其它会话。如果 DBA 依然能够访问数据库,她通常可以发出以下查询:

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;

这个查询将返回数据库用户名、操作系统用户名、会话 ID,序列号和系统进程 ID(SPID)。然后,DBA 用户就可以发出以下命令(前面的查询返回的使用 SID 和SERIAL# 信息):

ALTER SYSTEM KILL SESSION 'sid,serial#';

ALTER SYSTEM KILL SESSION '9,203';

使用这条语句有两个问题。第一,分配给这个进程的任何锁或资源在会话完全超时之前不会被释放。第二,查询和 kill 命令需要能够访问数据库。如果一个进行失去控制,那么数据库访问可能会出现问题。

在一个 UNIX 数据库中,下一步是 ps 命令输出的 UNIX 提示中定位进程(同样是查找 OSUSER 和 SPID 等 ID)然后使用 kill -9 spid 结束失控的后台进程。然而,在 Windows 中,只有一个进程 ORACLE.EXE,而且用户连接是在 Windows 线程中处理的,而不在进程中处理的。如果使用 Windows 任务管理器结束 Oracle 线程,就有可能影响所有用户和后台线程,并导致数据库崩溃。

出于这些原因,Oracle 在Oracle Home/bin 目录下提供了一个 orakill.exe 命令,这个命令的参数与ALTER SYSTEM KILL SESSION 相同,但是不要求数据库连接。要定位一个特定的线程,需要寻找一个能够显示属于一个进程的所有线程的程序。Windows 任务管理器只能显示线程数和进程。你需要从微软的资源工具包中寻找一个用于 Windows 2000 和 NT 的工具程序,比如免费的QuickSlice,或者Qslice.exe(该工具是基于 Windows 的),或者PStat(Pstat.exe 是一个命令行工具)。简单地在 orakill 命令后输入线程 ID(以十进制表示)和 SID 即可:

orakill

orakill ORCL 2760

"Kill of thread id 2760 in instance ORCL successfully signalled[sic]."

应该只有在不能访问数据库来执行ALTER SYSTEM KILL SESSION 的情况才使用orakill。如果意外结束了一个必要的后台进程,比如 PMON,那么很可能会导致数据库崩溃。新手永远不要这样做。
<think>嗯,用户的问题是关于Oracle数据库在杀掉会话后回滚一直没结束,如何强制结束。首先,我需要回忆一下Oracle的相关知识。当用户执行了ALTER SYSTEM KILL SESSION命令后,会话可能被标记为killed,但后台进程如PMON可能需要时间清理。如果回滚长时间未完成,可能是因为事务太大或者系统资源不足。 接下来,用户想知道如何强制结束。我记得有几个方法,比如使用orakill工具,这适用于Windows环境,可以终止对应的线程。在Unix/Linux下,可能需要使用kill命令直接终止进程。但要注意,强制终止可能导致数据库状态不一致,需要谨慎操作。 另外,Oracle的隐含参数可能也有用,比如调整_enable_forced_rollback参数,或者使用ALTER SYSTEM DISCONNECT SESSION命令,加上IMMEDIATE和POST_TRANSACTION选项,但不确定是否有效。 还需要考虑检查等待事件,比如查看V$SESSION_WAIT,确认回滚是否真的在等待资源或存在阻塞。此外,检查UNDO段的使用情况,可能需要增加UNDO表空间的大小或调整UNDO_RETENTION参数。 用户可能已经尝试过常规方法,但问题依然存在,所以需要提供更深入的解决方案。比如,在紧急情况下重启数据库实例,或者联系Oracle支持使用诊断工具。同时,提醒用户操作前的备份和风险评估的重要性。 最后,要组织这些思路,分点说明方法,强调风险和注意事项,确保用户理解可能的后果和正确操作步骤。</think>在 Oracle 数据库中,当你使用 `ALTER SYSTEM KILL SESSION` 终止会话后,如果回滚(Rollback)操作长时间未完成,可能是由于事务过大、UNDO 表空间不足或系统资源争用等原因。以下是强制终止和排查的几种方法及注意事项: --- ### **1. 强制终止会话的进阶方法** #### **a. 使用 `ORAKILL` 工具(Windows 环境)** - 通过 `v$process` 和 `v$session` 查找会话对应的 **SPID**(操作系统进程ID): ```sql SELECT s.sid, s.serial#, p.spid, s.username FROM v$session s, v$process p WHERE s.paddr = p.addr AND s.sid = <被终止的SID>; ``` - 在命令行执行: ```bash orakill <ORACLE_SID> <SPID> ``` - **风险**:直接终止操作系统进程可能导致数据库短暂不稳定。 #### **b. 使用 `kill -9`(Unix/Linux)** - 找到 SPID 后直接终止: ```bash kill -9 <SPID> ``` - **注意**:需确认会话状态为 `KILLED` 且无响应。 #### **c. 强制回滚参数调整** - **隐含参数 `_force_rollback_segment`**(需谨慎): ```sql ALTER SYSTEM SET "_force_rollback_segment" = <UNDO段名称> SCOPE=MEMORY; ``` - **调整 `_enable_forced_rollback`**(Oracle 11g+): ```sql ALTER SYSTEM SET "_enable_forced_rollback" = TRUE SCOPE=MEMORY; ``` - **警告**:隐含参数可能影响稳定性,需 Oracle Support 指导。 --- ### **2. 监控与优化回滚进度** #### **a. 查看回滚状态** ```sql SELECT usn, state, undoblockstotal "总块数", undoblocksdone "已处理块数", undoblockstotal - undoblocksdone "剩余块数" FROM v$fast_start_transactions; ``` - 剩余块数多或长时间不变,表明回滚缓慢。 #### **b. 检查等待事件** ```sql SELECT sid, event, seconds_in_wait, state FROM v$session WHERE sid = <被终止的SID>; ``` - 常见等待事件:`wait for a undo record`, `enq: US - contention`。 #### **c. UNDO 表空间优化** - 扩展 UNDO 表空间: ```sql ALTER DATABASE DATAFILE '<undo_file_path>' RESIZE 10G; ``` - 增加 UNDO 保留时间(`UNDO_RETENTION`)或使用 Guaranteed UNDO: ```sql ALTER TABLESPACE undo_tbs RETENTION GUARANTEE; ``` --- ### **3. 终极方法:重启数据库实例** - 若回滚完全卡死且无法终止,可尝试分步操作: 1. 停止应用连接。 2. 执行 `SHUTDOWN ABORT` 强制关闭。 3. 重新启动数据库(`STARTUP`)。 - **代价**:所有未提交事务丢失,需从备份恢复。 --- ### **4. 预防与最佳实践** 1. **分批次提交大事务**:避免单个事务修改过多数据。 2. **监控长事务**: ```sql SELECT s.sid, s.serial#, t.start_time, t.used_ublk "UNDO块数" FROM v$transaction t, v$session s WHERE t.addr = s.taddr; ``` 3. **设置资源限制**:通过 `RESOURCE_MANAGER_PLAN` 限制 UNDO 使用。 --- ### **关键注意事项** - **数据一致性风险**:强制终止可能导致部分数据处于中间状态。 - **备份优先**:操作前确保有有效备份(如 RMAN)。 - **Oracle Support**:生产环境严重问题建议联系 Oracle 技术支持。 根据实际场景选择方法,优先尝试监控和优化资源,紧急情况下再使用强制手段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值