mysql怎么查死锁记录 查询mysql死锁

如何查看MySQL数据库的死锁信息使用终端或命令提示符登录到MySQL , 输入命令:
mysql -h xxxx.xxx.xxx -P 3306 -u username -p password
2
在MySQL客户端下输入命令:
show engine innodb status \G;
3
在打印出来的信息中找到“LATEST DETECTED DEADLOCK”一节内容
4
分析其中的内容,我们就可以知道最近导致死锁的事务有哪些
MySQL数据库中查询表是否被锁以及解锁1.查看表被锁状态
2.查看造成死锁的sql语句
3.查询进程
4.解锁(删除进程)
5.查看正在锁的事物(8.0以下版本)
6.查看等待锁的事物 (8.0以下版本)
如何查mysql死锁进程查询死锁进程
采用如下存储过程来查询数据中当前造成死锁的进程 。
drop procedure sp_who_lock
go
CREATE procedure sp_who_lock
as
begin
declare @spid int
declare @blk int
declare @count int
declare @index int
declare @lock tinyint
set @lock=0
create table #temp_who_lock
(
id int identity(1,1),
spid int,
blk int
)
if @@error0 return @@error
insert into #temp_who_lock(spid,blk)
select 0 ,blocked
from (select * from master..sysprocesses where blocked0)a
where not exists(select * frommaster..sysprocesses where a.blocked =spid and blocked0)
union select spid,blocked frommaster..sysprocesses where blocked0
if @@error0 return @@error
select @count=count(*),@index=1 from #temp_who_lock
if @@error0 return @@error
if @count=0
begin
select '没有阻塞和死锁信息'
return 0
end
while @indexA href="mailto:=@count"=@count
begin
if exists(select 1 from #temp_who_lock a where id@index and exists(select 1 from #temp_who_lock where idA href="mailto:=@index"=@index and a.blk=spid))
begin
set @lock=1
select @spid=spid,@blk=blk from #temp_who_lock where id=@index
select '引起数据库死锁的是: 'CAST(@spid AS VARCHAR(10))'进程号,其执行的SQL语法如下'
select@spid, @blk
dbcc inputbuffer(@spid)
dbcc inputbuffer(@blk)
end
set @index=@index 1
end
if @lock=0
begin
set @index=1
while @indexA href="mailto:=@count"=@count
begin
select @spid=spid,@blk=blk from #temp_who_lock where id=@index
if @spid=0
select '引起阻塞的是:' cast(@blk as varchar(10))'进程号,其执行的SQL语法如下'
else
select '进程号SPID:'CAST(@spid AS VARCHAR(10))'被''进程号SPID:'CAST(@blk AS VARCHAR(10))'阻塞,其当前进程执行的SQL语法如下'
dbcc inputbuffer(@spid)
dbcc inputbuffer(@blk)
set @index=@index 1
end
end
drop table #temp_who_lock
return 0
end
GO
--执行该存储过程
exec sp_who_lock
补充:
一、产生死锁的原因
在SQL Server中,阻塞更多的是产生于实现并发之间的隔离性 。为了使得并发连接所做的操作之间的影响到达某一期望值而对资源人为的进行加锁(锁本质其实可以看作是一个标志位) 。当一个连接对特定的资源进行操作时,另一个连接同时对同样的资源进行操作就会被阻塞,阻塞是死锁产生的必要条件 。
二、如何避免死锁
1.使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务;
2.设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作 , 避免进程悬挂;
3.优化程序,检查并避免死锁现象出现;
4.对所有的脚本和SP都要仔细测试,在正是版本之前;
5.所有的SP都要有错误处理(通过@error);
6.一般不要修改SQL SERVER事务的默认级别 。不推荐强行加锁 。
三、处理死锁
1、最简单的处理死锁的方法就是重启服务 。
2、根据指定的死锁进程ID进行处理
根据第二步查询到的死锁进行 , 大致分析造成死锁的原因 , 并通过如下语句释放该死锁进程
kill pid--pid为查询出来的死锁进程号
3、通过存储过程杀掉某个库下面的所有死锁进程和锁
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_killspid]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_killspid]
GO
create proc sp_killspid
@dbname varchar(200)--要关闭进程的数据库名
【mysql怎么查死锁记录 查询mysql死锁】as
declare @sqlnvarchar(500)
declare @spid nvarchar(20)
declare #tb cursor for
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
open #tb
fetch next from #tb into @spid
while @@fetch_status=0
begin
exec('kill ' @spid)
fetch next from #tb into @spid
end
close #tb
deallocate #tb
go
--使用方法,“db_name”为处理的数据库名称
exec sp_killspid'db_name'
mysql 查看死锁第一步,查出已锁的进程
查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
``
查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
``
INNODB_TRX表主要是包含了正在InnoDB引擎中执行的所有事务的信息,包括waiting for a lock和running的事务
select * from information_schema.innodb_trx
``
第二步,kill进程
show engin innodb status;//最后一次死锁信息及sql
show open tables where in_use0 //查看锁表
mysql 怎么查看死锁的记录1、查询是否锁表
show OPEN TABLES where In_use0;
查询到相对应mysql怎么查死锁记录的进程 === 然后 killid
2、查询进程
show processlist
补充mysql怎么查死锁记录:
查看正在锁mysql怎么查死锁记录的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
怎么统计mysql中有多少个死锁?1mysql怎么查死锁记录 , 查看数据库mysql怎么查死锁记录的隔离级别:
mysql select @@tx_isolation;
2mysql怎么查死锁记录,去查看先当前库的线程情况:
mysql show processlist;
没有看到正在执行的慢SQL记录线程,再去查看innodb的事务表INNODB_TRX,看下里面是否有正在锁定的事务线程,看看ID是否在show full processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了,mysql怎么查死锁记录我们需要手动kill掉 。
mysql SELECT * FROM information_schema.INNODB_TRX;
如果有记录,则找到trx_mysql_thread_id这个字段对应的id, 将其kill掉 。假如id=100
mysql-kill100
SELECT CONCAT_WS('','kill',' ',t.trx_mysql_thread_id,';')a FROM information_schema.INNODB_TRX t;
4,总结分析
表数据量也不大,按照普通的情况来说,简单的update应该不会造成阻塞的,mysql都是autocommit,不会出现update卡住的情况 , 去查看下autocommit的值 。
mysql select @@autocommit;
1表示自动提交 。0表示不自动提交 。
如果mysql怎么查死锁记录你发现自己的数据库autocommit=0,将它改正吧 。
解除死锁的两种方法:
(1)终止(或撤销)进程 。终止(或撤销)系统中的一个或多个死锁进程,直至打破循环环路,使系统从死锁状态中解除出来 。
(2)抢占资源 。从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以打破死锁状态 。
mysql怎么查死锁记录的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于查询mysql死锁、mysql怎么查死锁记录的信息别忘了在本站进行查找喔 。

    推荐阅读