• 关于sqlserver2005异地自动备份


    /*
    脚本说明:数据库备份
        
    要点:
        1 备份文件名规则:库名_backup_yyyymmdd
        2 全备后缀为 bak 差异备份后缀为 dif 日志备份后缀为 trn
        2 在指定路径生成指定类型备份,备份细节由初始参数决定
    
    注意:
        在try catch中只能捕获最后一条错误日志,要得到详细的错误原因,需要去掉try捕获
    */
    
    
    --定义参数
    DECLARE @DatabaseName VARCHAR(100)
    DECLARE @Path VARCHAR(200)
    DECLARE @PathfileName VARCHAR(200)
    DECLARE @BackupName VARCHAR(200)   --备份名
    DECLARE @NowDateTime VARCHAR(100)  --当前日期时间
    DECLARE @v1 VARCHAR(500)       --参数1
    DECLARE @Err VARCHAR(500)
    DECLARE @mail VARCHAR(500)
    DECLARE @mailUser VARCHAR(500)
    DECLARE @backupSetId AS INT  
    DECLARE @Date  VARCHAR(8)      --yyyymmdd日期
    DECLARE @command VARCHAR(50)
    DECLARE @backType VARCHAR(50)  -- full 全备  dif  差异备  log  日志备
    DECLARE @IsdateDir  INT           --是否建立日志格式之文件夹
    DECLARE @log_level INT
    
    --参数设定
    SET @DatabaseName = 'ZXFinance_Test3'
    SET @Path = 'E:\DBBackup\'
    SET @backType='full'    -- full 全备  dif  差异备  log  日志备
    SET @IsdateDir=1       --1 path中建立日期文件夹  0 保存于path中的根目录
    SET @log_level=1       -- 0 异常邮件通知 ,1全备通知,2备份通知
    SET @mailUser='zhao'   --操作员账号
    
    --生成当前时间戳
    SELECT @NowDateTime = STUFF(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(17), GETDATE(), 120), '-', ''), ' ', ''), ':', ''),9,0,'_')  
    SELECT @Date=CONVERT(VARCHAR(17), GETDATE(), 112)
    
    --路径结尾补全
    IF SUBSTRING(@Path,len(@Path),1)<>'\' SET @Path=@Path+'\'
    
    --建立子文件夹
    IF @IsdateDir=1 
    BEGIN
        SET @Path=@Path+@Date+'\'
        SET @command='mkdir '+@Path
        EXEC xp_cmdshell @command
    END
    
    
    --防止文件夹不存在报错
    IF @IsdateDir=0
    BEGIN
        SET @Path=@Path
        SET @command='mkdir '+@Path
        EXEC xp_cmdshell @command
    END
    
    --生成文件名
    SET @BackupName = @DatabaseName + '_backup_'+@backType+'_'+@NowDateTime
    
    SELECT  @PathfileName = @Path + @DatabaseName + '_backup_'+@backType+'_'+@Date+ (CASE @backType WHEN 'dif' THEN '.dif' 
                                                                 WHEN 'log'THEN '.trn'
                                                                 WHEN 'full'THEN '.bak'
                                                                 end)
    
    BEGIN TRY
    
    if @backType='dif' 
    begin
    --差异备份
    BACKUP DATABASE @DatabaseName TO  DISK = @PathfileName
    WITH  DIFFERENTIAL , NOFORMAT, NOINIT,  NAME = @BackupName, 
    SKIP, REWIND, NOUNLOAD, COMPRESSION,  STATS = 10
    
    END
    
    IF @backType='full' 
    BEGIN
    --全备份
      BACKUP DATABASE @DatabaseName TO  DISK = @PathfileName 
      WITH NOFORMAT, NOINIT,  NAME = @BackupName, 
      SKIP, REWIND, NOUNLOAD, COMPRESSION,  STATS = 10
    
    END
    
    IF @backType='log' 
    BEGIN
    --日志备份
    BACKUP LOG @DatabaseName TO  DISK = @PathfileName
      WITH  NOFORMAT, NOINIT,  NAME = @BackupName, 
      SKIP, REWIND, NOUNLOAD, COMPRESSION,  STATS = 10
    END
    
    --提取备份状态
    SELECT  @backupSetId = position
    FROM    msdb..backupset
    WHERE   database_name = @DatabaseName
            AND backup_set_id = ( SELECT    MAX(backup_set_id)
                                  FROM      msdb..backupset
                                  WHERE     database_name = @DatabaseName
                                )
    IF @backupSetId IS NULL 
        BEGIN
            SET @V1 = '验证失败。找不到数据库' + @DatabaseName + '的备份信息。'
                RAISERROR(@V1, 16, 1) 
                EXECUTE msdb.dbo.sp_notify_operator @name = @mailUser,
                    @subject = N'备份异常', @body = @V1
        END
    
    
    --备份校验  
    RESTORE VERIFYONLY FROM  DISK = @PathfileName 
      WITH  FILE = @backupSetId,  NOUNLOAD,  NOREWIND
      
    --备份完成通知管理员
    SET @mail = '备份完成,备份文件路径:' + @PathfileName
    IF (@log_level=1 AND  @backType IN('full') ) OR (@log_level=2 AND  @backType IN( 'full','dif','log'))
    EXECUTE msdb.dbo.sp_notify_operator @name = @mailUser, @subject = N'备份完成', @body = @mail
        
    
    END TRY
    BEGIN CATCH
    
        SELECT  ERROR_NUMBER() AS ErrorNumber ,
                ERROR_SEVERITY() AS ErrorSeverity ,
                ERROR_STATE() AS ErrorState ,
                ERROR_PROCEDURE() AS ErrorProcedure ,
                ERROR_LINE() AS ErrorLine ,
                ERROR_MESSAGE() AS ErrorMessage ;
            
        SET @Err = @backType+'备份异常!错误原因:' + ERROR_MESSAGE()
    
        EXECUTE msdb.dbo.sp_notify_operator @name = @mailUser, @subject = '备份异常', @body = @Err
    END CATCH
  • 相关阅读:
    操作系统复习
    软件工程复习
    2020字节跳动校园招聘算法方向第二场考试题解(部分)
    【牛客】用两个栈来实现一个队列
    LeetCode 62. 不同路径
    LeetCode 79. 单词搜索
    LeetCode 113. 路径总和 II
    LeetCode 389. 找不同
    【牛客】矩阵交换
    【牛客】KiKi学习了结构体和指针
  • 原文地址:https://www.cnblogs.com/weihengblogs/p/2735199.html
Copyright © 2020-2023  润新知