oracle 锁表和解决方法
oracle锁表问题处理
oracle锁表问题处理
查询表的状况的对象:V$LOCK, V$LOCKED_OBJECT, V$SESSION, V$SQLAREA, V$PROCESS select * from v$locked_object
select * from dba_objects
方法:
首先查看哪些表被锁住了
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;
select ername,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;
杀进程中的会话
alter system kill session 'sid,serial#';
例如:
alter system kill session '29,5497';
查询锁表的方法:
SELECT S.SID SESSION_ID, ERNAME, s.SERIAL#,
DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive',
TO_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive',
ORACLE锁表原因查询和解决办法
ORACLE锁表原因查询和解决办法1. ORACLE中查看当前系统中锁表情况
查询SQL如下:
select sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
lo.locked_mode
from v$locked_object lo, dba_objects ao, v$session sess, v$process p
where ao.object_id = lo.object_id
and lo.session_id = sess.sid
and object_name = 'MOV_MSTR'
查询是什么SQL引起了锁表的原因,SQL如下:
select l.session_id sid,
s.serial#,
l.locked_mode,
l.oracle_username,
er#,
l.os_user_name,
s.machine,
s.terminal,
a.sql_text,
a.action
from v$sqlarea a, v$session s, v$locked_object l
where l.session_id = s.sid
and s.prev_sql_addr = a.address
order by sid, s.serial#;
2. ORACLE解锁的⽅法
alter system kill session 'SID,serial#'; SID和Serial#共同确定⼀唯⼀的session。
oracle数据库锁表解决办法
oracle数据库锁表解决办法
Oracle数据库是一款非常流行的数据库管理系统,其优势在于能够支持多用户,并发操作,数据安全稳定。然而,由于其特殊性,在使用Oracle数据库时,经常会遇到数据库锁表的现象。当某个表被其他用户锁定时,其他用户就无法访问该表,这给数据管理带来了巨大的困难,本文就介绍Oracle数据库锁表解决办法,希望对大家有所帮助。
1.询该表被锁定的用户
在Oracle数据库中,系统提供了一个方法来查询该表被锁定的用户,可以使用如下语句:
SELECT SID, SERIAL#, USERNAME
FROM v$LOCK
WHERE id1 = 表名
其中,SID和SERIAL#分别表示会话ID和会话号;USERNAME表示锁表的用户名。通过查询,可以知道是哪个用户锁定了该表,这样可以帮助我们更好地分析和解决数据库锁表的问题。
2.决数据库锁表的问题
(1)强制结束锁表的会话
如果锁表的用户是一个普通的用户,此时可以使用aletr system kill session语句将其会话强制结束,这样就可以释放锁表的资源。
但是,要注意的是,如果锁表的用户是sydba或sysoper之类的特权用户,强制结束会话可能产生不可预料的后果,因此不推荐使用
这种方法。
(2)使用rollback释放表锁
如果锁表的用户已经执行了一些更新操作,可以使用rollback 语句将其回滚,这样就可以释放表的锁。另外,在Oracle数据库中,还提供了一种特殊的表锁,叫做DML锁,它是Oracle数据库用来实现多版本控制的,如果遇到这种表锁,只有等当前用户执行commit 操作之后,才能释放锁。
oracle解决锁表
oracle解决锁表
如何解决锁表:
当某个⽤户对表数据进⾏修改⽽忘了提交,另⼀个⽤户对这个表数据修改时,需要等待前⾯操作表的⼈提交修改,此时操作会⼀直处于等待状态,导致锁表。
⾸先:
查询哪些会话被锁:
select ername,a.sid,a.serial#,a.logon_time from v$session a,v$locked_object b
where a.sid=b.session_id
order by a.logon_time;
根据上⾯结果SID来查询该会话的具体SQL:
select sql_text
from v$session a,v$sqltext_with_newlines b
where
decode(a.sql_hash_value,0,prev_hash_value,sql_hash_value)=b.hash_value
and a.sid=&sid order by piece;
根据查询出来的会话SID 和Serial来kill会话:
alter system kill session '515,2186';
DECODE函数是ORACLE PL/SQL的功能强⼤的函数之⼀,⽬前还只有ORACLE公司的SQL提供了此函数,其它数据库⼚商的SQL实现还没有此功能。DECODE有什么⽤途呢?先构造⼀个例⼦,假设我们想给智星职员加⼯资,其标准是:⼯资在8000元以下的加20%;⼯资在8000元或以上的加15%,通常的做法是,先选出记录中的⼯资字段值? select salary into var-salary from employee,然后对变量var-salary⽤if-then-else或choose case之类的流控制语句进⾏判断。如果⽤DECODE函数,那么我们就可以把这些流控制语句省略,通过SQL语句就可以直接完成。如下:select decode(sign(salary -
oracle锁表查询和解锁方法
oracle锁表查询和解锁方法
一、锁表查询
1.使用“行锁”的“for update”子句
“for update”子句可以显式地锁定表中的行,以防止其他用户在数据没有更新之前更改或删除它们。您可以在SELECT语句后使用“for update”子句来锁定表中的特定行:
SELECT empno, ename
FROM employees
WHERE deptno = 10
FORUPDATE;
如果您希望锁定整个表,请加上“OF”关键字:
SELECT empno, ename
FROM employees
WHERE deptno = 10
FOR UPDATE OF empno;
当在“of”后面指定列名时,它表示你想要锁定此列中的所有行。这意味着其他会话只能读取此表,但不能修改任何满足WHERE子句的行。
要确保SQL语句完全执行,您必须提交事务。
2.使用“表锁”的“lock table”
您可以使用“lock table”语句来锁定表。 lock table用于管理和表中的数据不受任何其他用户影响的场合。它有三种锁定模式:共享(shared)、排他(exclusive)和混合(mixed)。
lock table table_name in exclusive mode;
通常,你将锁定表以防止其他用户以任何方式更改。共享模式锁定表并允许其他用户从表中选择数据,而排他模式锁定除了选择以外的所有指令。
为了防止其他会话使用SELECT语句,可以使用混合模式。混合模式允许其他进程只进行SELECT操作。
要确保锁定表,您可以提交事务或回滚事务:
Oracle常见死锁发生的原因以及解决方法
Oracle常见死锁发生的原因以及解决方法死锁是指在并发程序中,两个或多个进程因为争夺系统资源而陷入无
限等待的状态,从而无法继续执行下去。在Oracle数据库中,死锁是一
个非常常见的问题,它会导致系统性能下降,甚至造成系统崩溃。本文将
详细介绍Oracle常见死锁发生的原因以及解决方法。
一、死锁发生的原因
1.竞争资源:当多个进程同时请求相同的资源时,可能会导致死锁的
发生。例如,如果两个进程同时请求一个表的写锁,那么它们就会陷入死
锁状态。
2.锁的顺序:当多个进程按照不同的顺序请求锁时,可能会导致死锁
的发生。例如,如果进程A先请求资源X,再请求资源Y,而进程B先请
求资源Y,再请求资源X,那么它们就会陷入死锁状态。
3.锁的持有时间:当一个进程持有一个锁,并且在等待其他资源时继
续保持该锁,可能会导致死锁的发生。例如,如果进程A持有资源X的锁,并且在等待资源Y时继续保持该锁,而进程B持有资源Y的锁,并且在等
待资源X时继续保持该锁,那么它们就会陷入死锁状态。
二、死锁的解决方法
1. 死锁检测和解除:Oracle数据库提供了死锁检测和解除的机制。
当一个进程请求一个资源时,数据库会检查是否存在死锁。如果存在死锁,数据库会选择一个进程进行回滚,解除死锁状态,并且通知其他进程重新
尝试获取资源。
2.超时设置:为了避免死锁的发生,可以设置超时时间。当一个进程请求一个资源时,如果在指定的超时时间内无法获取资源,那么就放弃该请求,并且释放已经持有的资源。这样可以防止死锁的发生,但是会增加系统的开销。
3.锁的顺序:为了避免死锁的发生,可以规定所有进程按照相同的顺序请求锁。例如,可以规定所有进程按照资源的名称进行排序,然后按照顺序请求锁。这样可以避免死锁的发生,但是可能会影响系统的性能。
oracle解锁数据的方法
oracle解锁数据的方法
在Oracle数据库中,解锁数据的方法取决于锁定的类型和锁定的来源。下面是一些常见的解锁数据的方法:
1. 手动提交或回滚事务:如果数据被锁定是因为当前事务没有完成,则可以手动提交或回滚事务,以释放锁定的数据。可以使用以下命令提交事务:
```
COMMIT;
```
或者使用以下命令回滚事务:
```
ROLLBACK;
```
2. 等待其他事务完成:如果数据被其他事务锁定,则可以等待其他事务完成并释放锁定的数据。
3. 杀死会话进程:如果无法等待其他事务完成或无法识别锁定的来源,可以使用以下命令杀死锁定会话进程:
```
ALTER SYSTEM KILL SESSION 'sid, serial#';
```
其中'sid'和'serial#'是锁定会话的标识符,在V$SESSION视图中可以找到。
4. 重启数据库实例:如果数据长时间被锁定或无法解锁,可以考虑重启整个数据库实例来释放锁定的数据。但是,这种解锁方法应该在其他方法失败后才使用,并且需要小心处理,避免数据丢失或影响其他正在进行的操作。
需要注意的是,解锁数据可能会引起数据一致性问题,必须谨慎使用。在进行任何解锁操作之前,建议先备份数据以防止意外情况发生。
oracle锁表问题处理
oracle锁表问题处理
查询表的状况的对象:V$LOCK, V$LOCKED_OBJECT, V$SESSION, V$SQLAREA, V$PROCESS
select * from v$locked_object
select * from dba_objects
方法:
首先查看那些表被锁住了
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;
select ername,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;
杀进程中的会话
alter system kill session 'sid,serial#';
例如:
alter system kill session '29,5497';
查询锁表的方法:
SELECT S.SID SESSION_ID, ERNAME, s.SERIAL#,
DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive',
TO_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive',
oracle锁表查询和解锁方法
oracle锁表查询和解锁方法
Oracle数据库提供了多种锁表查询和解锁方法,主要包括以下几种:1.查询锁表的方法:
-查询数据库中的锁表信息:可以使用`V$LOCKED_OBJECT`视图来查询
数据库中当前被锁定的对象和会话信息。
-查看表的锁信息:可以使用`DBA_LOCK`视图来查看指定表被锁定的
信息,包括锁定的用户、锁定的模式、锁定的操作等。
-查看表上的锁信息:可以使用`DBA_OBJECTS`视图来查询指定表上的
锁信息,包括锁定的用户、锁定的模式、锁定的操作等。
2.解锁表的方法:
- 杀死会话:使用`ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;`语句可以立即终止指定会话。其中,`sid`和`serial#`是要
终止会话的标识符。
- 释放表锁:使用`ALTER TABLE table_name ENABLE TABLE LOCK`语
句可以释放指定表的锁。其中,`table_name`是要释放锁的表名。
- 修改会话状态:使用`UPDATE V$SESSION SET STATUS = 'KILLED' WHERE SID = sid AND SERIAL# = serial#;`语句可以将指定会话的状态
修改为`KILLED`,从而间接释放表锁。其中,`sid`和`serial#`是要释放
锁的会话的标识符。
3.避免锁表的方法:
-尽量使用短事务:短事务可以减少对资源的占用时间,从而降低锁
表的风险。
-尽量使用较小的粒度锁:使用较小的粒度锁可以减少锁表的范围,
oracle锁表解决办法
oracle锁表解决办法
随着数据库的发展和管理的复杂性,表锁成为在ORACLE数据库管理中一个重要的问题。在某些场景下,表锁的发生可能导致系统缓慢或性能下降,更糟糕的是,它可能会导致死锁。因此,如何有效地解决表锁问题,以提高ORACLE数据库性能,是解决技术问题的重点。
首先,要明确什么是表锁,什么情况会导致表锁,以及表锁的影响与风险。表锁是指当用户在ORACLE数据库中使用SELECT或UPDATE 或INSERT查询语句访问表时,由于某些原因,其他用户无法访问表,在数据库中可见的表锁。表锁的发生可能是由于系统架构设计不当、混乱的数据更新、性能优化不当等原因造成的,这将严重影响数据库的性能和可用性。
其次,要识别ORACLE表锁,弄清表锁类型,并且要熟悉ORACLE 数据库锁机制,了解Oracle表中存在的共享锁和排他锁,以及其中的表维护锁和行级锁等,以便更好地排查表锁的原因。
同时,要综合考虑ORACLE表锁的解决办法,一方面要保证系统和应用程序的健康状态,保证数据一致性和完整性;另一方面,要考虑优化表的索引和结构,分析SQL语句的优化、加大缓存大小等操作,以避免读写冲突和访问冲突。另外,建议在ORACLE表上使用行锁,而不是默认表锁。
此外,ORACLE表锁解决办法还包括控制并发,尽量减少并发量,减少资源竞争;尽量避免表上没有必要的列,以便减少数据更新冲突;以及定期检查数据库和应用程序运行日志,查看数据库活动,以便及
时发现潜在的表锁问题并采取行动。
最后,要找准表锁的根源,进行适当的调整,以提高ORACLE数据库系统性能。在实施表锁解决方案之前,还必须进行充分的测试和模拟,以确保方案的有效性和可靠性。以上,就是关于ORACLE表锁解决办法的介绍,希望能帮助大家解决ORACLE数据库表锁问题,提高数据库的性能和可用性。
oracle数据库死锁解决方法
oracle数据库死锁解决方法
1.优先处理的方法
(1)改变死锁的锁模式
检查哪些锁是行级锁、表级锁或表空间级锁,针对这些锁可以:
1. 将行级锁转换为表级锁或表空间级锁;
2. 将低级锁转换为高级锁;
(2)定位死锁的用户
检查哪些用户下的会话产生死锁,并从此用户中终止其中某一会话,释放其锁资源,就可以结束死锁。
2.预防性方法
(1)避免给表加存储过程同时加多个锁
在更新表和写存储的内容的时候,尽量避免给表加多个锁,这会显著的增加死锁的几率。
(2)避免给表同时加读锁和写锁
同时加入读锁和写锁也会导致死锁,尽可能避免此类锁类型的使用。
(3)避免使用自定义临时表
在调用存储过程过程中,尽量避免使用自定义临时表,因为它虽然避免了很多表间关系,但在给表加锁时容易出现死锁。
3.实施死锁检测与预防
死锁检测和预防可以通过监控数据库的sql命令和页面,来及时的检测当前的死
锁情况,通过检查死锁情况,以及死锁事件的日志来进行分析,从而找出死锁的根本原因。
oracle数据库锁表解决方法
oracle数据库锁表解决方法
Oracle数据库是一种强大的关系型数据库管理系统,广泛应用于各个行业中。在使用Oracle数据库时,我们可能会遇到一些表锁的问题,即某个表被其他事务锁住,导致其他事务无法对该表进行操作。本文将介绍一些解决Oracle数据库锁表的方法。
1. 查看锁表的情况
在解决锁表问题之前,首先需要了解哪个表被锁住了。我们可以通过查询数据库中的V$LOCK视图来查看当前的锁表情况。V$LOCK 视图包含了已经获取或等待的锁的信息,可以通过查询该视图来获取锁表的详细信息,包括锁住表的会话ID、锁的模式、锁的类型等。
2. 杀死锁表的会话
在确认了是哪个会话锁住了表之后,可以尝试杀死该会话,释放锁。可以使用ALTER SYSTEM KILL SESSION命令来杀死指定会话。需要注意的是,杀死会话可能会导致该会话正在进行的事务回滚,可能会对数据造成一定影响,因此在执行该操作前需要谨慎考虑。
3. 释放锁
如果无法杀死锁表的会话,或者杀死会话后锁仍然存在,可以尝试使用ALTER SYSTEM KILL SESSION命令的IMMEDIATE选项来释放锁。该选项会立即终止会话,并且回滚会话所属的事务。该方法需要具有适当权限的用户执行。
4. 等待锁释放
如果无法通过杀死会话或释放锁的方式解决锁表问题,可以选择等待锁的释放。在Oracle数据库中,当一个事务请求锁时,如果锁被其他事务占用,该事务会被阻塞,直到锁被释放。因此,可以等待锁的释放,待锁被释放后再进行操作。
5. 分析锁表原因
在解决锁表问题时,还需要分析锁表的原因,以避免类似问题的再次发生。常见的导致锁表的原因包括事务长时间占用锁、事务并发度过高、事务执行顺序不当等。可以通过查看数据库的AWR报告或使用性能监视工具来分析锁表原因,并进行相应的优化。
oracle锁表查询和解锁方法
oracle锁表查询和解锁方法
## Oracle 锁表查询和解锁方法
Oracle数据库是当今最流行的关系型数据库系统,其中有一种十分重要的特性就是它可以锁定数据
库表,防止别人修改该表的内容,又被称为并发
控制。下面我们分别来看看Oracle中查询和解锁表的方法:
### 一、Oracle中查询锁表方法
1. 使用系统内置函数查询锁表
- 以DBA权限登录,使用“select * from v$lock;”查询锁表状态;
- 使用“SELECT l.sid, l.type, l.mode, l.id1,
ername, s.osuser, s.machine FROM v$lock l,
v$session s WHERE l.sid=s.sid;”查询出锁表具体信息,以便确定锁表的具体情况和引起表锁定的原因。
2. 使用dba_dml_locks视图查看锁表
- 以DBA账号登录,使用“select * from
dba_dml_locks;”命令查看锁表的状态;
- 使用“select * f rom dba_dml_locks where name='表名' and mode_held='锁定模式';”命令查看表名称
以及表上锁定的模式。
### 二、Oracle中解锁表方法
1. 强制执行表解锁:
- 使用“ALTER SYSTEM KILL SESSION
'sid,serial#' IMMEDIATE;”命令强制杀死会话占用表的会话,以释放表上的锁定;
- 使用“select * from v$lock;”命令查询是否成功释放表的锁定。
oracle grant lock table权限
oracle grant lock table权限
摘要:
1.Oracle 简介
2.Oracle 中的锁表权限
3.锁表权限的作用
4.锁表权限的实现方法
5.锁表权限的注意事项
正文:
【1.Oracle 简介】
Oracle 是一款广泛应用于企业级数据管理的关系型数据库管理系统。其强大的性能、安全性和可扩展性使得Oracle 成为全球众多企业的首选数据库解决方案。在Oracle 数据库中,用户可以对表、视图、存储过程等数据库对象进行操作,实现数据的增、删、改、查等功能。为了保证数据的一致性和完整性,Oracle 提供了丰富的权限控制机制,使得不同角色的用户可以对数据库对象执行不同的操作。
【2.Oracle 中的锁表权限】
锁表权限是Oracle 数据库权限控制机制中的一种。在Oracle 中,锁表权限允许用户对某个表进行加锁操作,以确保数据的一致性和完整性。锁表权限分为两种:共享锁(Shared Locks)和排他锁(Exclusive Locks)。共享锁允许多个用户同时对表进行读取操作,但只有一个用户可以对表进行写入操作。排他锁则表示在锁定期间,其他用户无法对表进行任何操作,包括读取和
写入。
【3.锁表权限的作用】
锁表权限在实际应用中具有重要作用,主要体现在以下几点:
1.保证数据一致性:通过对表加锁,可以防止多个用户同时对表进行读写操作,避免出现数据不一致的情况。
2.提高数据安全性:通过设置锁表权限,可以限制对敏感数据的访问,防止数据泄露和篡改。
3.优化查询性能:对于经常被查询的表,可以通过设置共享锁,提高查询效率。
oracle数据库锁表解决方法
oracle数据库锁表解决方法
Oracle数据库是一种常用的关系型数据库管理系统,可以用于存储和管理大量的数据。在多用户环境下,可能会出现多个用户对同一张表进行操作的情况,这时就有可能出现表锁的问题。表锁是一种保证数据一致性和完整性的机制,但是过多的表锁会导致性能下降,甚至出现死锁的情况。因此,解决Oracle数据库锁表问题是非常重要的。
下面将介绍一些解决Oracle数据库锁表问题的方法。
1. 查找锁定表的会话:可以使用以下SQL语句查找锁定表的会话: ```
SELECT session_id, session_serial#, blocking_session, lock_type, mode_held, mode_requested
FROM v$locked_object
WHERE object_id = <表名的对象ID>;
```
通过查找锁定表的会话,可以了解锁定表的会话以及它们所持有的锁的类型和模式。
2. 解锁表的会话:如果确定某个会话需要解锁表,可以使用以下SQL语句解锁表:
```
ALTER SYSTEM KILL SESSION '<SID>,<SERIAL#>';
```
其中,'<SID>'和'<SERIAL#>'分别是锁定表的会话的会话ID和序列号。
3. 优化SQL语句:有时候数据库锁表的问题是由于某个SQL语句执行时间过长或者执行效率低导致的。可以使用Oracle的SQL调优工具,如SQL Tuning Advisor,来优化SQL语句,减少锁的持有时间。
Oracle表中一行记录被锁(行锁,表锁,死锁)
Oracle表中⼀⾏记录被锁(⾏锁,表锁,死锁)
表现形式:可以向表⾥⾯save新数据,但是⽆法跟新某⼀条数据,update的时候就⼀直在等待。
Oracle锁表查询和解锁⽅法
数据库操作语句的分类
DDL:数据库模式定义语⾔,关键字:create
DML:数据操纵语⾔,关键字:Insert、delete、update
DCL:数据库控制语⾔,关键字:grant、remove
DQL:数据库查询语⾔,关键字:select
oracle表在什么情况下会被锁住
DML锁⼜可以分为,⾏锁、表锁、死锁
⾏锁:当事务执⾏数据库插⼊、更新、删除操作时,该事务⾃动获得操作表中操作⾏的排它锁。
表级锁:当事务获得⾏锁后,此事务也将⾃动获得该⾏的表锁(共享锁),以防⽌其它事务进⾏DDL语句影响记录⾏的更新。事务也可以在进⾏过程中获得共享锁或排它锁,只有当事务显⽰使⽤LOCK TABLE语句显⽰的定义⼀个排它锁时,事务才会获得表上的排它锁,也可使⽤LOCK TABLE显⽰的定义⼀个表级的共享锁(LOCK TABLE具体⽤法请参考相关⽂档)。
死锁:当两个事务需要⼀组有冲突的锁,⽽不能将事务继续下去的话,就出现死锁。
如事务1在表A⾏记录#3中有⼀排它锁,并等待事务2在表A中记录#4中排它锁的释放,⽽事务2在表A记录⾏#4中有⼀排它锁,并等待事务1在表A中记录#3中排它锁的释放,事务1与事务2彼此等待,因此就造成了死锁。死锁⼀般是因拙劣的事务设计⽽产⽣。
死锁只能使⽤SQL下:alter system kill session “sid,serial#”;或者使⽤相关操作系统kill进程的命令,如UNIX下kill -9 sid,或者使⽤其它⼯具杀掉死锁进程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ORACLE 锁表的解决方法及查找引起锁表SQL语句方法
2011年3月13日 恶魔天使跳到评论
1. ORACLE中查看当前系统中锁表情况
select * from v$locked_object
可以通过查询v$locked_object拿到sid和objectid,然后用sid和v$session链表查询是哪里锁的表,用v$session中的objectid字段和dba_objects的id字段关联,查询详细的锁表情况。
查询SQL如下:
select sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
lo.locked_mode
from v$locked_object lo, dba_objects ao, v$session sess, v$process p
where ao.object_id = lo.object_id
and lo.session_id = sess.sid;
查询是什么SQL引起了锁表的原因,SQL如下:
select l.session_id sid,
s.serial#,
l.locked_mode,
l.oracle_username,
er#,
l.os_user_name,
s.machine,
s.terminal,
a.sql_text,
a.action
from v$sqlarea a, v$session s, v$locked_object l
where l.session_id = s.sid
and s.prev_sql_addr = a.address
order by sid, s.serial#;
2. ORACLE解锁的方法
alter system kill session ’146′; –146为锁住的进程号,即spid