整理的几个常用的数据库维护的脚本(ZT)

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