上周五组长对我说了一句要杀死数据库的死锁进程,有时候同一时刻不停写入数据库会形成这种状况的发生,由于本身对数据库不是很熟悉,忽然组长说了我也就决定必定要倒腾一下,否则本身怎么提升呢?如今不研究,说不定下次仍是要研究呢,倒腾出来了就能够在下次用到了,后来组长又补了一句:"还有定时备份数据库的问题要解决",说干就干。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
版权全部,违法必究。
转载请说明原文连接