数据库中某条数据被锁了。如何解锁

数据库中某条数据被锁了。如何解锁,第1张

用下面的语句检查数据库锁,然后kill 掉产生锁的进程就ok了。

查锁:

selectnvl(S.USERNAME,'Internal') username,

nvl(S.TERMINAL,'None') terminal,

L.SID||','||S.SERIAL# Kill,

U1.NAME||'.'||substr(T1.NAME,1,20) tab,

decode(L.LMODE,1,'No Lock',

2,'Row Share',

3,'Row Exclusive',

4,'Share',

5,'Share Row Exclusive',

6,'Exclusive',null) lmode,

decode(L.REQUEST,1,'No Lock',

2,'Row Share',

3,'Row Exclusive',

4,'Share',

5,'Share Row Exclusive',

6,'Exclusive',null) request

fromV$LOCK L,

V$SESSION S,

SYS.USER$ U1,

SYS.OBJ$ T1

whereL.SID = S.SID

andT1.OBJ# = decode(L.ID2,0,L.ID1,L.ID2)

andU1.USER# = T1.OWNER#

andS.TYPE != 'BACKGROUND'

order by 1,2,5

杀锁:

alter system kill session 'sid,#serial'

sid和#serial用前面查询到的结果替换。

1、用dba角色的用户登陆,进行解锁,先设置具体时间格式,以便查看具体时间

SQL>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'

Session altered.

2、查看具体的被锁时间 ( 这里你根据需要, 填写具体的用户名, 下面语句的 用户名是 TEST)

SQL>select username,lock_date from dba_users where username='TEST'

USERNAME LOCK_DATE

TEST 2009-03-10 08:51:03

3、解锁

SQL>alter user test account unlock

User altered.

4、查看是那个ip造成的test用户被锁

查看$ORACLE_HOME/network/admin/log/listener.log日志

10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=oracle)(HOST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49434)) * establish * lhoms * 0

10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=oracle)(HOST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49435)) * establish * lhoms * 0

这样可知是上面10.69.1.11的ip尝试多次失败登陆造成的被锁

注:

一般数据库默认是10次尝试失败后锁住用户

1、查看FAILED_LOGIN_ATTEMPTS的值

select * from dba_profiles

2、修改为30次

alter profile default limit FAILED_LOGIN_ATTEMPTS 30

3、修改为无限次(为安全起见,不建议使用)

alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited

上述的相关内容就是对Oracle用户被锁原因及办法的描述,希望会给你带来一些帮助在此方面。

数据库 *** 作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法。

将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁。

use Northwind

begin tran

insert into Orders(CustomerId) values(@#ALFKI@#)

waitfor delay @#00:00:05@#

select * from Orders where CustomerId = @#ALFKI@#

commit

print @#end tran@#

SQL Server对付死锁的办法是牺牲掉其中的一个,抛出异常,并且回滚事务。在SQL Server 2000,语句一旦发生异常,T-SQL将不会继续运行,上面被牺牲的连接中, print @#end tran@#语句将不会被运行,所以我们很难在SQL Server 2000的T-SQL中对死锁进行进一步的处理。

现在不同了,SQL Server 2005可以在T-SQL中对异常进行捕获,这样就给我们提供了一条处理死锁的途径:

下面利用的try ... catch来解决死锁。

SET XACT_ABORT ON

declare @r int

set @r = 1

while @r <= 3

begin

begin tran

begin try

insert into Orders(CustomerId) values(@#ALFKI@#)

waitfor delay @#00:00:05@#

select * from Orders where CustomerId = @#ALFKI@#

commit

break

end try

begin catch

rollback

waitfor delay @#00:00:03@#

set @r = @r + 1

continue

end catch

end

解决方法当然就是重试,但捕获错误是前提。rollback后面的waitfor不可少,发生冲突后需要等待一段时间,@retry数目可以调整以应付不同的要求。

但是现在又面临一个新的问题: 错误被掩盖了,一但问题发生并且超过3次,异常却不会被抛出。SQL Server 2005 有一个RaiseError语句,可以抛出异常,但却不能直接抛出原来的异常,所以需要重新定义发生的错误,现在,解决方案变成了这样:

declare @r int

set @r = 1

while @r <= 3

begin

begin tran

begin try

insert into Orders(CustomerId) values(@#ALFKI@#)

waitfor delay @#00:00:05@#

select * from Orders where CustomerId = @#ALFKI@#

commit

break

end try

begin catch

rollback

waitfor delay @#00:00:03@#

set @r = @r + 1

continue

end catch

end

if ERROR_NUMBER() <>0

begin

declare @ErrorMessage nvarchar(4000)

declare @ErrorSeverity int

declare @ErrorState int

select

@ErrorMessage = ERROR_MESSAGE(),

@ErrorSeverity = ERROR_SEVERITY(),

@ErrorState = ERROR_STATE()

raiserror (@ErrorMessage,

@ErrorSeverity,

@ErrorState

)

end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6770446.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-28
下一篇 2023-03-28

发表评论

登录后才能评论

评论列表(0条)

保存