查詢死鎖進(jìn)程
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、成都做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、廈門ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的廈門網(wǎng)站制作公司
采用如下存儲過程來查詢數(shù)據(jù)中當(dāng)前造成死鎖的進(jìn)程。
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 '引起數(shù)據(jù)庫死鎖的是: '+ CAST(@spid AS VARCHAR(10)) + '進(jìn)程號,其執(zhí)行的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))+ '進(jìn)程號,其執(zhí)行的SQL語法如下'
else
select '進(jìn)程號SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '進(jìn)程號SPID:'+ CAST(@blk AS VARCHAR(10)) +'阻塞,其當(dāng)前進(jìn)程執(zhí)行的SQL語法如下'
dbcc inputbuffer(@spid)
dbcc inputbuffer(@blk)
set @index=@index+1
end
end
drop table #temp_who_lock
return 0
end
GO
--執(zhí)行該存儲過程
exec sp_who_lock
補(bǔ)充:
一、產(chǎn)生死鎖的原因
在SQL Server中,阻塞更多的是產(chǎn)生于實現(xiàn)并發(fā)之間的隔離性。為了使得并發(fā)連接所做的操作之間的影響到達(dá)某一期望值而對資源人為的進(jìn)行加鎖(鎖本質(zhì)其實可以看作是一個標(biāo)志位)。當(dāng)一個連接對特定的資源進(jìn)行操作時,另一個連接同時對同樣的資源進(jìn)行操作就會被阻塞,阻塞是死鎖產(chǎn)生的必要條件。
二、如何避免死鎖
1.使用事務(wù)時,盡量縮短事務(wù)的邏輯處理過程,及早提交或回滾事務(wù);
2.設(shè)置死鎖超時參數(shù)為合理范圍,如:3分鐘-10分種;超過時間,自動放棄本次操作,避免進(jìn)程懸掛;
3.優(yōu)化程序,檢查并避免死鎖現(xiàn)象出現(xiàn);
4.對所有的腳本和SP都要仔細(xì)測試,在正是版本之前;
5.所有的SP都要有錯誤處理(通過@error);
6.一般不要修改SQL SERVER事務(wù)的默認(rèn)級別。不推薦強(qiáng)行加鎖。
三、處理死鎖
1、最簡單的處理死鎖的方法就是重啟服務(wù)。
2、根據(jù)指定的死鎖進(jìn)程ID進(jìn)行處理
根據(jù)第二步查詢到的死鎖進(jìn)行,大致分析造成死鎖的原因,并通過如下語句釋放該死鎖進(jìn)程
kill pid --pid為查詢出來的死鎖進(jìn)程號
3、通過存儲過程殺掉某個庫下面的所有死鎖進(jìn)程和鎖
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) --要關(guān)閉進(jìn)程的數(shù)據(jù)庫名
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”為處理的數(shù)據(jù)庫名稱
exec sp_killspid 'db_name'
1.查看表是否被鎖:
(1)直接在mysql命令行執(zhí)行:showengineinnodbstatus\G。
(2)查看造成死鎖的sql語句,分析索引情況,然后優(yōu)化sql。
(3)然后showprocesslist,查看造成死鎖占用時間長的sql語句。
(4)showstatuslike‘%lock%。
2.查看表被鎖狀態(tài)和結(jié)束死鎖步驟:
(1)查看表被鎖狀態(tài):showOPENTABLESwhereIn_use0;這個語句記錄當(dāng)前鎖表狀態(tài)。
(2)查詢進(jìn)程:showprocesslist查詢表被鎖進(jìn)程;查詢到相應(yīng)進(jìn)程killid。
(3)分析鎖表的SQL:分析相應(yīng)SQL,給表加索引,常用字段加索引,表關(guān)聯(lián)字段加索引。
(4)查看正在鎖的事物:SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCKS。
(5)查看等待鎖的事物:SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCK_WAITS。
擴(kuò)展資料
MySQL鎖定狀態(tài)查看命令:
Checkingtable:正在檢查數(shù)據(jù)表(這是自動的)。
Closingtables:正在將表中修改的數(shù)據(jù)刷新到磁盤中,同時正在關(guān)閉已經(jīng)用完的表。這是一個很快的操作,如果不是這樣的話,就應(yīng)該確認(rèn)磁盤空間是否已經(jīng)滿了或者磁盤是否正處于重負(fù)中。
ConnectOut:復(fù)制從服務(wù)器正在連接主服務(wù)器。
Copyingtotmptableondisk:由于臨時結(jié)果集大于tmp_table_size,正在將臨時表從內(nèi)存存儲轉(zhuǎn)為磁盤存儲以此節(jié)省內(nèi)存。
Creatingtmptable:正在創(chuàng)建臨時表以存放部分查詢結(jié)果。
deletingfrommaintable:服務(wù)器正在執(zhí)行多表刪除中的第一部分,剛刪除第一個表。
deletingfromreferencetables:服務(wù)器正在執(zhí)行多表刪除中的第二部分,正在刪除其他表的記錄。
Flushingtables:正在執(zhí)行FLUSHTABLES,等待其他線程關(guān)閉數(shù)據(jù)表。
Killed:發(fā)送了一個kill請求給某線程,那么這個線程將會檢查kill標(biāo)志位,同時會放棄下一個kill請求。MySQL會在每次的主循環(huán)中檢查kill標(biāo)志位,不過有些情況下該線程可能會過一小段才能死掉。如果該線程程被其他線程鎖住了,那么kill請求會在鎖釋放時馬上生效。
Locked:被其他查詢鎖住了。
Sendingdata:正在處理SELECT查詢的記錄,同時正在把結(jié)果發(fā)送給客戶端。
Sortingforgroup:正在為GROUPBY做排序。
Sortingfororder:正在為ORDERBY做排序。
Openingtables:這個過程應(yīng)該會很快,除非受到其他因素的干擾。例如,在執(zhí)ALTERTABLE或LOCKTABLE語句行完以前,數(shù)據(jù)表無法被其他線程打開。正嘗試打開一個表。
Removingduplicates:正在執(zhí)行一個SELECTDISTINCT方式的查詢,但是MySQL無法在前一個階段優(yōu)化掉那些重復(fù)的記錄。因此,MySQL需要再次去掉重復(fù)的記錄,然后再把結(jié)果發(fā)送給客戶端。
Reopentable:獲得了對一個表的鎖,但是必須在表結(jié)構(gòu)修改之后才能獲得這個鎖。已經(jīng)釋放鎖,關(guān)閉數(shù)據(jù)表,正嘗試重新打開數(shù)據(jù)表。
Repairbysorting:修復(fù)指令正在排序以創(chuàng)建索引。
Repairwithkeycache:修復(fù)指令正在利用索引緩存一個一個地創(chuàng)建新索引。它會比Repairbysorting慢些。
Searchingrowsforupdate:正在講符合條件的記錄找出來以備更新。它必須在UPDATE要修改相關(guān)的記錄之前就完成了。
Sleeping:正在等待客戶端發(fā)送新請求。
Systemlock:正在等待取得一個外部的系統(tǒng)鎖。如果當(dāng)前沒有運行多個mysqld服務(wù)器同時請求同一個表,那么可以通過增加--skip-external-locking參數(shù)來禁止外部系統(tǒng)鎖。
Upgradinglock:INSERTDELAYED正在嘗試取得一個鎖表以插入新記錄。
Updating:正在搜索匹配的記錄,并且修改它們。
UserLock:正在等待GET_LOCK()。
Waitingfortables:該線程得到通知,數(shù)據(jù)表結(jié)構(gòu)已經(jīng)被修改了,需要重新打開數(shù)據(jù)表以取得新的結(jié)構(gòu)。然后,為了能的重新打開數(shù)據(jù)表,必須等到所有其他線程關(guān)閉這個表。
waitingforhandlerinsert:INSERTDELAYED已經(jīng)處理完了所有待處理的插入操作,正在等待新的請求。
如果要查詢服務(wù)器上正在跑哪些查詢進(jìn)程,使用show processlist;
如果要查詢當(dāng)?shù)啬男┻M(jìn)程正在和mysql交互,可以使用操作系統(tǒng)自帶的netstat等工具查看mysql所在的IP和3306端口
ps
-ef|grep
mysql
可以看到是否有mysql進(jìn)程,如果有mysqld這行(一般會有2行以上)則表示正常運行
也可以mysql
-u
root
-p登陸試試看能不能登陸
如果沒有啟動,service
mysqld
start啟動下
可以先使用 uptime 命令查看 CPU 平均負(fù)載
那個 2 users 表示用戶連接數(shù),指的是總連接數(shù)。
那個 load average 就是系統(tǒng)平均負(fù)載,1 分鐘、5 分鐘、15 分鐘系統(tǒng)負(fù)載的平均值。
指的是一段時間內(nèi) CPU 正在處理以及等待 CPU 處理的進(jìn)程數(shù)之和的統(tǒng)計信息,也就是 CPU 使用隊列的長度的統(tǒng)計信息。這個數(shù)字越小越好。
然后再用 vmstat 命令看下 CPU 是否飽和
這里面的 r 就是等待 CPU 的進(jìn)程數(shù),可以用來判定 CPU 是否飽和,當(dāng) r 值高于 CPU 數(shù)時,就意味著飽和了。
一、用phpMyAdmin進(jìn)行查看
二、用命令行的SHOW 語句
直接在命令行下登陸MySQL運行SHOW STATUS;查詢語句
同樣的語句還有SHOW VARIABLES;,SHOW STATUS是查看MySQL運行情況,和上面那種通過pma查看到的信息基本類似。
SHOW VARIABLES
SHOW VARIABLES是查看MySQL的配置參數(shù),還可以使用類似SHOW VARIABLES LIKE ‘Key%’
SHOW PROCESSLIST
SHOW PROCESSLIST是查看當(dāng)前正在進(jìn)行的進(jìn)程,對于有鎖表等情況的排查很有用處。一般情況下,打開MySQL的慢查詢記錄同樣有利于排查。
SHOW OPEN TABLES
SHOW OPEN TABLES是顯示當(dāng)前已經(jīng)被打開的表列表。
三、用MySQL自帶工具mysqladmin 查看
使用MySQL自帶的mysqladmin 工具查看status,使用以下命令
mysqladmin -uroot -p密碼 status
顯示的結(jié)果如下:
Uptime: 502963 Threads: 2 Questions: 8561820 Slow queries: 734681 Opens: 553
45 Flush tables: 1 Open tables: 85 Queries per second avg: 17.023
另外可以添加 -i 5 參數(shù),讓其每五秒自動刷新之。
mysqladmin -uroot -p密碼 status -i 5
mysqladmin extended-status
同樣的可以使用mysqladmin -uroot -p密碼 extended-status來查看更多的MySQL運行信息,這種方式和第一種查看的信息基本一樣。
網(wǎng)站標(biāo)題:mysql怎么查詢進(jìn)程 linux查看MySQL進(jìn)程
文章URL:http://aaarwkj.com/article6/dooojig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、網(wǎng)站營銷、虛擬主機(jī)、面包屑導(dǎo)航、小程序開發(fā)、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)