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