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数据库自动压缩备份
网友评论
相关文章
站长推荐