数据库维护脚本

--
--
--整理了几个常用的数据库维护的脚本,和大家分享,希望能够对大家有所帮助,尤其是
--初学者。这些脚本只针对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 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
*/

此贴仅供个人学习使用!!!

转载自:http://www.cnblogs.com/Yahong111/archive/2007/09/19/898326.html

posted @ 2018-07-19 17:29  AZRNG  阅读(357)  评论(0编辑  收藏  举报