数据库删除表时报错:锁超时

第一阶段(方法一:会话锁):

1)使用命令查看被锁会话

select a.*,b.NAME,c.SESS_ID from v$lock a left join sysobjects b on b.ID=a.TABLE_ID left join v$sessions c on a.TRX_ID=c.TRX_ID

2)查到SESS_ID后使用下面函数KILL掉对应的SESSION

sp_close_session(sess_id);

第二阶段(方法二:阻塞)

3)执行完上述操作后再查看被锁会话,发现仍然存在,使用命令查看阻塞情况,但内容为空,

with locks as(
select o.name,l.*,s.sess_id,s.sql_text,s.clnt_ip,s.last_send_time  from v$lock l,sysobjects o,v$sessions s
where l.table_id=o.id and l.trx_id=s.trx_id ),
lock_tr as (   select trx_id wt_trxid,row_idx blk_trxid from locks where blocked=1),
res as(    select sysdate stattime,t1.name,t1.sess_id wt_sessid,s.wt_trxid,
t2.sess_id blk_sessid,s.blk_trxid,t2.clnt_ip,SF_GET_SESSION_SQL(t1.sess_id) fulsql,
datediff(ss,t1.last_send_time,sysdate) ss,t1.sql_text wt_sql  from lock_tr s,locks t1,locks t2
where t1.ltype='OBJECT'  and t1.table_id<>0   and t2.ltype='OBJECT'  and t2.table_id<>0
and s.wt_trxid=t1.trx_id  and s.blk_trxid=t2.trx_id)
select distinct wt_sql,clnt_ip,ss,wt_trxid,blk_trxid  from res;

第三阶段(方法三:事务锁)

4)使用命令查询会话中等待事务

select * from v$trxwait

发现有一条数据,而WAIT_FOR_ID列为0

5)查询其正在执行的超过2秒以上的sql,查询得出有230条。。。

select * from (
SELECT sess_id,sql_text,datediff(ss,last_recv_time,sysdate) Y_EXETIME,
       SF_GET_SESSION_SQL(SESS_ID) fullsql,clnt_ip
FROM V$SESSIONS WHERE STATE='ACTIVE' and user_name<>'SYSDBA')
where Y_EXETIME>=2 order by Y_EXETIME desc;

第四阶段(方法四:重启)

6)经上述排查无果后,因是测试环境,告知其备份并重启数据库再试,但重启数据库报错

Stopping DmServiceDMSERVER          [ FAILED ]
kill the process(pid:3836) had timeout!
DmServiceDMSERVER (pid:3836) is running.

7)重启服务器后再启动数据库,报错

Starting DmServiceDMSERVER:               [ FAILED ]
ARCH_DEST[/home/dmdba/guidang] will be out of space.
Validate dmarch.ini error, code=-523
dmserver startup failed, code= -523 [Out of space]
nsvr_ini_file_read failed, [code: -523]

第五阶段(此问题实际解决办法)

根据此错误提示找到了问题所在,归档目录空间满了,释放存储空间后再启动,一切正常,表删除操作成功

总结:

遇到锁超时,并且sp_close_session(sess_id);命令杀不掉session时,可以先查看下是否是归档目录空间满了。若有其他类似问题的解决方法,欢迎在下方留言,或留链接。

Logo

一站式 AI 云服务平台

更多推荐