如何查看mysql數據庫死鎖,MySQL查詢死鎖

本文目錄一覽:

如何查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數據庫中查詢表是否被鎖以及解鎖

1.查看錶被鎖狀態

2.查看造成死鎖的sql語句

3.查詢進程

4.解鎖(刪除進程)

5.查看正在鎖的事物  (8.0以下版本)

6.查看等待鎖的事物 (8.0以下版本)

怎麼統計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,輸入命令:

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

在MySQL客戶端下輸入命令:

show engine innodb status \G;

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

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

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/304334.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-01 11:05
下一篇 2025-01-01 11:05

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝數據庫方案

    本文將介紹在openeuler操作系統中安裝數據庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟件源 sudo…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • 數據庫第三範式會有刪除插入異常

    如果沒有正確設計數據庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係數據庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • leveldb和unqlite:兩個高性能的數據庫存儲引擎

    本文將介紹兩款高性能的數據庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28
  • Python怎麼導入數據庫

    Python是一種高級編程語言。它具有簡單、易讀的語法和廣泛的庫,讓它成為一個靈活和強大的工具。Python的數據庫連接類型可以多種多樣,其中包括MySQL、Oracle、Post…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • MySQL左連接索引不生效問題解決

    在MySQL數據庫中,經常會使用左連接查詢操作,但是左連接查詢中索引不生效的情況也比較常見。本文將從多個方面探討MySQL左連接索引不生效問題,並給出相應的解決方法。 一、索引的作…

    編程 2025-04-28

發表回復

登錄後才能評論