sql自动备份 语句

SQL code
/**//********************************************************************************* * FielName : backup.sql * Function : 自动备份 * Author : Yahong<Yahongq111@163.com> * Date : 2005-5-10 2005-5-19 2006-8-1 2007-09-18 * Version : 00 01 02 03 * * Remark : * 2006-08-01 增加差异备份和完全备份两种情况,生成多个备份副本 * 2008-09-18 增加备份一个实例中的所有数据库的情况,并在备份后清除日志 * *********************************************************************************/ use master declare @DbName varchar(255),@dir varchar(256),@dir_db varchar(256), @verb varchar(256),@cmd varchar(256), @backup_name varchar(256),@dynamic_name varchar(10), @disk_name varchar(256),@copy nvarchar(100), @today datetime,@weekday int --建立网络连接 exec xp_cmdshell 'net use K: /delete' exec xp_cmdshell 'net use I: /delete' exec xp_cmdshell 'net use K: \\193.254.40.118\backup backup /user:Web\backup ' exec xp_cmdshell 'net use I: \\172.16.8.48\databackup backup /user:QA-SERVER-TEST\backup' --设定名字 set @today=getdate() set @dynamic_name=convert(varchar(10),@today,120) set @dir='K:\'+@dynamic_name set @dir_db=@dir+'Database' set @verb='mkdir ' --建立目录 set @cmd=@verb+@dir_db exec xp_cmdshell @cmd declare cur_database cursor forward_only read_only for select name from sysdatabases where dbid>4 --系统数据库的dbid<=4 open cur_database fetch next from cur_database into @DbName while @@fetch_status=0 begin set @backup_name= @DbName+'_'+@dynamic_name set @disk_name=@dir_db+'\'+@backup_name+'.bak' --添加备份设备 EXEC sp_addumpdevice 'disk',@backup_name, @disk_name set @weekday= datepart(dw,@today) if (@weekday=6) --如果是周五,则进行完全备份 BACKUP DATABASE @DbName TO @backup_name else --其他时候进行差异备份 BACKUP DATABASE @DbName TO @backup_name with differential --清理日志 backup log @DbName with no_log --释放设备 exec sp_dropdevice @backup_name --复制备份副本到其他地方 set @copy='copy '+@disk_name+' I:' exec xp_cmdshell @copy --备份下一个数据库 fetch next from cur_database into @DbName end close cur_database deallocate cur_database --删除网络连接 exec xp_cmdshell 'net use K: /delete' exec xp_cmdshell 'net use I: /delete' /**//****************************************************************************** * * File Name : Restore.sql * Function : 数据库还原 * Author : Yahong<Yahongq111@163.com> * Version : 00 * Date : 2007-09-18 * Remark : * *******************************************************************************/ use master declare @DbName varchar(255) --数据库的名字 ,@WholeFileName varchar(255) --完全备份的文件名 ,@DifferentFileName varchar(255) --差异备份的文件名 ,@MasterFileName varchar(255) --数据文件名,注意他们都是逻辑名称 ,@LogFileName varchar(255) --日志文件名 ,@TargetDir varchar(255) --还原后数据库文件所在的路径,如果没有指定该参数, --则必须存在与原数据库相同的路径 declare @WholeDeviceName varchar(255) ,@DifferenctDeviceName varchar(255) ,@TargetMasterFileName varchar(255) ,@TargetLogFileName varchar(255) --建立网络链接 exec xp_cmdshell 'net use K: \\172.16.8.48\200709 backup /User:qa-server-test\backup' --在这里设置需要备份的文件等信息 set @DbName='CCTQA' --需要还原的数据库的名字,注意不要搞错了,否则 --覆盖了其他的数据库,可别说我没有提醒你 set @WholeFileName='CCTQA_2007-09-14.bak' --完全备份文件 --以下4行如果没有,不要指定,把他们注释掉就行了 set @DifferentFileName='CCTQA_2007-09-17.bak' --最后一次差异备份文件 set @MasterFileName='CCTQA_Data' --数据文件 set @LogFileName='CCTQA_Log' --日志文件 set @TargetDir='D:\CCTQA\Databae' --目标路径 --设置目标路径 set @TargetMasterFileName=@TargetDir+'\'+@MasterFileName set @TargetLogFileName=@TargetDir+'\'+@LogFileName --添加还原设备 set @WholeDeviceName=@DbName+'WholeDevice' set @WholeFileName='K:\'+@WholeFileName exec sp_addumpdevice 'disk',@WholeDeviceName,@WholeFileName --开始备份 if(isnull(@DifferentFileName,'')<>'') --如果具有差异备份的还原 begin --添加差异备份还原的设备 set @DifferenctDeviceName=@DbName+'DifferenctDevice' set @DifferentFileName='K:\'+@DifferentFileName exec sp_addumpdevice 'disk',@DifferenctDeviceName,@DifferentFileName --备份 if(isnull(@TargetDir,'')='') restore database @DbName from @WholeDeviceName with NORECOVERY else --如果还原后的数据库文件的路径与备份前的路径不一致 restore database @DbName from @WholeDeviceName with NORECOVERY, move @MasterFileName to @TargetMasterFileName, move @LogFileName to @TargetLogFileName restore database @DbName from @DifferenctDeviceName end else begin --只有完全备份的还原 if(isnull(@TargetDir,'')='') restore database @DbName from @WholeFileName else restore database @DbName from @WholeFileName with move @MasterFileName to @TargetMasterFileName, move @LogFileName to @TargetLogFileName end --释放备份设备 exec sp_dropdevice @WholeDeviceName if(isnull(@DifferentFileName,'')<>'') exec sp_dropdevice @DifferenctDeviceName --删除网络链接 exec xp_cmdshell 'net use K: /delete' /**//************************************************************************ * * File Name : ShrinkLog.sql * Function : 收缩数据库的日志文件 * Author :Yahong<Yahongq111@163.com> * Version : 00 * Date : 2007-09-16 * Remark : * *************************************************************************/ -- --第一步:设置需要收缩的数据库,找到需要收缩数据文件 -- use cctqa select Size/128 Size,Name from sysfiles /**//* declare @LogName varchar(255),@TargetSize int -- -- --第二步:设置需要收缩的日志文件的逻辑名字和收缩后的大小 --千万不要搞错了,选错了文件,有可能会丢失数据,那时候 --哭都哭不回来了。 -- -- set @LogName='CCTQA_Log' set @TargetSize=1 declare @str varchar(300), @DatabaseName varchar(255) set @DatabaseName=db_name() if(not exists(select * from sysfiles where name=@LogName)) begin set @str='没有找到日志文件'+@LogName raiserror(@str,0,1) end else begin declare @curSize int,@maxTime int set @maxTime=10 set @curSize=(select size from sysfiles where name=@LogName)/128 print '收缩之前的日志文件的大小是:'+cast(@curSize as varchar(10))+'MB' while (@curSize>@TargetSize) and (@maxTime>0) begin backup log @DatabaseName with no_log DBCC SHRINKFILE(@LogName,@TargetSize) set @curSize=(select size from sysfiles where name=@LogName)/128 set @maxTime=@maxTime-1 end set @curSize=(select size from sysfiles where name=@LogName)/128 print '收缩之后的日志文件的大小是:'+cast(@curSize as varchar(10))+'MB' end */
posted @ 2010-08-03 16:48  海浪~~  阅读(469)  评论(0)    收藏  举报