--
----整理了几个常用的数据库维护的脚本,和大家分享,希望能够对大家有所帮助,尤其是--初学者。这些脚本只针对Sql Server 2000,在Sql Server 2005下没有进行测试,有些--可能不适用。如果有错误,请联系我<Yahongq111@163.com>----/********************************************************************************* * 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 masterdeclare @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_nameset @dir_db=@dir+'Database'set @verb='mkdir '--建立目录set @cmd=@verb+@dir_dbexec xp_cmdshell @cmddeclare cur_database cursor forward_only read_only forselect name from sysdatabaseswhere dbid>4 --系统数据库的dbid<=4open cur_database fetch next from cur_databaseinto @DbNamewhile @@fetch_status=0begin 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 @DbNameendclose cur_databasedeallocate 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 masterdeclare @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+'\'+@MasterFileNameset @TargetLogFileName=@TargetDir+'\'+@LogFileName--添加还原设备set @WholeDeviceName=@DbName+'WholeDevice'set @WholeFileName='K:\'+@WholeFileNameexec 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 @DifferenctDeviceNameendelsebegin --只有完全备份的还原 if(isnull(@TargetDir,'')='') restore database @DbName from @WholeFileName else restore database @DbName from @WholeFileName with move @MasterFileName to @TargetMasterFileName, move @LogFileName to @TargetLogFileNameend--释放备份设备exec sp_dropdevice @WholeDeviceNameif(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 cctqaselect Size/128 Size,Name from sysfiles/*declare @LogName varchar(255),@TargetSize int------第二步:设置需要收缩的日志文件的逻辑名字和收缩后的大小--千万不要搞错了,选错了文件,有可能会丢失数据,那时候--哭都哭不回来了。----set @LogName='CCTQA_Log'set @TargetSize=1declare @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 elsebegin 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*/此贴仅供个人学习使用!!!
转载自:http://www.cnblogs.com/Yahong111/archive/2007/09/19/898326.html