当前位置:网站首页>SqlServer定时备份数据库和定时杀死数据库死锁解决
SqlServer定时备份数据库和定时杀死数据库死锁解决
2022-07-05 10:12:00 【全栈程序员站长】
上周五组长对我说了一句要杀死数据库的死锁进程,有时候同一时刻不停写入数据库会造成这种情况的发生,因为自己对数据库不是很熟悉,突然组长说了我也就决定一定要倒腾一下,不然自己怎么提高呢?现在不研究,说不定下次还是要研究呢,倒腾出来了就可以在下次用到了,后来组长又补了一句:”还有定时备份数据库的问题要解决”,说干就干
PS:Sqlserver 2008 R2,windows 8 64位
1.备份数据库
因为要备份,我们就要用到Sqlserver的代理,默认数据库的代理是不开启的。需要我们手动开启的。
执行备份数据库脚本,现在将脚本公布,其实将这一段代码中需要保存的文件路径和数据库名称替换一下就可以实现备份了。但是还没有达到定时备份的目的
--自动备份并保存最近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,12.定时备份指定数据库
刚刚开启了Sqlserver代理服务,其实我自己的理解就是一个定时器,不停的执行一些操作者分配给他的任务,有点像闹钟的感觉,看我的演示步骤
第一步
第二步
第三步
第四步
第五步
上面的步骤就是完成了定时备份指定数据库的功能!
**************************************************************************
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数据库的两个难点也在这个下午被我自己吸收了。将来碰到类似的问题也可以轻松应对了
版权所有,违法必究。
转载请说明原文链接
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/109840.html原文链接:https://javaforall.cn
边栏推荐
- How did automated specification inspection software develop?
- Livedata interview question bank and answers -- 7 consecutive questions in livedata interview~
- @SerializedName注解使用
- WorkManager的学习二
- Click the picture in the mobile browser and the picture will not pop up
- Interview: how does the list duplicate according to the attributes of the object?
- ConstraintLayout的流式布局Flow
- @Jsonadapter annotation usage
- flink cdc不能监听mysql日志,大家遇到过这个问题吧?
- 5g NR system architecture
猜你喜欢

Constrained layout flow

Constraintlayout officially provides rounded imagefilterview

【 conseils 】 obtenir les valeurs des axes X et y de la fonction cdfplot dans MATLAB

一个程序员的职业生涯到底该怎么规划?

Today in history: the first e-book came out; The inventor of magnetic stripe card was born; The pioneer of handheld computer was born

【小技巧】獲取matlab中cdfplot函數的x軸,y軸的數值

Have you learned to make money in Dingding, enterprise micro and Feishu?

自动化规范检查软件如何发展而来?

程序员如何活成自己喜欢的模样?

Detailed explanation of the use of staticlayout
随机推荐
《剑来》语句摘录(七)
"Everyday Mathematics" serial 58: February 27
请问大佬们 有遇到过flink cdc mongdb 执行flinksql 遇到这样的问题的么?
flink cdc不能监听mysql日志,大家遇到过这个问题吧?
5G NR系统架构
Write double click event
“军备竞赛”时期的对比学习
【Vite】1371- 手把手开发 Vite 插件
学习笔记4--高精度地图关键技术(下)
如何判断线程池已经执行完所有任务了?
AtCoder Beginner Contest 258「ABCDEFG」
请问postgresql cdc 怎么设置单独的增量模式呀,debezium.snapshot.mo
《天天数学》连载58:二月二十七日
Click the picture in the mobile browser and the picture will not pop up
Singleton mode encapsulates activity management class
SQL Server 监控统计阻塞脚本信息
【 conseils 】 obtenir les valeurs des axes X et y de la fonction cdfplot dans MATLAB
Interview: is bitmap pixel memory allocated in heap memory or native
Livedata interview question bank and answers -- 7 consecutive questions in livedata interview~
微信小程序中,从一个页面跳转到另一个页面后,在返回后发现页面同步滚动了