您的位置:首页 > 数据库

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

2007-12-18 10:58 435 查看
--

--

--整理了几个常用的数据库维护的脚本,和大家分享,希望能够对大家有所帮助,尤其是

--初学者。这些脚本只针对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

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: