mysql死鎖怎么查詢,mysql死鎖排查及解決

mysql 怎么查看死鎖的記錄

1、查詢是否鎖表

創新互聯長期為近千家客戶提供的網站建設服務,團隊從業經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態環境。為鄂托克前企業提供專業的成都做網站、網站制作,鄂托克前網站改版等技術服務。擁有10余年豐富建站經驗和眾多成功案例,為您定制開發。

show OPEN TABLES where In_use 0;

查詢到相對應的進程 === 然后 kill id

2、查詢進程

show processlist

補充:

查看正在鎖的事務

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

查看等待鎖的事務

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

如何查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 * from master..sysprocesses where a.blocked =spid and blocked0)

union select spid,blocked from master..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) --要關閉進程的數據庫名

as

declare @sql nvarchar(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數據庫的死鎖信息

方法/步驟

使用終端或命令提示符登錄到MySQL,輸入命令:

mysql -h xxxx.xxx.xxx -P 3306 -u username -p password

在MySQL客戶端下輸入命令:

show engine innodb status \G;

在打印出來的信息中找到“LATEST DETECTED DEADLOCK”一節內容

分析其中的內容,我們就可以知道最近導致死鎖的事務有哪些

mysql 死鎖排查

一、show ENGINE INNODB status

查看死鎖位置,分析。

二、

首先解決死鎖可以從死鎖發生的條件入手,最容易解決的就是更改獲取資源的順序;

其次是避免長事務,讓事務執行的時間盡可能少,讓事務的覆蓋范圍盡可能小,長事務會導致并發度降低,且會有更多的SQL查 詢延遲;

給整個方法加事務是否是必須的?可以不加事務的盡量不加。

怎么統計mysql中有多少個死鎖?

1,查看數據庫的隔離級別:

mysql select @@tx_isolation;

2,去查看先當前庫的線程情況:

mysql show processlist;

沒有看到正在執行的慢SQL記錄線程,再去查看innodb的事務表INNODB_TRX,看下里面是否有正在鎖定的事務線程,看看ID是否在show full processlist里面的sleep線程中,如果是,就證明這個sleep的線程事務一直沒有commit或者rollback而是卡住了,我們需要手動kill掉。

mysql SELECT * FROM information_schema.INNODB_TRX;

如果有記錄,則找到trx_mysql_thread_id這個字段對應的id, 將其kill掉。假如id=100

mysql-kill 100

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表示不自動提交。

如果你發現自己的數據庫autocommit=0,將它改正吧。

解除死鎖的兩種方法:

(1)終止(或撤銷)進程。終止(或撤銷)系統中的一個或多個死鎖進程,直至打破循環環路,使系統從死鎖狀態中解除出來。

(2)搶占資源。從一個或多個進程中搶占足夠數量的資源,分配給死鎖進程,以打破死鎖狀態。

分享標題:mysql死鎖怎么查詢,mysql死鎖排查及解決
瀏覽路徑:http://m.kartarina.com/article40/dsespeo.html

成都網站建設公司_創新互聯,為您提供企業網站制作網站營銷定制網站自適應網站靜態網站用戶體驗

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

小程序開發
主站蜘蛛池模板: 久久国产精品无码HDAV| 亚洲AV中文无码乱人伦| 五十路熟妇高熟无码视频| 亚洲精品无码国产片| 精品亚洲av无码一区二区柚蜜| 精品久久久久久无码中文野结衣| 无码人妻精品一区二区三区9厂| 国产亚洲精久久久久久无码| 免费无码VA一区二区三区| 人妻少妇精品无码专区动漫 | 亚洲日韩激情无码一区| 台湾无码一区二区| 亚洲AV无码成H人在线观看| 亚洲VA中文字幕不卡无码| 成人午夜精品无码区久久| 国产成年无码久久久久下载| 亚洲VA中文字幕不卡无码| 亚洲精品人成无码中文毛片| 亚洲成av人无码亚洲成av人| 日韩AV无码中文无码不卡电影| 日韩中文无码有码免费视频 | 中文无码字幕中文有码字幕| 国产v亚洲v天堂无码网站| 无码精品A∨在线观看无广告| 亚洲av专区无码观看精品天堂| 亚洲AV永久纯肉无码精品动漫| 成人无码区免费视频观看| 人妻系列无码专区无码中出| 亚洲av永久无码精品秋霞电影影院| 免费无码专区毛片高潮喷水| 亚洲爆乳精品无码一区二区| 67194成l人在线观看线路无码| 久久亚洲精品无码| 中日韩亚洲人成无码网站| 亚洲中文字幕无码久久2017| 中文字幕无码av激情不卡 | 久久国产加勒比精品无码| 亚洲无码在线播放| 久久精品九九热无码免贵| 亚洲av无码av制服另类专区| 亚洲AV日韩AV永久无码久久|