zoukankan      html  css  js  c++  java
  • MS SQL BackUp Database && Shrink DB Log && SP WHO LOCK

    代码
    /*-----------------------------------------------------------------------------------------------------------------------
    名  稱:資料庫備份
    調用對像:
    備註說明:
    修改日志:
    程式作者:XXX
    EXEC UP_DataBase_Backup 'IVT','D:\DB_BAK\'
    -----------------------------------------------------------------------------------------------------------------------
    */
    CREATE PROCEDURE [dbo].[UP_DataBase_Backup]
    (
        
    @databsename VARCHAR(100),
        
    @todiskpath VARCHAR(200)
    )
    AS
    BEGIN
        
    SET NOCOUNT ON

        
    DECLARE @filename VARCHAR(100)
        
    SET @filename=@databsename+'_'+CONVERT(VARCHAR(10),GETDATE(),112)+'.bak'
        
        
    SET @todiskpath=@todiskpath+@filename
        
    backup   database   @databsename   to   disk=@todiskpath

        
    SET NOCOUNT OFF
    END
    GO
    代码
    /*-----------------------------------------------------------------------------------------------------------------------
    名  稱:清除資料庫log
    調用對像:
    備註說明:注意,此存儲過程在建在master數據庫中
    修改日志:
    程式作者:XXXXX
    -----------------------------------------------------------------------------------------------------------------------
    */
    CREATE PROCEDURE [dbo].[shrink_db]
    (
        
    @db_name varchar(100)----數據庫名稱
    )
    AS
    BEGIN
        
    SET NOCOUNT ON

        
    ----1.清空日志
        dump transaction @db_name  with  no_log
        
    --2.截断事务日志
        backup log @db_name with no_log
        
    --3.收缩数据库文件(如果不压缩,数据库的文件不会减小
        dbcc shrinkdatabase(@db_name)
        
    --4.设置自动收缩
        --exec sp_dboption @db_name,autoshrink,true
        
        
    SET NOCOUNT OFF
    END
    GO
    代码
    /*-----------------------------------------------------------------------------------------------------------------------
    名  稱:查看死锁情況
    調用對像:
    備註說明:
    修改日志:
    程式作者:XXXXX
    -----------------------------------------------------------------------------------------------------------------------
    */
    CREATE PROCEDURE [dbo].[sp_who_lock]
    AS
    BEGIN
        
    SET NOCOUNT ON
        
        
    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 sysprocesses WHERE blocked>0 ) a 
        
    WHERE not exists(SELECT * FROM (SELECT * FROM sysprocesses WHERE blocked>0 ) b 
        
    WHERE a.blocked=spid) 
        
    UNION SELECT spid,blocked FROM 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 '現在沒有阻塞和死鎖信息' as Message

        
    --循環開始 
        WHILE @intCounter <= @intCountProperties 
        
    BEGIN 
            
    --取第一條記錄 
            SELECT @spid = spid,@bl = bl 
            
    FROM #tmp_lock_who WHERE Id = @intCounter 
            
    BEGIN 
                
    IF @spid =0 
                    
    SELECT '引起數據庫死鎖的是: '+ CAST(@bl AS VARCHAR(10)) + '進程號,其執行的SQL語法如下' 
                
    ELSE 
                    
    SELECT '進程號SPID:'+ CAST(@spid AS VARCHAR(10))+ '' + '進程號SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其當前進程執行的SQL語法如下' 
                
                
    DBCC INPUTBUFFER (@bl ) 
            
    END 
         
            
    --循環指針下移 
            SET @intCounter = @intCounter + 1 
        
    END 
         
         
        
    DROP TABLE #tmp_lock_who 
         
        
    RETURN 0 

        
    SET NOCOUNT OFF
    END
    GO
    /*-----------------------------------------------------------------------------------------------------------------------
    名  稱:
    調用對像:
    程式作者:鄒建的
    備註說明:
    =========================================================================================================================
    修改日期 修改者 修改內容
    =========================================================================================================================

    -----------------------------------------------------------------------------------------------------------------------
    */
    CREATE PROCEDURE [dbo].[UP_LockInfo]
    (
    @kill_lock_spid bit=0, --是否殺掉阻塞的進程,1 殺掉, 0 僅顯示
    @show_spid_if_nolock bit=1, --如果沒有阻塞的進程,是否顯示正常進程資訊,1 顯示,0 不顯示
    @dbname sysname= '' --如果為空,則查詢所有的庫,如果為null,則查詢當前庫,否則查詢指定庫
    )
    AS
    BEGIN
    SET NOCOUNT ON
    Declare @count int,@s nvarchar(2000),@dbid int
    If @dbname='' Set @dbid=db_id() Else SET @dbid=db_id(@dbname)

    SELECT
    id=identity(int,1,1),標誌,
    進程ID=spid,執行緒ID=kpid,塊進程ID=blocked,資料庫ID=dbid,
    資料庫名=db_name(dbid),用戶ID=uid,用戶名=loginame,累計CPU時間=cpu,
    登陸時間=login_time,打開事務數=open_tran,進程狀態=status,
    工作站名=hostname,應用程式名=program_name,工作站進程ID=hostprocess,
    功能變數名稱=nt_domain,網卡位址=net_address
    INTO #t
    FROM (
    SELECT 標誌= '阻塞的進程',
    spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,
    status,hostname,program_name,hostprocess,nt_domain,net_address,
    s1=a.spid,s2=0
    FROM master..sysprocesses a
    JOIN (
    SELECT blocked FROM master..sysprocesses
    where blocked> 0
    and(@dbid is null or dbid=@dbid)
    group by blocked
    ) b on a.spid=b.blocked
    WHERE a.blocked=0
    AND (@dbid is null or dbid=@dbid)

    UNION ALL
    SELECT '|_犧牲品_> ',
    spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,
    status,hostname,program_name,hostprocess,nt_domain,net_address,
    s1=blocked,s2=spid
    FROM master..sysprocesses a
    WHERE blocked <> 0
    AND (@dbid is null or dbid=@dbid)
    ) a
    ORDER BY s1,s2

    SELECT @count=@@rowcount

    IF @count=0 and @show_spid_if_nolock=1
    begin
    insert #t
    select 標誌= '正常的進程 ',
    spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,
    open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address
    from master..sysprocesses
    where @dbid is null or dbid=@dbid
    order by spid
    set @count=@@rowcount
    end

    if @count>0
    begin
    create table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo nvarchar(255))
    declare tb cursor local
    for
    select N'insert #t1 exec(''dbcc inputbuffer('+rtrim(進程ID)+')'')
    if @@rowcount=0 insert #t1(a) values(null)
    '+case when @kill_lock_spid=1 and 標誌=N'阻塞的進程 '
    then 'kill '+rtrim(進程ID) else '' end
    from #t
    open tb
    fetch tb into @s
    while @@fetch_status=0
    begin
    exec(@s)
    fetch tb into @s
    end
    close tb
    deallocate tb
    select a.*,進程的SQL語句=b.EventInfo
    from #t a join #t1 b on a.id=b.id
    order by a.ID
    END

    SET NOCOUNT OFF
    END
    GO
  • 相关阅读:
    Net163网页测试
    单片机无线上网的几种方式
    5V到3V3的电平转换-串口通信
    uart rs232 rs485
    转:TI公司CC系列的各种芯片的区别
    OpenWrt 路由器固件
    cortex-m4 不能运行Linux, 可以运行 uclinux, ucos iii
    Lwip Uip
    Java-06-交换两个变量的值
    Java-05-比较equals()与== [转载]
  • 原文地址:https://www.cnblogs.com/Athrun/p/1778113.html
Copyright © 2011-2022 走看看