上週五組長對我說了一句要殺死數據庫的死鎖進程,有時候同一時刻不停寫入數據庫會形成這種狀況的發生,由於本身對數據庫不是很熟悉,忽然組長說了我也就決定必定要倒騰一下,否則本身怎麼提升呢?如今不研究,說不定下次仍是要研究呢,倒騰出來了就能夠在下次用到了,後來組長又補了一句:"還有定時備份數據庫的問題要解決",說幹就幹。sql
PS:Sqlserver 2008 R2,windows 8 64位數據庫
1.備份數據庫windows
由於要備份,咱們就要用到Sqlserver的代理,默認數據庫的代理是不開啓的。須要咱們手動開啓的。spa
執行備份數據庫腳本,如今將腳本公佈,其實將這一段代碼中須要保存的文件路徑和數據庫名稱替換一下就能夠實現備份了。可是尚未達到定時備份的目的 3d
--自動備份並保存最近5天的SQL數據庫做業腳本 DECLARE @filename VARCHAR(255) DECLARE @date DATETIME SELECT @date=GETDATE() SELECT @filename = 'G:\存放位置\數據庫名稱-'+CAST(DATEPART(yyyy,@date) as varchar)+'-'+CAST(DATEPART(mm,@date) as varchar)+'-'+CAST(DATEPART(dd,@date) as varchar)+'.bak' BACKUP DATABASE [數據庫名稱] TO DISK = @filename WITH INIT GO DECLARE @OLDDATE DATETIME SELECT @OLDDATE=GETDATE()-5 EXECUTE master.dbo.xp_delete_file 0,N'G:\存放位置',N'bak',@olddate,1
2.定時備份指定數據庫代理
剛剛開啓了Sqlserver代理服務,其實我本身的理解就是一個定時器,不停的執行一些操做者分配給他的任務,有點像鬧鐘的感受,看個人演示步驟指針
第一步 server
第二步 blog
第三步進程
第四步
第五步
上面的步驟就是完成了定時備份指定數據庫的功能!
**************************************************************************
1.殺死數據庫死鎖進程
接下來介紹一些殺死數據庫死鎖進程的方法
下午折騰了半天找了不少的文章看了一下,發現不少都是使用到了master中的sys.sysprocesses表(http://msdn.microsoft.com/zh-cn/library/ms179881(SQL.90).aspx)這裏附上msdn對這個表的解釋,不懂的能夠參考看看這裏面的每一個表字段的含義。
參考了網上的意見,大部分都是寫一個存儲過程在master數據庫中,而後使用做業的方式定時殺死死鎖進程的,以爲這個方法可行!
下面是存儲過程SQL語句
--數據庫死鎖解決,結合做業(百度)實現定時清除數據庫死鎖進程,存儲過程放在master數據庫中 USE master GO SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO CREATE PROCEDURE sp_who_lock AS BEGIN DECLARE @spid INT , @bl INT , @intTransactionCountOnEntry INT , @intRowcount INT , @intCountProperties INT , @intCounter INT CREATE TABLE #tmp_lock_who ( id INT IDENTITY(1, 1) , spid SMALLINT , bl SMALLINT ) IF @@ERROR <> 0 RETURN @@ERROR INSERT INTO #tmp_lock_who ( spid, bl ) SELECT 0, blocked FROM ( SELECT * FROM sys.sysprocesses WHERE blocked > 0 ) a WHERE NOT EXISTS ( SELECT * FROM ( SELECT * FROM sys.sysprocesses WHERE blocked > 0 ) b WHERE a.blocked = spid ) UNION SELECT spid, blocked FROM sys.sysprocesses WHERE blocked > 0 IF @@ERROR <> 0 RETURN @@ERROR -- 找到臨時表的記錄數 SELECT @intCountProperties = COUNT(*), @intCounter = 1 FROM #tmp_lock_who IF @@ERROR <> 0 RETURN @@ERROR IF @intCountProperties = 0 SELECT N'如今沒有阻塞和死鎖信息' AS message -- 循環開始 WHILE @intCounter <= @intCountProperties BEGIN -- 取第一條記錄 SELECT @spid = spid, @bl = bl FROM #tmp_lock_who WHERE Id = @intCounter BEGIN IF @spid = 0 SELECT N'引發數據庫死鎖的是: ' + CAST(@bl AS VARCHAR(10)) + N'進程號,其執行的SQL語法以下' ELSE SELECT N'進程號SPID:' + CAST(@spid AS VARCHAR(10)) + N'被進程號SPID:' + CAST(@bl AS VARCHAR(10)) N'阻塞,其當前進程執行的SQL語法以下' DBCC INPUTBUFFER (@bl ) END -- 循環指針下移 SET @intCounter = @intCounter + 1 END DROP TABLE #tmp_lock_who RETURN 0 END go
上面sql語句執行完成也就在master數據庫生成了存儲過程,調用的代碼很簡單
--執行 EXEC sp_who_lock GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
調用完成以後就能夠殺死數據庫當中的全部死鎖進程
題外話:如何判斷那些進程是不是死鎖進程,這個是關鍵點,在msdn中對sys.sysprocesses表的有一個字段blocked這個字段,取出全部大於0的就是數據庫的死鎖進程數據,而後使用KILL+SPID(進程ID)執行就能夠殺死死鎖進程,主要思想就是這些。
2.定時殺死數據庫死鎖進程
對於定時殺死數據庫死鎖進程,這裏有兩點須要注意
1.執行的順序,如今master數據庫建立存儲過程,而後建立做業
2.做業的執行代碼,執行代碼是調用殺死死鎖進程的存儲過程(調用存儲過程的sql語句,不能包含刪除存儲過程(DROP xxx)這樣的語句是不行,到時候做業第一次執行後,第二次就要報錯了,就永遠執行不成功
第一步
須要執行上面的殺死死鎖進程的存儲過程,只有master數據庫中存在這個存儲過程,才能夠以做業的方式調用這個存儲過程,不然就是調用失敗★
第二步
建立一個新的做業,將剛剛的調用存儲過程的SQL語句放入到新建做業=>步驟選項=>命令,中就能夠了。最後一步執行計劃本身根據實際狀況進行設置
關於Sqlserver數據庫的兩個難點也在這個下午被我本身吸取了。未來碰到相似的問題也能夠輕鬆應對了,若是你們以爲有幫助能夠幫小弟推薦一下哦!
若是文章中有錯誤的地方,你們能夠聯繫個人qq:707055073
個人羣:152652959
版權全部,違法必究。
轉載請說明原文連接