ORACLE利用事务和封锁机制提供数据并发存取和数据完整性,在一事务内由语句获取的全部封锁在事务期间被保持,直至该事务提交或回滚时被释放。对于用ORACLE7数据库服务器构造的较大规模的企业级客户/服务器应用系统,众多的客户端由于各种各样的原因(硬件故障、意外掉电等等)难免造成用户会话的意外中止,而ORACLE本身不主动清除这些垃圾会话(session),如果这些会话(session)恰好在当前事务期间对数据库对象(表、视图等)加了锁,往往造成其他客户端的用户不能正常继续工作。如何及时清除这些垃圾会话(session)、释放所占用的资源,这正是本文所要讨论的内容。2具体方法ORACLE数据库具有审计其内部所有发生的活动的能力,每一个企图与数据库连接的活动都可以被审计(Audit),即所谓的登录审计(LoginAudit)。
创新互联建站专业为企业提供枞阳网站建设、枞阳做网站、枞阳网站设计、枞阳网站制作等企业网站建设、网页设计与制作、枞阳企业网站模板建站服务,10年枞阳做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
你可以考虑使用在操作系统层面来杀掉客户端会话的连接进程,这样资源马上就可以释放掉,如果只是在数据库级别的话,即便是管理员杀掉会话,那么v$session里面也不过是显示killed状态,而不是真正的释放掉,同时如果此时实际的连接数量达到参数session设定数量上线的话,新的连接将会报错无法连接,直到资源释放才可以。
ORACLE
EBS操作某一个FORM界面,或者后台数据库操作某一个表时发现一直出于"假死"状态,可能是该表被某一用户锁定,导致其他用户无法继续操作
复制代码
代码如下:--锁表查询SQLSELECT
object_name,
machine,
s.sid,
s.serial#
FROM
gv$locked_object
l,
dba_objects
o,
gv$session
s
WHERE
l.object_id
=
o.object_id
AND
l.session_id
=
s.sid;
找到被锁定的表,解锁
复制代码
代码如下:--释放SESSION
SQL:
--alter
system
kill
session
'sid,
serial#';
您可能感兴趣的文章:mysql
事务处理及表锁定深入简析
释放连接只能是让一些连接的进程断开连接。
查询哪个user的连接数最多,先跟他们的用户说,不能连接这么多的进程,让他们释放一些,如果释放了,系统正常了,那么就限制每个用户连接数,不让他们连接这么多。
如果不释放,你就在操作系统层面把他们那些进程kill掉,有人来找就让他们对系统夯住负责,然后限制用户的连接数。
不过这么操作的风险还是不小的,自己掂量。
杀掉(kill)Oracle中的会话(Session)的方法:
SQL conn etl/etl
Connected.
SQL update test set status='invalid';
55944 rows updated.
SQL update test2 set dropped='Y';
3090 rows updated.
Oracle Database,简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统。
ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的一种中间件。ORACLE数据库是目前世界上使用最为广泛的数据库管理系统。
可以以Oralce管理员权限用户登录Oracle数据,查询到被锁的对象,然后杀除指定的会话。
用下面的语句查询被锁的对象,可以带上更多约束条件,如schemaname等更精确的匹配。
SELECT a.object_id, a.session_id, b.object_name, c.*
FROM v$locked_object a, dba_objects b, v$session c
WHERE a.object_id = b.object_id
AND a.SESSION_ID = c.sid(+)
杀Seesion的SQL语句语法如下:
alter system kill session 'sid, serial#'
如上面查出来的一条记录的sid是53, serial#为663,就执行以下的语句
alter system kill session '53,663'
如果要一次性杀死多个会话,一个一个填写sid和serial#十分的繁琐,应该在查询被锁对象的同时拼凑出多条的杀会话语句,以分号分隔,一起复制下来,然后就可以批量的执行了。
拼凑kill语句的方式如下,下面加了一个过滤条件和一个排序,杀除真正关心的表,并且着重注意超时时间过长的会话。
SELECT 'alter system kill session ''' || c.sid || '' || ',' || c.serial# ||''';',
a.object_id, a.session_id, b.object_name, c.*
FROM v$locked_object a, dba_objects b, v$session c
WHERE a.object_id = b.object_id
AND a.SESSION_ID = c.sid(+)
AND schemaname = 'Unmi'
ORDER BY logon_time