oracle数据库进程不释放,核心数据库网络中断之后,清理不释放资源的session

本文描述了一次在核心数据库经历网络中断后,会话数量异常增高的情况,以及如何定位并解决不释放资源的session问题。通过查询和分析v$session、v$process等视图,找出被杀死但资源未释放的会话,并通过kill命令真正释放了资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天机房搞网络灾备切换演练,核心数据库在网络中断恢复之后,session数量突然增高,一般数据库的sessoin在475左右,突然接近600个会话,

因为网络中断之后,会话没有及时释放资源,

导致会话数量居高不下,下面是解决过程:

(注:因为昨天在处理的的时候,来不及整理现场操作的资料,现在虚拟机上实验证明一下,思路是一样的)

1.测试用户xiangyang,开启4个会话连接数据库(真实环境一般是用JDBC_Thin_Client程序连接数据库):

D:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 9.2.0.8.0 - Production on 星期日 3月 13 21:35:31 2011

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

SQL> conn xiangyang/xiangyang

已连接。

SQL>

D:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 9.2.0.8.0 - Production on 星期日 3月 13 21:35:31 2011

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

SQL> conn xiangyang/xiangyang

已连接。

SQL>

D:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 9.2.0.8.0 - Production on 星期日 3月 13 21:35:31 2011

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

SQL> conn xiangyang/xiangyang

已连接。

SQL>

D:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 9.2.0.8.0 - Production on 星期日 3月 13 21:35:31 2011

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

SQL> conn xiangyang/xiangyang

已连接。

SQL>

2.查看该用户在数据库的连接数量:

select username,program,terminal,machine,count(1) from v$session where username='XIANGYANG'

group by username,program,terminal,machine order by 5 desc

USERNAME

PROGRAM

TERMINAL

MACHINE

COUNT(1)

XIANGYANG

sqlplus.exe

SUN-001

WORKGROUP\SUN-001

4

用户名为xiangyang连在数据库的会话数量是4个.

3.查看xiangyang用户的会话数量的详细信息:

select b.*, 'alter system kill session' || '''' || b.sid || ',' || b.SERIAL# || '''' || ';'

from v$session b

where b.type not like 'BACKGROUND'

and b.username='XIANGYANG'

SID SERIAL#  PADDR  USERNAME  STATUS    OSUSER PROCESS MACHINE TERMINAL PROGRAM TYPE

19 78  2A243054  XIANGYANG  INACTIVE SUN-001\Administrator  WORKGROUP\SUN-001 SUN-001 sqlplus.exe   2011-3-13 21:35 891  alter system kill session'19,78';

20 38  2A24343C  XIANGYANG  INACTIVE SUN-001\Administrator  WORKGROUP\SUN-001 SUN-001 sqlplus.exe   2011-3-13 21:35 873  alter system kill session'20,38';

21 30  2A243824  XIANGYANG  INACTIVE SUN-001\Administrator  WORKGROUP\SUN-001 SUN-001 sqlplus.exe   2011-3-13 21:36 858  alter system kill session'21,30';

23 35  2A243FF4  XIANGYANG  INACTIVE SUN-001\Administrator  WORKGROUP\SUN-001 SUN-001 sqlplus.exe   2011-3-13 21:36 837  alter system kill session'23,35';

由于会话数量过多,kill掉会话:

alter system kill session'19,78';

alter system kill session'20,38';

alter system kill session'21,30';

alter system kill session'23,35';

4.查看会话状态:

select sid,serial#,paddr,username,status from v$session where status='KILLED';

SID SERIAL# PADDR USERNAME STATUS

19 78 2A263E30 XIANGYANG KILLED

20 38 2A263E30 XIANGYANG KILLED

21 30 2A263E30 XIANGYANG KILLED

23 35 2A263E30 XIANGYANG KILLED

5.但是会话所占用的资源并没有释放,也就是还独占了连接数:

select username,program,terminal,machine,count(1) from v$session where username='XIANGYANG'

