博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SqlServer定时备份数据库和定时杀死数据库死锁解决
阅读量:6364 次
发布时间:2019-06-23

本文共 4340 字,大约阅读时间需要 14 分钟。

上周五组长对我说了一句要杀死数据库的死锁进程,有时候同一时刻不停写入数据库会造成这种情况的发生,因为自己对数据库不是很熟悉,突然组长说了我也就决定一定要倒腾一下,不然自己怎么提高呢?现在不研究,说不定下次还是要研究呢,倒腾出来了就可以在下次用到了,后来组长又补了一句:"还有定时备份数据库的问题要解决",说干就干。

PS:Sqlserver 2008 R2,windows 8 64位

1.备份数据库

 因为要备份,我们就要用到Sqlserver的代理,默认数据库的代理是不开启的。需要我们手动开启的。

 

执行备份数据库脚本,现在将脚本公布,其实将这一段代码中需要保存的文件路径和数据库名称替换一下就可以实现备份了。但是还没有达到定时备份的目的 

--自动备份并保存最近5天的SQL数据库作业脚本DECLARE @filename VARCHAR(255)DECLARE @date DATETIMESELECT @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 INITGODECLARE @OLDDATE DATETIMESELECT @OLDDATE=GETDATE()-5EXECUTE master.dbo.xp_delete_file 0,N'G:\存放位置',N'bak',@olddate,1

  

  2.定时备份指定数据库

  刚刚开启了Sqlserver代理服务,其实我自己的理解就是一个定时器,不停的执行一些操作者分配给他的任务,有点像闹钟的感觉,看我的演示步骤

   第一步 

 

   第二步 

 

   第三步

 第四步

 第五步

 上面的步骤就是完成了定时备份指定数据库的功能!

 **************************************************************************

1.杀死数据库死锁进程

接下来介绍一些杀死数据库死锁进程的方法

下午折腾了半天找了很多的文章看了一下,发现很多都是使用到了master中的sys.sysprocesses表(http://msdn.microsoft.com/zh-cn/library/ms179881(SQL.90).aspx)这里附上msdn对这个表的解释,不懂的可以参考看看这里面的每个表字段的含义。

参考了网上的意见,大部分都是写一个存储过程在master数据库中,然后使用作业的方式定时杀死死锁进程的,觉得这个方法可行!

下面是存储过程SQL语句

--数据库死锁解决,结合作业(百度)实现定时清除数据库死锁进程,存储过程放在master数据库中USE masterGOSET QUOTED_IDENTIFIER ONGOSET ANSI_NULLS ONGOCREATE PROCEDURE sp_who_lockAS    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    ENDgo

  上面sql语句执行完成也就在master数据库生成了存储过程,调用的代码很简单

--执行EXEC sp_who_lockGOSET QUOTED_IDENTIFIER OFFGOSET ANSI_NULLS ONGO

 调用完成之后就可以杀死数据库当中的所有死锁进程

   题外话:如何判断那些进程是否是死锁进程,这个是关键点,在msdn中对sys.sysprocesses表的有一个字段blocked这个字段,取出所有大于0的就是数据库的死锁进程数据,然后使用KILL+SPID(进程ID)执行就可以杀死死锁进程,主要思想就是这些。

 2.定时杀死数据库死锁进程

 对于定时杀死数据库死锁进程,这里有两点需要注意

1.执行的顺序,现在master数据库创建存储过程,然后创建作业

2.作业的执行代码,执行代码是调用杀死死锁进程的存储过程(调用存储过程的sql语句,不能包含删除存储过程(DROP xxx)这样的语句是不行,到时候作业第一次执行后,第二次就要报错了,就永远执行不成功

第一步

需要执行上面的杀死死锁进程的存储过程,只有master数据库中存在这个存储过程,才可以以作业的方式调用这个存储过程,否则就是调用失败★

第二步

创建一个新的作业,将刚刚的调用存储过程的SQL语句放入到新建作业=>步骤选项=>命令,中就可以了。最后一步执行计划自己根据实际情况进行设置  

关于Sqlserver数据库的两个难点也在这个下午被我自己吸收了。将来碰到类似的问题也可以轻松应对了,如果大家觉得有帮助可以帮小弟推荐一下哦!

如果文章中有错误的地方,大家可以联系我的qq:707055073

我的群:152652959

版权所有,违法必究。

转载请说明原文链接

转载于:https://www.cnblogs.com/wohexiaocai/p/3693822.html

你可能感兴趣的文章
js Date操作
查看>>
判断用户密码是否在警告期内(学习练习)
查看>>
sp_executesql的执行计划会被重用(转载)
查看>>
禅道项目管理软件插件开发
查看>>
Linux系统各发行版镜像下载
查看>>
JS获取键盘按下的键值event.keyCode,event.charCode,event.which的兼容性
查看>>
查看ORACLE 数据库及表信息
查看>>
腾讯、百度、阿里面试经验—(1) 腾讯面经
查看>>
Codeforces Round #374 (Div. 2) D. Maxim and Array 贪心
查看>>
HTML DOM 教程Part1
查看>>
GBDT的基本原理
查看>>
MySQL修改root密码的多种方法(转)
查看>>
MongoDB 基础命令——数据库表的增删改查——遍历操作表中的记录
查看>>
.NET Core 跨平台发布(dotnet publish)
查看>>
Activity入门(一)
查看>>
CentOS下如何从vi编辑器插入模式退出到命令模式
查看>>
Mysql索引的类型
查看>>
Eclipse debug模式 总是进入processWorkerExit
查看>>
Nginx的https配置记录以及http强制跳转到https的方法梳理
查看>>
[每天五分钟,备战架构师-1]操作系统的类型和结构
查看>>