当前位置:网站首页>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,1
2.定时备份指定数据库
刚刚开启了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
边栏推荐
- "Everyday Mathematics" serial 58: February 27
- To bring Euler's innovation to the world, SUSE should be the guide
- The horizontally scrolling recycleview displays five and a half on one screen, lower than the average distribution of five
- [论文阅读] CKAN: Collaborative Knowledge-aware Atentive Network for Recommender Systems
- LiveData 面试题库、解答---LiveData 面试 7 连问~
- Implementation of wechat applet bottom loading and pull-down refresh
- 面试:List 如何根据对象的属性去重?
- Flink CDC cannot monitor MySQL logs. Have you ever encountered this problem?
- 非技術部門,如何參與 DevOps?
- uniapp + uniCloud+unipay 实现微信小程序支付功能
猜你喜欢
[paper reading] kgat: knowledge graph attention network for recommendation
uniapp + uniCloud+unipay 实现微信小程序支付功能
Energy momentum: how to achieve carbon neutralization in the power industry?
B站大量虚拟主播被集体强制退款:收入蒸发,还倒欠B站;乔布斯被追授美国总统自由勋章;Grafana 9 发布|极客头条...
Atcoder beginer contest 254 "e BFS" f st table maintenance differential array GCD "
A high density 256 channel electrode cap for dry EEG
Events and bubbles in the applet of "wechat applet - Basics"
What is the origin of the domain knowledge network that drives the new idea of manufacturing industry upgrading?
把欧拉的创新带向世界 SUSE 要做那个引路人
Detailed explanation of the use of staticlayout
随机推荐
官网给的这个依赖是不是应该为flink-sql-connector-mysql-cdc啊,加了依赖调
In wechat applet, after jumping from one page to another, I found that the page scrolled synchronously after returning
如何判断线程池已经执行完所有任务了?
MySQL digital type learning notes
RMS to EAP is simply implemented through mqtt
Activity jump encapsulation
Click the picture in the mobile browser and the picture will not pop up
Flink CDC cannot monitor MySQL logs. Have you ever encountered this problem?
PHP solves the problems of cache avalanche, cache penetration and cache breakdown of redis
php解决redis的缓存雪崩,缓存穿透,缓存击穿的问题
Design and Simulation of fuzzy PID control system for liquid level of double tank (matlab/simulink)
SQL Server 监控统计阻塞脚本信息
Learning note 4 -- Key Technologies of high-precision map (Part 2)
Redis如何实现多可用区?
Uni app running to wechat development tool cannot Preview
AtCoder Beginner Contest 254「E bfs」「F st表维护差分数组gcd」
[paper reading] ckan: collaborative knowledge aware autonomous network for adviser systems
The horizontally scrolling recycleview displays five and a half on one screen, lower than the average distribution of five
A large number of virtual anchors in station B were collectively forced to refund: revenue evaporated, but they still owe station B; Jobs was posthumously awarded the U.S. presidential medal of freedo
How to write high-quality code?