查看数据库死锁

| 分类 数据库之sql  数据库之oracle  数据库之mysql  | 标签 数据库  sql  oracle  mysql  死锁    行锁  连接  innodb  session 

数据库出现锁一直占用,有可能是因为出现了死锁;也可能是因为开启了一个事务,在这里对某些记录加了行锁,但是因为程序逻辑编写有问题,或者异常处理不正确,导致提交事务或者回滚事务的操作没有执行,那么就一直占用着锁

这里列举一下,针对Oracle、MySQL 数据库,如何使用SQL 语句去查看数据库的锁,以便在出现锁相关的问题时有排查的方法

Oracle查看锁

执行下面的SQL 需要特定权限

以下SQL 用于查看当前数据库登陆用户及正在执行的SQL

select b.sid oracleID,  
	b.username 登录Oracle用户名,  
	b.serial#,  
	spid 操作系统ID,  
	paddr,  
	sql_text 正在执行的SQL,  
	b.machine 计算机名  
from 
    v$process a, v$session b, v$sqlarea c  
where 
    a.addr = b.paddr  
    and b.sql_hash_value = c.hash_value;

查看哪些表被锁

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;

查看哪个session 引起的表被锁住

select 
    b.username, 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; 

清除锁表的session

alter system kill session '405,47249';

查出锁定表的sid、serial#、os_user_name、machine_name、terminal,锁的type、mode

select 
    s.sid, s.serial#, s.username, s.schemaname, 
    s.osuser, s.process, s.machine, s.terminal, 
    s.logon_time, l.type
from 
    v$session s, v$lock l
where
    s.sid = l.sid 
    and s.username is not null
order by sid;

MySQL查看锁

下面是在MySQL 中排查锁问题时常用的SQL

--查询是否锁表
show open tables where in_use > 0;


--查询进程,如果有SUPER 权限,可以看到所有进程。否则,只能看到自己的进程(也就是,与您正在使用的MySQL 账户相关的进程)
show processlist;


--查看正在锁的事务(需要特定限)
select * from INFORMATION_SCHEMA.INNODB_LOCKS; 


--查看等待锁的事务(需要特定权限)
select * from INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 



如果本篇文章对您有所帮助,您可以通过微信(左)或支付宝(右)对作者进行打赏!


上一篇     下一篇