首页 / 数据库 / SQLServer / sql server 类型自动判断和条件检查的备份脚本
sql server 类型自动判断和条件检查的备份脚本2014-03-08 csdn博客 ocpyang根据自己环境自定义了一个备份脚本!说明:使用方法:exec master.dbo.fullbackup1 "s:ackup","suzhou","full"0.备份类型只能是full、diff或log,数据库名不能为空1.通过新建一个历史表记 录每次备份内容2.检查数据库版本是否为2005以上3.检查当前用户是否有权 限完成备份4.会自动检查指定盘符是否存在5.检查指定格式是否为s:6.如果指定的备份目录不存在proc将自动新建,根据备份类型为full、diff或 log7.检查备份数据库名suzhou是否存在并联机8.检查备份数据库名suzhou不 能是临时数据库9.如果备份类型为差异备份则检查是否有完全备份存在并且备份的这 个文件存在于指定的目录下,如果备份历史表有记录但是该备份文件不存在将终止备份10.如果备份类型为日志备份,先检查数据库恢复模式是否为完整,否则将停止备 份;将进一步检查备份历史表和备份文件,必须存在完全备份或差异备份,否则终止备份USE [msdb]GOif OBJECT_ID("backuphistory")is not nulldrop table backuphistorygoCREATE TABLE [dbo].[backuphistory]([sid] [int] IDENTITY(1,1) NOT NULL primary key,[dbname] [sysname] NOT NULL,[backtype] [char](2) NOT NULL,[lastbackup] [datetime] NOT NULL,[backupdesc] [varchar](20) NOT NULL,[backupfilename] [nvarchar](max) NULL,)GOuse mastergocreate PROCEDURE [dbo].[fullbackup1](@backupPath varchar(500),@dbname sysname,@backuptype varchar(100))with encryptionasdeclare @currentuser sysnamedeclare @role varchar(30)select @currentuser=system_userDECLARE @Version numeric(18,10)DECLARE @Error intdeclare @Directory nvarchar(100)DECLARE @CheckDirectory nvarchar(4000)DECLARE @DirectoryInfo TABLE (FileExists bit, FileIsADirectory bit, ParentDirectoryExists bit)DECLARE @ErrorMessage nvarchar(max)DECLARE @backupPath2 nvarchar(500)DECLARE @DirTree TABLE (subdirectory nvarchar(255), depth INT)DECLARE @FullPath varchar(1000)declare @backupPath3 nvarchar(500)declare @recovery_model_desc varchar(20)declare @backtype varchar(100)declare @backupdesc varchar(20)declare @backupfilename varchar(max)-----newDECLARE @tmp TABLE (backupfilename varchar(3000), backuptime datetime)declare @fullbafile varchar(3000)declare @result intdeclare @log_start intset nocount on--检查用户权限select @role=srvrole from(select SrvRole = g.name, MemberName = u.name from sys.server_principals u, sys.server_principals g, sys.server_role_members mwhere g.principal_id = m.role_principal_id and u.principal_id = m.member_principal_id and u.name=@currentuser ) c - -order by 1, 2if @role !="sysadmin" or @role is null or @role=""begin RAISERROR("当前用户没有需要的权限完成备份! ",16,1) print "你可能是越权操作或其它!"+char(13)+"请联系 DBA!" SET @Error = @@ERROR returnend--检查服务器 版本SET @Error = 0SET @Version = CAST(LEFT(CAST(SERVERPROPERTY ("ProductVersion") AS nvarchar(max)),CHARINDEX(".",CAST (SERVERPROPERTY("ProductVersion") AS nvarchar(max))) - 1) + "."+ REPLACE(RIGHT(CAST(SERVERPROPERTY("ProductVersion") AS nvarchar(max)),LEN(CAST(SERVERPROPERTY("ProductVersion") AS nvarchar (max))) - CHARINDEX(".",CAST(SERVERPROPERTY("ProductVersion") AS nvarchar(max)))),".","") AS numeric(18,10))IF @Version < 9BEGIN RAISERROR("该备份方案仅支持 SQL Server 2005, SQL Server 2008和SQL Server 2008 R2.",16,1) SET @Error = @@ERROR returnENDset @Directory=@backupPath--判断路径格式 IF NOT (@Directory LIKE "[a-z]:\%" ) BEGIN SET @ErrorMessage = "输入的目录"+@Directory+"格式 "+ "不支持!."+" 参考类型如: s:ackup" + CHAR(13) + CHAR(10) RAISERROR(@ErrorMessage,16,1) WITH NOWAIT SET @Error = @@ERROR return END--判断输入的数据库名是 否存在 IF @dbname not in(select name from sys.databases) BEGIN SET @ErrorMessage = "数据库名: "+@dbname+" 不存在!." + CHAR(13) + CHAR(10) RAISERROR(@ErrorMessage,16,1) WITH NOWAIT SET @Error = @@ERROR return END--判断输入的盘符是否存在和是否 新建目录--检查指定盘符是否存在SET @CheckDirectory = substring (@Directory,1,3)INSERT INTO @DirectoryInfo (FileExists, FileIsADirectory, ParentDirectoryExists)EXECUTE [master].dbo.xp_fileexist @CheckDirectoryIF NOT EXISTS (SELECT * FROM @DirectoryInfo WHERE FileExists = 0 AND FileIsADirectory = 1 AND ParentDirectoryExists = 1) BEGIN SET @ErrorMessage = "服务器上不存在指定的盘符:"+upper(substring (@CheckDirectory,1,1)+ CHAR(13) + CHAR(10)) RAISERROR (@ErrorMessage,16,1) WITH NOWAIT SET @Error = @@ERROR returnEND--判断是否输入备份数据库名IF @dbname IS NULL OR @dbname = "" BEGIN SET @ErrorMessage = "未输 入任何备份数据库名." + CHAR(13) + CHAR(10)+"备份进程已终止!" RAISERROR(@ErrorMessage,16,1) WITH NOWAIT SET @Error = @@ERROR return ENDelse if (@dbname="tempdb" or @dbname="TEMPDB")beginSET @ErrorMessage = "临时数据库不需要备份." + CHAR(13) + CHAR(10)+"备份进 程已终止!" RAISERROR(@ErrorMessage,16,1) WITH NOWAIT SET @Error = @@ERROR returnendelse if (@dbname in ( select name from sys.databases where state_desc="OFFLINE" or state_desc="offline"))beginSET @ErrorMessage = "脱机的数据库"+@dbname+"不需要备份." + CHAR(13) + CHAR(10)+"备份进程已终止!" RAISERROR(@ErrorMessage,16,1) WITH NOWAIT SET @Error = @@ERROR returnend--判断输入类型if @backuptype not in ("full","diff","log")beginprint "#########################严重警告###############严重警告 #################################"print "不支持类型 "+@backuptype+"! 只能输入(full:完全备份; diff:差异备份; log:日志备 份) "print "有问题请联系ocpyang!"print "#########################严重警告###############严重警告 ###################################"returnend--判断目录是否存在SET @backupPath2=@backupPath+""+@dbnameINSERT INTO @DirTree(subdirectory, depth)EXEC master.sys.xp_dirtree @backupPathIF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @DBName)beginprint "系统将新建目录:"+@backupPath2+" ............" EXEC master.dbo.xp_create_subdir @backupPath2 print "目 录:"+@backupPath2+"新建成功!" print " " delete from @DirTreeendelsebeginprint "--------------------------------------------------------------------- -- "print "目录:"+@backupPath2+"已经存在!"print " "+char(13)+"备份运行中 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$"print "------------------------------- ---------------------------------------- "delete from @DirTreeend--开始完全备份if @backuptype="full"beginprint "............................................................................ ."print "开始完全备份.....请稍等"print "............................................................................ ."--隐藏检查目录set @backupPath3=@backupPath2+""+"full"INSERT INTO @DirTree(subdirectory, depth)EXEC master.sys.xp_dirtree @backupPath3IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @backupPath3)EXEC master.dbo.xp_create_subdir @backupPath3delete from @DirTreeset @FullPath = @backuppath3+""+@dbname+"_"+@backuptype+"_"+replace (replace(replace(convert(varchar,getdate(),20),"-","")," ",""),":","")+ ".bak"backup database @dbname to disk=@FullPathWITH buffercount = 20, maxtransfersize = 2097152 ,COMPRESSION,RETAINDAYS=15,NOFORMAT,NOINIT,NAME=N"完整备份 ",SKIP,NOREWIND,NOUNLOAD,STATS=10set @backtype="D"set @backupdesc="完全备份"set @backupfilename=@FullPathinsert into msdb.dbo.backuphistory(dbname,backtype,lastbackup,backupdesc,backupfilename)values(@dbname, @backtype,GETDATE(), @backupdesc,@backupfilename) SET @Error = @@ERROR if @Error !=0 begin SET @ErrorMessage = "数据库"+@dbname+"完全备份未顺利完成 !: " + CHAR(13) + CHAR(10) RAISERROR(@ErrorMessage,16,1) WITH NOWAIT return end print " "print "------------------------------------------------------- ---------------- "print @dbname+"完全备份 "+@FullPath+" 已经完 成!"print "---------------------------------------------------------- ------------- "returnend--开始差异备份else if @backuptype="diff"beginprint " "print "............................................................................ ." print "开始差异备份.....请稍等" print "............................................................................ ." --检查是否有完全备份并存在insert into @tmp select top 1 a.backupfilename,MAX(a.lastbackup) as backuptime from msdb.dbo.backuphistory awhere a.dbname=@dbname and a.backtype="D"group by backupfilenameorder by a.backupfilename descif not exists (select top 1 1 from @tmp ) begin SET @ErrorMessage = "数据库"+@dbname+"没有完全备份历史记录!! " + CHAR(13) + CHAR(10) RAISERROR(@ErrorMessage,16,1) WITH NOWAIT return endelsebegin select @fullbafile=backupfilename from @tmp exec xp_fileexist @fullbafile, @result output if (@result=0 ) begin SET @ErrorMessage = "数据库"+@dbname+"完全备份文 件不存在!做差异备份无意义!" + CHAR(13) + CHAR(10) RAISERROR (@ErrorMessage,16,1) WITH NOWAIT return end end --隐藏检查目录set @backupPath3=@backupPath2+""+"diff"INSERT INTO @DirTree(subdirectory, depth)EXEC master.sys.xp_dirtree @backupPath3IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @backupPath3)EXEC master.dbo.xp_create_subdir @backupPath3delete from @DirTreeset @FullPath = @backuppath3+""+@dbname+"_"+@backuptype+"_"+replace (replace(replace(convert(varchar,getdate(),20),"-","")," ",""),":","")+ ".diff"backup database @dbname to disk=@FullPathWITH buffercount = 30, maxtransfersize = 2097152 ,COMPRESSION, DIFFERENTIAL,RETAINDAYS=8,NOFORMAT,NOINIT,NAME=N"差异备份 ",SKIP,NOREWIND,NOUNLOAD,STATS=10set @backtype="I"set @backupdesc="差异备份"set @backupfilename=@FullPathinsert into msdb.dbo.backuphistory(dbname,backtype,lastbackup,backupdesc,backupfilename)values(@dbname, @backtype,GETDATE(), @backupdesc,@backupfilename) SET @Error = @@ERROR if @Error !=0 begin SET @ErrorMessage = "数据库"+@dbname+"差异备份未顺利完成!: " + CHAR (13) + CHAR(10) RAISERROR(@ErrorMessage,16,1) WITH NOWAIT return endprint " " print "--------------------------------------------------------------------- -- " print @dbname+"差异备份 "+@FullPath+" 已经完成! " print "------------------------------------------------------ ----------------- " returnend