SqlServer定时备份数据库和定时杀死数据库死锁解决

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

SqlServer定时备份数据库和定时杀死数据库死锁解决的相关文章

Linux VPS自动定时备份网站文件和MYSQL数据库到FTP空间(LNMP)

如果我们网站更新不是很频繁,我们可以定期手动进行备份网站文件和MYSQL数据库导出.如果我们网站数据更新频繁,且数据尤为重要,建议要采用定期自动 备份,至少需要多备份数据,无论我们选择何种优秀的VPS.服务器,都要谨防服务器或者意外的问题导致数据丢失的问题. 在这篇文章中,搬瓦工中文网准备将有一台搭建LNMP一键环境使用定期备份数据库和网站文件打包,直接上传到备用FTP空间中.比如可以找一些虚拟主机空间,硬盘存储也是比较大的,直接可以作为备用数据使用. 第一.备份前的准备 1.准备一台FTP主机

使用Navicat定时备份mysql数据库和创建报表并邮件自动发送

数据库备份在现代计算机高速发展的今日变得日益重要,程序员往往因为不重视而忽略备份数据,导致数据丢失,造成非常严重的后果.定时备份无疑是解决备份的最好的途径,本文主要使用Navicat来自动备份数据库和创建相关的计划任务. (一)使用Navicat自动备份数据库: 1,打开navicat客户端,连上mysql后,双击左边你想要备份的数据库.点击"计划",再点击"新建批处理作业"具体如下图. 2,双击上面的可用任务,它就会到下面的列表里去,也代表你选择了这个任务 3,点

linux下如何实现mysql数据库每天自动备份定时备份

版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. 目录(?)[+] 概述 ??备份是容灾的基础,是指为防止系统出现操作失误或系统故障导致数据丢失,而将全部或部分数据集合从应用主机的硬盘或阵列复制到其它的存储介质的过程.而对于一些网站.系统来说,数据库就是一切,所以做好数据库的备份是至关重要的! 备份是什么? 为什么要备份 容灾方案建设 存储介质 光盘 磁带 硬盘 磁盘阵列 DAS:直接附加存储 NAS:网络附加存储 SAN:存储区域网络 云存

windows下mysql数据库定时备份。

注意:看本教程先必须会windows自带的"任务计划程序". 首先创建一个bat后缀的文件我的是timerExecutePhp.bat文件 timerExecutePhp.bat 这个文件是用来定时执行指定的php文件 timerExecutePhp.bat文件内容: F:\web\php-5.6.22-Win32-VC11-x64\php.exe F:\web\htdocs\demo\timer.php 注释: 1.F:\web\php-5.6.22-Win32-VC11-x64\p

[转]mysql自动定时备份数据库的最佳方法-支持windows系统

网上有很多关于window下Mysql自动备份的方法,可是真的能用的也没有几个,有些说的还非常的复杂,难以操作. 我们都知道mssql本身就自带了计划任务可以用来自动备份,可是mysql咱们要怎么样自动有备份呢? 这个方法是用bat批处理来完成的. 假想环境:MySQL 安装位置:D:\Program Files\MySQL\MySQL Server 5.0\data 如图: 数据库名称为:952game数据库备份目的地:d:\db_bak\ (你想把数据库备份到哪个盘的路径)我想备到D盘的db

ubuntu crontab 定时备份postgres数据库并上传ftp服务器

最近公司要求备份数据库,所以就查了比较作的资料.废话不多说,入正题. 目的:定期备份ubuntu下的postgres数据库,打包上传到指定ftp服务器. 经过查找资料,解决方法: ①编写备份数据库.打包压缩.上传指定ftp的脚本. ②将该脚本加入到ubuntu定期计划任务crontab中. 下边是执行的步骤: ①编写shelll脚本:bk.sh,对于对shell脚本不了解的,可以百度w3cshool shell. 最好用root用户编写:su root. 编写完后,添加执行权限,新编写的shel

Linux下定时备份MySQL数据库的Shell脚本

Linux下定时备份MySQL数据库的Shell脚本 对任何一个已经上线的网站站点来说,数据备份都是必须的.无论版本更新还是服务器迁移,备份数据的重要性不言而喻.人工备份数据的方式不单耗费大量时间和精力,还灰常不专业的说.于是,有了下面这段脚本的出现.参考了网上的很多教程,外加自己的测试,以下脚本经测试可用.#!/bin/bash#Shell Command For Backup MySQL Database Everyday Automatically By Crontab#Author :

java 定时备份数据库

/** 操作数据库 */ public class BackupDb {     public String backup() throws IOException{      String user = "root"; //数据库的用户名      String password = "admin";//数据库的密码       String database = "hrtweb";//要备份的数据库名       Date date = ne

linux上定时备份mysql数据库

定时备份数据库 /usr/sbin/backupmysql timestamp=`date +"%Y-%m-%d-%H-%M-%S"` mysqldump -uroot -p'123456 databasename>/db$timestamp.sql chmod +x backupmysql 安装crontab: [[email protected] ~]# yum install vixie-cron [[email protected] ~]# yum install cro