Oracle锁表故障处理一例

一次开发人员直接在数据库服务器上做delete table操作系统,由时在上班高峰运行,造成长时间执行无反应,进而把SQLPLUS客户端关闭掉,再次运行删除语句,造成数据库运行缓慢。  
询问操作过程知道了是由锁表造成,最终处理;本文只是模拟锁表处理过程,下次遇到相同问题可以快速处理。

1. 查看数据库的等待事件

如果不清楚原因,可以通过先通过等待事件进行分析。

SQL> select sid,EVENT from v$session_wait where wait_class<>‘Idle‘;

SID EVENT  
---------- ----------------------------------------------------------------    
       158 SQL*Net message to client    
       159 enq: TX - row lock contention    
SQL>

2. 查看数据库是否有锁

SQL> select * from v$lock where block=1;

3. 查询lock锁, 看谁锁谁

说明:BLOCK为1的行,表示资源由它锁定。REQUEST表示需要这个锁。

SQL> SELECT sid, id1, id2, lmode, block,request, type    
FROM V$LOCK    
WHERE id1 IN (SELECT id1 FROM V$LOCK WHERE lmode = 0)    
ORDER BY id1, request;

SID        ID1        ID2      LMODE      BLOCK    REQUEST TY  
---------- ---------- ---------- ---------- ---------- ---------- --    
       153     655397        308          6          1          0 TX    
       157     655397        308          0          0          6 TX

4. 查询锁表的SID,Serial#,用户、开始时间,然后就可以杀掉该进程了。

SQL> select t1.sid,t1.serial#,t1.username,t1.logon_time from v$session t1,v$locked_object t2 where t1.sid = t2.session_id order by t1.logon_time ;

SID    SERIAL# USERNAME                       LOGON_TIME  
---------- ---------- ------------------------------ -------------------    
       153         12 ABC                            2014-11-17 09:19:33    
       157        106 ABC                            2014-11-17 09:54:24

5. 可以进一步查询出SID,SPID等信息

SQL> select s.username, s.osuser, s.sid, s.serial#, p.spid, s.program,s.STATUS 
from v$session s,v$process p 
where s.paddr = p.addr and s.username is not null;

USERNAME                       OSUSER                                SID    SERIAL# SPID         PROGRAM                                          STATUS  
------------------------------ ------------------------------ ---------- ---------- ------------ ------------------------------------------------ --------    
ABC                            oracle                                153         12 4290         [email protected] (TNS V1-V3)                        INACTIVE    
SYS                            oracle                                150         12 4417         [email protected] (TNS V1-V3)                        ACTIVE    
ABC                            oracle                                157        119 4830         [email protected] (TNS V1-V3)                        ACTIVE

要么在oracle进行杀掉,以及在操作系统下杀掉,对于status为killed的语句,应用通过操作系统kill命令才能最终最快杀掉。

alter system kill session  ‘153,12‘;  
alter system kill session  ‘157,119‘;

或操作系统中

kill -9 4290  
kill -9 4830

6.  查询被锁的表的SID及相关资源

说明:出被锁的表及SQL,还是要结合上面的查询进行手工处理, 也可以通过SID找到SQL语句。

set pagesize 999;  
set linesize 200;    
col PROGRAM for a25;    
col TERMINAL for a10;

SQL> select s.status,s.sid,s.serial#,p.spid, 
       s.last_call_et as exec_seconds,t.sql_text as curr_sql 
from gv$session s,v$process p,v$instance i,v$lock k, v$sqltext t 
where s.paddr = p.addr 
and s.type != ‘BACKGROUND‘ 
and s.lockwait = k.kaddr 
and s.sql_hash_value = t.hash_value 
and s.username is not null; 
STATUS          SID    SERIAL# SPID         EXEC_SECONDS CURR_SQL    
-------- ---------- ---------- ------------ ------------ ----------------------------------------------------------------    
ACTIVE          159         28 4072                 1285 update test_lock set name=‘aa4‘ where id = 1

SQL>

时间: 2024-08-06 23:28:59

Oracle锁表故障处理一例的相关文章

oracle 锁表 及 解锁

