很早以前的一个项目里写的,现在放上来备忘。

要求:
具有管理员权限,一般sa用户就可以。

备份原理如下:
首先导出数据库到本地硬盘上,然后压缩成cab文件,之后用ftp.exe将压缩包上传到ftp服务器上
恢复原理如下:
首先在ftp服务器上下载压缩包,然后解压缩里面的文件,最后将数据库备份恢复。

这是备份的源码
 1 create procedure sp_BackupDB
 2       @DBName varchar(50),
 3       @Host varchar(255),
 4       @User varchar(255),
 5       @Password varchar(255),
 6 --      @Port int,
 7       @WorkingFolder varchar(255),
 8       @FileName varchar(255)
 9 as
10 begin
11   declare @sTempFileName varchar(255)
12   declare @sCommandText varchar(255)
13   declare @sCabFileName varchar(255)
14   declare @sTempFolder varchar(255)
15 
16   set @sTempFolder = '~dbback'
17   --创建临时文件夹
18   set @sCommandText = 'md c:' + @sTempFolder
19   exec xp_cmdshell @sCommandText
20 
21   set @sCabFileName = 'c:' + @sTempFolder + '' + @FileName
22   set @sTempFileName = REPLACE(@sCabFileName,'.zpck','.dbak')
23 
24   --删除可能存在的的临时文件
25   set @sCommandText = 'del "' + @sTempFileName +'"'
26   exec xp_cmdshell @sCommandText
27 
28   set @sCommandText = 'del "' + @sCabFileName +'"'
29   exec xp_cmdshell @sCommandText
30 
31   --备份数据库
32   BACKUP DATABASE @DBName  TO DISK = @sTempFileName
33   --set @sCommandText = 'BACKUP DATABASE ' + @DBName + ' TO DISK = ''' + @sTempFileName + ''''
34   --execute(@sCommandText)
35   
36   --将数据库压缩成数据包
37   exec xp_makecab @sCabFileName'mszip'1 , @sTempFileName
38   
39   declare @ftpLogScriptFileName varchar(255)
40   set @ftpLogScriptFileName = '"' + REPLACE(@sCabFileName,'.zpck','.log'+ '"'
41   --产生ftp上传脚本
42   set @sCommandText = 'echo ftp>' + @ftpLogScriptFileName
43   exec xp_cmdshell @sCommandText
44   set @sCommandText = 'echo open ' + @Host + '>>' + @ftpLogScriptFileName
45   exec xp_cmdshell @sCommandText
46   set @sCommandText = 'echo ' + @User + '>>' + @ftpLogScriptFileName
47   exec xp_cmdshell @sCommandText
48   set @sCommandText = 'echo ' + @Password + '>>' + @ftpLogScriptFileName
49   exec xp_cmdshell @sCommandText
50   set @sCommandText = 'echo cd ' + @WorkingFolder + '>>' + @ftpLogScriptFileName
51   exec xp_cmdshell @sCommandText
52   set @sCommandText = 'echo put "' + @sCabFileName + '">>' + @ftpLogScriptFileName
53   exec xp_cmdshell @sCommandText
54   set @sCommandText = 'echo bye >>' + @ftpLogScriptFileName
55   exec xp_cmdshell @sCommandText
56 
57   --上传数据包
58   set @sCommandText = 'ftp -s:"' + @ftpLogScriptFileName + '"'
59   exec xp_cmdshell @sCommandText
60 
61   --删除数据库压缩包
62   set @sCommandText = 'del "' + @sCabFileName + '"'
63   exec xp_cmdshell @sCommandText
64 
65   --删除ftp上传脚本
66   set @sCommandText = 'del "' + @ftpLogScriptFileName + '"'
67   exec xp_cmdshell @sCommandText
68 
69  
70   --删除数据库备份
71   set @sCommandText = 'del "' + @sTempFileName + '"'
72   exec xp_cmdshell @sCommandText
73 
74   --删除临时文件夹
75   set @sCommandText = 'rd c:' + @sTempFolder
76   exec xp_cmdshell @sCommandText
77 
78   return
79 end

这是恢复备份的源码
create  procedure sp_RestoreDB
      
@DBName varchar(50),
      
@Host varchar(255),
      
@User varchar(255),
      
@Password varchar(255),
      
@WorkingFolder varchar(255),
      
@FileName varchar(255),
      
@MDFPhyFileName varchar(255),
      
@MDFLogFileName varchar(255),
      
@LDFPhyFileName varchar(255),
      
@LDFLogFileName varchar(255),
      
@ReturnValue int output
as
begin
  
set @ReturnValue = -1
  
declare @sTempFileName varchar(255)
  
declare @sCommandText varchar(255)
  
declare @sCabFileName varchar(255)
  
declare @sUnpackFolder varchar(255)
  
declare @sTempFolder varchar(255)

--  set @MDFPhyFileName = 'C:Program FilesMicrosoft SQL ServerMSSQLDataSuStorageMgr.mdf'
--
  set @MDFLogFileName = 'SuStorageMgr_Data'
--
  set @LDFPhyFileName = 'C:Program FilesMicrosoft SQL ServerMSSQLDataSuStorageMgr_log.ldf'
--
  set @LDFLogFileName = 'SuStorageMgr_Log'

  
set @sTempFolder = '~dbback'
  
set @sCabFileName = 'c:' + @sTempFolder + '' + @FileName
  
set @sTempFileName = REPLACE(@sCabFileName,'.zpck','.dbak')

  
set @sCommandText = 'md ' + 'c:' + @sTempFolder
  
exec xp_cmdshell @sCommandText

  
--删除可能存在的的临时文件
  set @sCommandText = 'del "' + @sTempFileName + '"'
  
exec xp_cmdshell @sCommandText

  
declare @ftpLogScriptFileName varchar(255)
  
set @ftpLogScriptFileName = REPLACE(@sCabFileName,'.zpck','.log')

  
--产生ftp下载脚本
  set @sCommandText = 'echo ftp>"' + @ftpLogScriptFileName + '"'
  
exec xp_cmdshell @sCommandText
  
set @sCommandText = 'echo open ' + @Host + ' >>"' + @ftpLogScriptFileName + '"'
  
exec xp_cmdshell @sCommandText
  
set @sCommandText = 'echo ' + @User + '>>"' + @ftpLogScriptFileName + '"'
  
exec xp_cmdshell @sCommandText
  
set @sCommandText = 'echo ' + @Password + '>>"' + @ftpLogScriptFileName + '"'
  
exec xp_cmdshell @sCommandText
  
set @sCommandText = 'echo cd ' + @WorkingFolder + '>>"' <;/span>+ @ftpLogScriptFileName + '"'
  
exec xp_cmdshell @sCommandText
  
set @sCommandText = 'echo get ' + @FileName + ' ' + @sCabFileName + '>>"' + @ftpLogScriptFileName + '"'
  
exec xp_cmdshell @sCommandText
  
set @sCommandText = 'echo bye >>"' + @ftpLogScriptFileName + '"'
  
exec xp_cmdshell @sCommandText

  
--下载数据包
  set @sCommandText = 'ftp -s:' + @ftpLogScriptFileName
  
exec xp_cmdshell @sCommandText

  
--删除ftp下载脚本
  set @sCommandText = 'del "' + @ftpLogScriptFileName + '"'
  
exec xp_cmdshell @sCommandText

  
--压缩包解压缩
  set @sUnpackFolder = 'c:' + @sTempFolder
  
exec xp_unpackcab @sCabFileName@sUnpackFolder1

  
--删除数据库压缩包
  set @sCommandText = 'del "' + @sCabFileName + '"'
  
exec xp_cmdshell @sCommandText

  
--还原数据库
  RESTORE DATABASE  @DBName
   
FROM disk = @sTempFileName
       
WITH RECOVERY,
       
REPLACE,
    MOVE 
@MDFLogFileName to @MDFPhyFileName,
    MOVE 
@LDFLogFileName to @LDFPhyFileName

  
--删除数据库备份
  set @sCommandText = 'del "' + @sTempFileName + '"'
  
exec xp_cmdshell @sCommandText

  
--删除临时目录
  set @sCommandText = 'rd ' + 'c:' + @sTempFolder
  
exec xp_cmdshell @sCommandText
  
set @ReturnValue = 1
  
return
end

在windows 2000+sql server 2000上调试通过