SQL Server作业+xp_cmdshell+nero命令行实现数据库备份的自动刻录 |
| 作者:Alex 更新时间:2007-12-14 15:09:49 |
|
|
实现原理及步骤:
1.先判断备份文件夹中“未刻录”的数据库备份文件的总容量,如果达到1张DVD的容量,则可以进行刻录,如果不足,则自动退出。
2.如果“未刻录”的文件总量超过1个DVD的容量,则按日期排序,选取日期靠前的备份文件进行刻录,多余的留到第二天再刻录。
3.将可以刻录的文件复制到刻录临时文件夹,然后进行刻录,刻录完成后,将该文件夹清空,同时将原文件夹中的当前被刻录数据库备份重命名为:原文件名_已刻录.rar
具体代码:
CREATE proc AutoBurn
 /**//********************************************
过程功能:自动刻录
制作日期:2006-08-31
制作:计算机室
********************************************/
as
--建立临时表存储cmdshell返回信息
create table #t(fsize varchar(4000),fname varchar(300))

--查看文件
declare @sql varchar(8000)
set @sql='dir f:\beifen'
insert into #t(fsize) exec master..xp_cmdshell @sql

--删除无用信息
delete from #t where charindex('nkyd',fsize)=0 or fsize is NULL or charindex('已刻录',fsize)>0
update #t set fsize=substring(fsize,20,len(fsize)) from #t where charindex('nkyd',fsize)>0
update #t set fsize=replace(rtrim(ltrim(left(fsize,charindex('nkyd',fsize)-1))),',',''),fname=substring(fsize,charindex('nkyd',fsize),len(fsize)) from #t where charindex('nkyd',fsize)>0

--计算哪些文件可以刻录
create table #tmp(fname varchar(300))
if(select sum(cast(fsize as bigint)) from #t)>4000000000
begin
declare @fsize varchar(2000)
declare @fname varchar(300)
declare @sizesum bigint
set @fsize=''
set @fname=''
set @sizesum=0
--建立游标
declare cur_1 cursor for
select fsize,fname from #t
open cur_1
fetch next from cur_1 into @fsize,@fname
while @@FETCH_STATUS=0
begin
while(@sizesum<4000000000)
begin
set @sizesum=@sizesum+cast(@fsize as bigint)
insert into #tmp(fname) values(@fname)
break
end
fetch next from cur_1 into @fsize,@fname
end
close cur_1
deallocate cur_1

--将可以刻录的文件移动到临时文件夹
set @sql=''
select @sql=@sql+'copy f:\beifen\'+fname+' f:\tmp\&&' from #tmp
set @sql=reverse(stuff(reverse(@sql),1,2,''))
exec master..xp_cmdshell @sql,no_output

--刻录
set @sql=''
set @sql='cd&&cd program files&&cd nero&&cd nero 7&&cd core&&nerocmd --write --drivename h --real --dvd --iso "BAK" --speed 8 "f:\tmp" --recursive --verify --disable_eject'
exec master..xp_cmdshell @sql,no_output

--刻录后将tmp文件夹清空,将原文件标记为"已刻录"
set @sql=''
set @sql='del f:\tmp\*.rar'
exec master..xp_cmdshell @sql,no_output
set @sql='f:&&cd beifen&&'
select @sql=@sql+'ren '+fname+' '+replace(fname,'.rar','')+'_已刻录.rar&&' from #tmp
set @sql=reverse(stuff(reverse(@sql),1,2,''))
exec master..xp_cmdshell @sql,no_output
end
else
begin
return
end
--删除临时表
drop table #t,#tmp

使用时,在作业中调用存储过程,设置好调度,即可.
 |
|
上一篇:如何用SQL2000还原bak文件 下一篇:SQL Server数据库自动压缩备份 |
|
|
|