PS:Sqlserver 2008 R2,windows 8 64位
1.备份数据库
因为要备份,我们就要用到Sqlserver的代理,默认数据库的代理是不开启的。需要我们手动开启的。
执行备份数据库脚本,现在将脚本公布,其实将这一段代码中需要保存的文件路径和数据库名称替换一下就可以实现备份了。但是还没有达到定时备份的目的
?
1
2
3
4
5
6
7
8
9
10
11
|
--自动备份并保存最近5天的SQL数据库作业脚本 宋彪 20130310
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语句
+ ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
--数据库死锁解决,结合作业(百度)实现定时清除数据库死锁进程,存储过程放在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数据库生成了存储过程,调用的代码很简单
?
1
2
3
4
5
6
7
|
--执行
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.作业的执行代码,执行代码是调用杀死死锁进程的存储过程
第一步
需要执行上面的杀死死锁进程的存储过程,只有master数据库中存在这个存储过程,才可以以作业的方式调用这个存储过程,否则就是调用失败!
第二步
创建一个新的作业,将刚刚的调用存储过程的SQL语句放入到新建作业=>步骤选项=>命令,中就可以了。最后一步执行计划自己根据实际情况进行设置
关于Sqlserver数据库的两个难点也在这个下午被我自己吸收了。将来碰到类似的问题也可以轻松应对了
转:http://www.cnblogs.com/wohexiaocai/p/3693822.html
SqlServer定时备份数据库和定时杀死数据库死锁解决,码迷,mamicode.com
时间: 2024-10-22 09:04:46