很久没有写博客了.不知道写什么 今天,让我清一张表的数据,结果清了之后,系统直接不动了,就好像服务器挂死了一样. 后来找了半天才发现,原来是我删除数据之后没有提交事物造成了数据库锁表,然后又不明白了, 什么是锁表呢,于是就上网去查 查了半天,大多数都是说怎么解决锁表和查询锁表的,但是只了解方法还不够,又想知道原理,于是 就继续往深里查查到了oracle的锁机制 由于数据库是多用户同时使用的共享资源,当多个用户并发的存取事物的时候,数据库中就会发生多个进程 同时操作同一个数据的情况,若对并发操作不

Oracle锁表查询和解锁方法

数据库操作语句的分类 DDL:数据库模式定义语言,关键字:create DML:数据操纵语言,关键字:Insert.delete.update DCL:数据库控制语言 ,关键字:grant.remove DQL:数据库查询语言,关键字:select oracle表在什么情况下会被锁住 DML锁又可以分为,行锁.表锁.死锁 行锁:当事务执行数据库插入.更新.删除操作时,该事务自动获得操作表中操作行的排它锁. 表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL

查询Oracle锁表和解决方法

Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?本文我们主要就介绍一下这部分内容.(1)锁表查询的代码有以下的形式:select count(*) from v$locked_object;select * from v$locked_object;(2)查看哪个表被锁select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_obj

Oracle锁表 行级锁 表级锁 行级锁

Oracle锁表  行级锁  表级锁 ---- 行被排他锁定 ----在某行的锁被释放之前,其他用户不能修改此行          ----使用 commit 或 rollback 命令释放锁 ----Oracle 通过使用 INSERT.UPDATE 和 SELECT-FOR UPDATE 语句自动获取行级锁 SELECT-FOR UPDATE 子句  ―在表的一行或多行上放置排他锁  ―用于防止其他用户更新该行 ―可以执行除更新之外的其他操作 ―select * from goods whe

oracle锁表

Oracle锁表比较简单,查询锁表的session杀掉就可以了. 1.以下几个为相关表 SELECT * FROM V$LOCK; SELECT * FROM V$SQLAREA; SELECT * FROM V$SESSION; SELECT * FROM V$PROCESS; SELECT * FROM V$LOCKED_OBJECT; SELECT * FROM ALL_OBJECTS; SELECT * FROM V$SESSION_WAIT; 2.查看被锁的表 SELECT B.OWN

Oracle 锁表查询及解锁

如果对 Oracle 数据表中的数据进行 增删改 操作时卡住无响应,很可能是表已被锁定.使用下面的命令可以解决锁定问题. 锁表状态查询. 直接复制粘贴就可以. --锁表查询SQL SELECT 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;

解决Oracle锁表

概述:锁表是很容易发生的现象,当有多人对表进行操作时就容易发生.如下是解决锁表的步骤 锁表原因:由于Oracle数据库具有保持数据的一致性,所以当一个人对表进行操作,没有提交,另一个人在需要操作的时候,就不能操作,必须等表提交,就一直处于等待状态,就导致锁表. 锁表报错信息:   如果发现修改一个表数据时不能提交而报下面的错误:Record is locked by another user 解决方法:   杀死会话进程或者再执行sql语句,然后提交. 解决步骤: 1. 登陆数据库,以sys用户

Oracle锁表及解锁

为了防止用户在同一时间并发地访问和修改资源,ORACLE使用不同类型的锁控制对数据的并发访问,以防止用户之间出现破坏性的交互操作 1,锁表 锁定表的通用语法: lock table 表名 in <share or share update or exclusive mode> 共有三种锁表模式: 共享模式(in share mode) 共享更新模式(in share update mode) 排他锁模式(in exclusive mode) 锁表实例: //以排他锁模式锁定tRun表 lock

oracle 锁表的处理。

最近系统每天经常锁表,进程杀死后,很快再次锁住这个表. (一)先贴出现场处理死锁的步骤. 另外:有时候通过PL/SQL执行kill session可能仍然无法解锁,此时需要登陆到Oracle服务器将进程kill掉才行. 1.生成Kill Session语句 select 'alter system kill session ''' || SID ||',' || SERIAL# || ''';' from ( select distinct a.sid, a.Serial#, status, m