zoukankan      html  css  js  c++  java
  • SqlServer定时备份数据库和定时杀死数据库死锁解决

    PS:Sqlserver 2008 R2,windows 8 64位

    1.备份数据库

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

     

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

    --自动备份并保存最近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语句

    --数据库死锁解决,结合作业(百度)实现定时清除数据库死锁进程,存储过程放在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.作业的执行代码,执行代码是调用杀死死锁进程的存储过程

    第一步

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

    第二步

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

    关于Sqlserver数据库的两个难点也在这个下午被我自己吸收了。将来碰到类似的问题也可以轻松应对了

    转:http://www.cnblogs.com/wohexiaocai/p/3693822.html

  • 相关阅读:
    Educational Codeforces Round 10 C. Foe Pairs 水题
    Educational Codeforces Round 10 B. z-sort 构造
    CDOJ 1048 Bob's vector 三分
    Educational Codeforces Round 10 A. Gabriel and Caterpillar 模拟
    第14届电子科大初赛民间盗版部分题目题解
    HDU 5654 xiaoxin and his watermelon candy 离线树状数组 区间不同数的个数
    HDU 5653 Bomber Man wants to bomb an Array. dp
    HDU 5652 India and China Origins 二分+并查集
    HDU 5651 xiaoxin juju needs help 数学
    HDU 5650 so easy 数学
  • 原文地址:https://www.cnblogs.com/BoYu045535/p/3694645.html
Copyright © 2011-2022 走看看