group by username,program,terminal,machine order by 5 desc

USERNAME

PROGRAM

TERMINAL

MACHINE

COUNT(1)

XIANGYANG

sqlplus.exe

SUN-001

WORKGROUP\SUN-001

4

用户XIANGYANG持有的会话数仍然是4个,资源并没有释放.

需要kill掉会话所在的操作

系统进程,使用下面的SQL找出会话的进程:

select spid from v$process where addr in(select paddr from v$session where status='KILLED');

SPID

-------

没有任何显示,说明状态为KILL的会话的进程找不到了,通过v$process.addr=v$session

.paddr的方式.什么原因?

6.查看一下原因:

先看视图v$session

select s.username,s.sid,s.serial#,s.paddr from v$session s where username='XIANGYANG' and s.status='KILLED';

USERNAME

SID

SERIAL#

PADDR

XIANGYANG

19

78

2A263E30

XIANGYANG

20

38

2A263E30

XIANGYANG

21

30

2A263E30

XIANGYANG

23

35

2A263E30

v$session.paddr为2A263E30,状态为KILLED的,用户名为XIANGYANG的4个会话的进程地址为同样的

PADDR:2A263E30,说明是同时指向了另一个地址,也许是虚拟地址,现在没有考证.但是可以证明一点就是

4个session的进程地址通过v$session.paddr的方式找不到了.

再看视图v$process记录的会话进程地址:

select p.addr from v$process p where pid <> 1

ADDR

2A23F9A4

2A23FD8C

2A240174

2A24055C

2A240944

2A240D2C

2A241114

2A2414FC

2A2418E4

2A241CCC

2A2420B4

2A24249C

2A242884

2A242C6C

2A243054

2A24343C

2A243824

2A243C0C

2A243FF4

2A2443DC

20 rows selected

这20个会话的进程地址中间肯定有状态为KILLED会话的进程地址

可以通过一条SQL,把状态为KILLED的会话进程找出来,这里要使用minus这个SQL连接符号.

select p.addr from v$process p where pid <> 1

minus

select s.paddr from v$session s;

ADDR

2A243054

2A24343C

2A243824

2A243FF4

以上这4个进程地址就是状态为KILLED会话的进程地址.

通过minus把v$process拥有的addr,但是v$session没有的paddr找出来了.因为在v$session的paddr

有4个相同的paddr,其实就是替换了上面4个真实的进程地址.

7.现在就可以kill掉状态为KILLED的会话的进程,真正的释放资源了.

通过下面的脚本找出状态为KILLED会话的spid:

select 'kill -9 ' || spid||';',addr

from v$process

where --addr in (select paddr from v$session where username='XIANGYANG');

addr in (select p.addr

from v$process p

where pid <> 1

minus

select s.paddr from v$session s);

UNIX/LINUX系统:

killed        ADDR

kill -9 4960; 2A243054

kill -9 3732; 2A24343C

kill -9 5036; 2A243824

kill -9 4952; 2A243FF4

kill -9 4952; 2A243FF4

windows系统:

orakill 实例sid spid

orakill westdb 4960

D:\Documents and Settings\Administrator>orakill westdb 4960

Kill of thread id 4960 in instance westdb successfully signalled.

D:\Documents and Settings\Administrator>orakill westdb 3732

Kill of thread id 3732 in instance westdb successfully signalled.

D:\Documents and Settings\Administrator>orakill westdb 5036

Kill of thread id 5036 in instance westdb successfully signalled.

D:\Documents and Settings\Administrator>orakill westdb 4952

Kill of thread id 4952 in instance westdb successfully signalled.

9.资源得到释放,问题得到解决.

select username,program,terminal,machine,count(1) from v$session where username='XIANGYANG'

group by username,program,terminal,machine order by 5 desc

USERNAME

PROGRAM

TERMINAL

MACHINE

COUNT(1)

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

没有任何显示,说明资源已经释放,

至此问题解决.

