具體步驟如下:
創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)上城,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220
1.首先使用下面的命令,將有關(guān)的跟蹤標(biāo)志啟用。
SQL codeDBCC TRACEON (3605,1204,1222,-1)
說(shuō)明:
3605
將DBCC的結(jié)果輸出到錯(cuò)誤日志。
1204 返回參與死鎖的鎖的資源和類型,以及受影響的當(dāng)前命令。
1222
返回參與死鎖的鎖的資源和類型,以及使用了不符合任何 XSD 架構(gòu)的 XML 格式的受影響的當(dāng)前命令(比1204更進(jìn)一步,SQL
2005及以上可用)。
-1 以全局方式打開(kāi)指定的跟蹤標(biāo)記。
以上跟蹤標(biāo)志作用域都是全局,即在SQL
Server運(yùn)行過(guò)程中,會(huì)一直發(fā)揮作用,直到SQL Server重啟。
如 果要確保SQL Server在重啟后自動(dòng)開(kāi)啟這些標(biāo)志,可以在SQL
Server服務(wù)啟動(dòng)選項(xiàng)中,使用 /T 啟動(dòng)選項(xiàng)指定跟蹤標(biāo)志在啟動(dòng)期
間設(shè)置為開(kāi)。(位于SQL Server配置管理器-SQL
Server服務(wù)-SQL Server-屬性-高級(jí)-啟動(dòng)參數(shù))
在運(yùn)行上面的語(yǔ)句后,當(dāng)SQL
Server中發(fā)生死鎖時(shí),已經(jīng)可以在錯(cuò)誤日志中看到了,但還不夠直觀(和其它信息混在一起)。(SSMS
- SQL Server實(shí)例 -
管理 - SQL Server日志)
2.建表,存放死鎖記錄
SQL codeUSE [Cole] --Cole是我的示例數(shù)據(jù)庫(kù),你可以根據(jù)實(shí)際情況修改。 GO
CREATE TABLE DeadLockLog ( id int IDENTITY (1, 1) NOT NULL, LogDate DATETIME, ProcessInfo VARCHAR(10), ErrorText VARCHAR(MAX) )
GO
3.建立JOB
新建一個(gè)JOB(假設(shè)名稱為DeadLockJob),在"步驟"中新建一步驟,隨便寫(xiě)一個(gè)步驟名稱,數(shù)據(jù)庫(kù)為"Cole",在"命令"欄中輸入以下語(yǔ)句:
SQL code--新建臨時(shí)表 IF OBJECT_ID('tempdb.dbo.#ErrorLog') IS Not Null
DROP TABLE #ErrorLog
CREATE TABLE #ErrorLog (Id int IDENTITY (1, 1) NOT NULL, a DATETIME, b VARCHAR(10), c VARCHAR(MAX)) --將當(dāng)前日志記錄插入臨時(shí)表
INSERT INTO #ErrorLog EXEC master.dbo.sp_readerrorlog --將死鎖信息插入用戶表
insert DeadLockLog
select a, b, c from #ErrorLog where id = (select MAX(id) from #ErrorLog WHERE c Like '%Deadlock encountered%')
DROP TABLE #ErrorLog
4.新建警報(bào)
在"新建警報(bào)"窗體的"常規(guī)"選項(xiàng)卡中,進(jìn)行以下設(shè)置:
名稱:可根據(jù)實(shí)際自行命名,這里我用DeadLockAlert
類型:選擇"SQL
Server性能條件警報(bào)"
對(duì)象:SQLServer:Locks
計(jì)數(shù)器:Number of
Deadlocks/sec
實(shí)例:_Total
計(jì)數(shù)器滿足以下條件時(shí)觸發(fā)警報(bào):高于
值:0
在"響應(yīng)"選項(xiàng)卡中,選中"執(zhí)行作業(yè)",并選擇步驟3中我們新建的作業(yè)(即DeadlockJob)
到這里為止,我們已經(jīng)完成了全部步驟,以后,你就可以隨時(shí)查詢DeadLockLog表,來(lái)顯示死鎖信息了。
死鎖檢測(cè)
use master
Select * from sysprocesses where blocked0
--找到SPID
exec sp_lock
--根據(jù)SPID找到OBJID
select object_name(85575343)
--根據(jù)OBJID找到表名
sqlserver的數(shù)據(jù)庫(kù)文件是什么?
以 .MDF結(jié)尾的是數(shù)據(jù)庫(kù)文件,以 .LDF結(jié)尾的是日志文件 ;
在企業(yè)管理器中選擇您的要導(dǎo)入數(shù)據(jù)的數(shù)據(jù)庫(kù),然后點(diǎn)擊右鍵,選擇所有任務(wù)-附加數(shù)據(jù)庫(kù)-選擇MDF文件,就可以了 ;
對(duì)于數(shù)據(jù)庫(kù)的還原,最好的備份數(shù)據(jù)庫(kù)后,再還原數(shù)據(jù)庫(kù)。可以使用定期備份;
查看被鎖表:
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'
spid 鎖表進(jìn)程
tableName 被鎖表名
SQL SERVER 通過(guò)鎖管理器自動(dòng)發(fā)現(xiàn)和解決死鎖。在 SQL SERVER 中 Lock Monitor 管理線程(spid=4)每 5 秒鐘檢查一次系統(tǒng)中是否存在死鎖,同時(shí)也會(huì)使用死鎖發(fā)現(xiàn)計(jì)數(shù)器(Deadlock Detection Counter)控制檢查死鎖的頻率。
死鎖發(fā)現(xiàn)計(jì)數(shù)器初始值為 3,當(dāng)發(fā)現(xiàn)死鎖時(shí)被重新設(shè)置為 3,當(dāng)沒(méi)有發(fā)現(xiàn)死鎖時(shí)此值減 1。如果死鎖發(fā)現(xiàn)計(jì)數(shù)器大于 0,則在每次有進(jìn)程獲取鎖被阻止時(shí),鎖管理器都要求 Lock Monitor 線程檢查死鎖;而如果計(jì)數(shù)器等于 0,則在每次有進(jìn)程獲取鎖被阻止時(shí),鎖管理器不會(huì)要求 Lock Monitor 線程檢查死鎖,只是每 5 秒鐘檢查一次。
Lock Monitor 線程通過(guò)檢查鎖的等待列表發(fā)現(xiàn)保持鎖的進(jìn)程和等待鎖的進(jìn)程間的關(guān)系,從而發(fā)現(xiàn)死鎖。
詳細(xì)步驟如下:
1、點(diǎn)擊【新建查詢】按鈕,打開(kāi)SQL命令編輯框,對(duì)數(shù)據(jù)庫(kù)表的操作以及維護(hù)都可以通過(guò)編輯SQL命令實(shí)現(xiàn)。
2、在編輯框內(nèi)編輯創(chuàng)建數(shù)據(jù)庫(kù)表的代碼,確認(rèn)代碼無(wú)誤后,單擊【執(zhí)行】按鈕,創(chuàng)建數(shù)據(jù)表。
3、創(chuàng)建數(shù)據(jù)表的源代碼如下:
use test go
if exists(select name from sys.tables where name='Student')
drop table Student go
create table Student
(sname nchar(10) primary key,
sex nchar(2) not null,
bir datetime)
數(shù)據(jù)庫(kù)管理系統(tǒng),database management system,簡(jiǎn)稱dbms,是一種操縱和管理數(shù)據(jù)庫(kù)的大型軟件,用于建立、使用和維護(hù)數(shù)據(jù)庫(kù)。用戶通過(guò)dbms訪問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù),數(shù)據(jù)庫(kù)管理員也通過(guò)dbms進(jìn)行數(shù)據(jù)庫(kù)的維護(hù)工作。它可使多個(gè)應(yīng)用程序和用戶用不同的方法在同時(shí)或不同時(shí)刻去建立,修改和詢問(wèn)數(shù)據(jù)庫(kù)。
提供數(shù)據(jù)定義語(yǔ)言(ddl)。用它書(shū)寫(xiě)的數(shù)據(jù)庫(kù)模式被翻譯為內(nèi)部表示。數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)、完整性約束和物理儲(chǔ),存結(jié)構(gòu)保存在內(nèi)部的數(shù)據(jù)字典中。數(shù)據(jù)庫(kù)的各種數(shù)據(jù)操作(如查找、修改、插入和刪除等)和數(shù)據(jù)庫(kù)的維護(hù)管理都是以數(shù)據(jù)庫(kù)模式為依據(jù)的。
-- 找到臨時(shí)表的記錄數(shù)select@intCountProperties =
Count(*),@intCounter = 1
from #tmp_lock_who
IF @@ERROR0
RETURN @@ERROR
if @intCountProperties=0
select '現(xiàn)在沒(méi)有阻塞和死鎖信息' as message
-- 循環(huán)開(kāi)始
while @intCounter = @intCountPropertiesbegin
-- 取第一條記錄select@spid = spid,@bl =bl
from #tmp_lock_who where id = @intCounterbegin
if @spid =0select'引起數(shù)據(jù)庫(kù)死鎖的是: '+ CAST(@bl AS VARCHAR(10)) + '進(jìn)程號(hào),其執(zhí)行的SQL語(yǔ)法如下'elseselect'進(jìn)程號(hào)SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '進(jìn)程號(hào)SPID:'+ CAST(@bl
AS VARCHAR(10)) +'阻塞,其當(dāng)前進(jìn)程執(zhí)行的SQL語(yǔ)法如下'
DBCC INPUTBUFFER (@bl )end-- 循環(huán)指針下移