ORACLE锁等待的处理方法

简介: 前言:锁等待的管理是数据库管理员在日常工作中会碰到较多的一个问题,一般来说大型的ERP锁等待的处理会相对较少,小型的应用系统锁等待会相对比较多。 常规的锁等待的处理方法如下: 1) 先查找持有锁的对象: 脚本:select a.

前言:锁等待的管理是数据库管理员在日常工作中会碰到较多的一个问题,一般来说大型的ERP锁等待的处理会相对较少,小型的应用系统锁等待会相对比较多。

常规的锁等待的处理方法如下:

1) 先查找持有锁的对象:

脚本:select a.sid, b.spid from (select s.sid, s.paddr from v$session s,v$lock l WHERE l.sid = s.sid and l.block=1) a, v$process b where a.paddr=b.addr;

2)kill相应的session:

脚本:alter system kill session  'sid,serial#';

以上的操作可以处理大约80%的锁等待的问题,还有20%的锁等待问题通过以上的语句是解决不了的,最近在就碰到了一个,当进行kill session的时候出现了提示"ORA-00031: session marked for kill",这个问题可以有两个处理方法:

方法一、重启数据库:这个方法肯定是不推荐的,每个公司对系统的可用性都是有很高的要求的,一旦重启了系统就表示这个重启的过程中系统属于不可用的状态,IT的系统可用性就降低了。(该方法适合不同oracle且连sqlplus都不知道怎么用的朋友)

方法二、从操作系统进行杀线程的操作,因为unix和windows操作系统的不一样,所以处理的方法也有些不一样;

1)unix和linux下面的操作步骤如下:

a)根据sid的信息找出操作系统的进程信息

脚本:select p.spid, osuser, s.program  from v$session s,v$process p   where s.paddr=p.addr and s.sid=&SID;

 

SQL> select p.spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=&SID;

Enter value for sid: 23

old 1: select p.spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=&SID

new 1: select p.spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=23

SPID             OSUSER                                 PROGRAM

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

8782014            ecqadm                     dw.sapECQ_DVEBMGS00@joeoneecq (TNS V1-V3)

 

b)   root用户下,通过操作系统进行杀进程

脚本:kill -9   8782014

2)由于windows操作系统下面ORACLE在任务管理只能查看一个oracle.exe的进程,当然不能直接对这个进程进行结束。oracle提供了相应的操作工具orakill,详细的操作如下:

 

C:\Users\Administrator>orakill orakill

Usage: orakill sid thread

where sid = the Oracle instance to target

thread = the thread id of the thread to kill

The thread id should be retrieved from the spid column of a query such as:

select spid, osuser, s.program from

v$process p, v$session s where p.addr=s.paddr

orakill sid thread

sid:表示要杀死的进程属于的实例名

thread:是要杀掉的线程号,即第3步查询出的spid。

例:c:>orakill orcl  8782014

总结:公司的ERP系统运行了3年的时间了,数据量也到2TB了,数据库也是公司所有的数据库里面最繁忙的一个了,但是从运行到现在还没有进行过kill session的操作。相比公司的另外一个属于自己开发的系统,数据量10G不到,但是几乎每个月都会出现锁等待,需要DBA从中干预。锁等待或死锁不是数据库的问题而是应用程序的问题,经常遇到有这些问题的应用,恭喜你升官加薪的机会就在眼前。

******************************************************************************************************

本文作者:JOHN QQ:1916066696 (请备注数据库)

ORACLE技术博客:
ORACLE 猎人笔记 http://blog.itpub.net/12679300/

*******************************************************************************************************

相关文章
|
监控 Oracle 安全
Oracle数据库用户频繁被锁问题原因排查及解决
由于应用环境下Oracle用户总是频繁被锁,经常不能执行数据库事务操作,严重影响了系统运行效率。通过问题原因分析及排查,发现了原因,在此记录一下。
4600 0
Oracle数据库用户频繁被锁问题原因排查及解决
|
存储 Oracle 关系型数据库
Oracle中“ORA-00060: 等待资源时检测到死锁” 或存储过程编译卡死的一种解决方法
Oracle中“ORA-00060: 等待资源时检测到死锁” 或存储过程编译卡死的一种解决方法
826 0
|
6月前
|
消息中间件 Oracle 关系型数据库
使用 cx_Oracle 在 Oracle 中等待记录并执行操作
问题背景: 在第一个 Python 项目中,需要等待记录被插入 Oracle 表中,一旦记录存在,就调用 Python 函数。目前使用 cx_Oracle 库,采用一种无限循环的方式来查询表。如果记录存在,就调用函数,然后等待 5 秒后重新开始循环。但这种方式效率不高,等待时间太长,并且系统看起来很慢。如果不想要每秒都向数据库发送查询,是否有其他方法来等待记录并执行操作?
|
7月前
|
SQL Oracle 关系型数据库
【ORACLE】 事务 | 锁 | 约束 | 权限、角色与用户管理
【ORACLE】 事务 | 锁 | 约束 | 权限、角色与用户管理
77 1
|
7月前
|
SQL Oracle 安全
Oracle数据库中的事务和锁
【4月更文挑战第19天】Oracle数据库的事务和锁是确保数据完整性和并发控制的核心机制。事务遵循ACID原则,保证操作的原子性、一致性、隔离性和持久性。通过COMMIT或ROLLBACK来管理事务更改。锁包括共享锁(读)、排他锁(写)、行级锁和表级锁,用于控制并发访问。自动锁机制在DML操作时生效,防止数据冲突。事务和锁共同维护数据库的稳定和安全。
|
7月前
|
SQL Oracle 关系型数据库
Oracle-锁解读
Oracle-锁解读
102 0
|
SQL 存储 Oracle
Oracle优化03-Latch和等待
Oracle优化03-Latch和等待
195 0
|
运维 Oracle 关系型数据库
Oracle优化02-锁和阻塞
Oracle优化02-锁和阻塞
130 0
QGS
|
监控 Oracle 网络协议
Navicat Premium 12远程登入Oracle,mariadb报错及处理方法
Navicat Premium 12远程登入Oracle报错及处理方法
QGS
142 0
|
SQL 存储 Oracle
Oracle事务和锁机制
Oracle事务和锁机制
142 0