<think>嗯,用户问的是达梦数据库如何强行中断连接操作。首先,我需要回忆一下达梦数据库的相关管理命令,尤其是关于会话管理的部分。达梦数据库是基于Oracle的语法,所以可能有类似ALTER SYSTEM KILL SESSION的命令。过具体命令可能有所同,需要确认。 然后,用户可能需要知道同的中断方式,比如通过SQL命令或者系统过程。记得达梦有系统过程SP_CLOSE_SESSION,应该可以用于关闭会话。另外,还需要考虑通过管理工具操作,比如管理工具图形界面或者命令行工具disql。 接下来要考虑步骤的详细说明,比如如何查找会话ID,然后使用对应的命令终止。可能需要查询V$SESSIONS视图来获取活动会话的信息,比如SESS_ID、SQL_TEXT等字段。用户可能需要具体的SQL例子,比如SELECT * FROM V$SESSIONS;,然后使用SP_CLOSE_SESSION(sess_id)来关闭。 还要注意权限问题,执行这些操作需要DBA权限,否则可能会失败。同时,强行中断可能导致事务回滚和数据一致性问题,需要提醒用户谨慎操作,并确认是否可以中断目标会话。 另外,用户可能遇到无法正常关闭的情况,比如锁等待或者长时间事务,这时候强行中断是最后手段。需要说明可能的影响,比如未提交的事务回滚,可能影响其他用户或应用。 可能还需要补充其他方法,比如在Linux系统中使用kill命令终止进程,但需要先找到对应的线程ID,这可能通过查询V$PROCESSES视图获得。但这种方法比较底层,风险更高,需谨慎。 最后,总结注意事项,比如权限、影响和备份,确保用户了解操作的风险和正确步骤。结构要清晰,分步骤说明,同时给出示例,让用户能一步步跟着操作。</think>达梦数据库强行中断连接操作可通过以下步骤实现: ### 一、操作原理 达梦数据库通过会话(Session)管理客户端连接,强行中断即主动终止指定会话。此操作常用于处理异常连接、死锁或资源释放场景。 ### 二、操作步骤 #### 1. 查询活动会话 ```sql SELECT sess_id, sql_text, state, create_time, clnt_ip FROM V$SESSIONS WHERE state = 'ACTIVE'; ``` 结果字段说明: - `sess_id`:会话唯一标识 - `sql_text`:正在执行的SQL语句 - `clnt_ip`:客户端IP地址 #### 2. 终止指定会话 ```sql SP_CLOSE_SESSION(sess_id); -- 替换sess_id为实际值 ``` 或使用系统命令: ```sql ALTER SYSTEM KILL SESSION 'sess_id'; ``` #### 3. 强制终止进程(Linux系统) ```sql SELECT thrd_id FROM V$PROCESSES WHERE sess_id = '目标sess_id'; ``` 获取线程ID后执行: ```bash kill -9 <thrd_id> -- 需在数据库服务器执行 ``` ### 三、注意事项 1. **权限要求** - 需要`DBA`角色或`ALTER DATABASE`权限 - 普通用户无法操作`V$`开头的系统视图 2. **风险控制** - 立即中断可能导致事务未提交(触发自动回滚) - 高频操作可能影响实例稳定性 - 建议先执行`SP_CLOSE_SESSION`尝试正常关闭 3. **补充方案** ```sql SP_SESSION_ROLLBACK(sess_id); -- 先回滚事务再关闭 ``` ### 四、验证操作 执行后再次查询会话: ```sql SELECT * FROM V$SESSIONS WHERE sess_id = '目标ID'; ``` 若无结果返回则表示终止成功。 ### 五、应用场景建议 - 死锁检测超时(`DLOCK_TIME`参数触发前) - 批量作业异常占用资源 - 数据库维护窗口期连接清理 建议结合`V$LOCK`视图分析锁冲突情况后再决定是否强制终止。生产环境操作前建议做好事务日志备份。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值