用存儲過程實現MSSQL數據的網絡異地備份

 MSSQL的異地遠程存儲,SQLServer備到FileServer
環境:
win2k+sqlserver 2K SP3

 backup database msdb to disk=’computer estfilename.bak’ --(注意大小寫)


如果SQL異地備份失敗,歸根結底是權限問題! H


 那麼你的SQLServer的啓動用戶必須在FileServer上有足夠的權限!


1SQLServer上新建一SQLUser用戶權限大一點。


2FileServer上建同一用戶對某一文件夾有足夠權限,就是在兩臺機器上建相同的用戶名和密碼,然後與這個用戶名登入電腦。


3、兩機的SQLUser密碼相同(方便一點)
4、將SQLServer改爲SQLUser
啓動
   (管理工具-->服務-->mssql-->屬性-->指定用戶及密碼,是計算機的登入用戶名)


5、backup database 數據庫 to disk=’192.168.*.*文件夾ShareBak.Bak’就可以了。

作業:db_backup2pc @databaseName='databaseName',@filepath='filepath'

CREATE PROCEDURE dbo.db_backup2pc

@databaseName  nvarchar(100= null--數據庫名
@filepath               nvarchar(125= null  --文件保存路徑(IP+隱藏共享+)

AS
BEGIN
DECLARE
 
@year1   varchar(4),
 
@month1   varchar(2),
 
@day1   varchar(2),
 
@flag   varchar(255),
 
@proc_result tinyint,  /*返回系統存儲過程xp_cmdshell運行結果*/
 
@sqlstr   varchar(2000),
 
@createdir varchar(255)   /*建立文件備份的目錄*/

begin
             
-- Get year & month &day fromat of the day before yesterday
--
 SET @year1 = substring(convert(varchar,datepart(yyyy,getdate()-2)),3,2)
 SET @month1 =substring(convert(varchar,datepart(mm,getdate())),1,2)
 
SET @day1=substring(convert(varchar,datepart(dd,getdate())),1,2
 
-- if len(@month1)<2 set @month1 = '0' + @month1 /* 不足兩位的前面加零 */
 -- if len(@day1)<2 set @day1 = '0' + @day1 
 
 
set @sqlstr='dir '+@filepath+@databaseName+'_'+@month1+'-'+@day1
 
EXEC @proc_result = master..xp_cmdshell @sqlstr,no_output
 
 
if (@proc_result<>0/*系統存儲過程xp_cmdshell返回代碼值:0(成功)或1(失敗)*/
  
begin
   
set @createdir='md '+@filepath+@databaseName+'_'+@month1+'-'+@day1  /*建立文件備份的目錄*/
   
EXEC master..xp_cmdshell @createdir,no_output

   
set @sqlstr='backup database '+@databaseName+' to disk='''+@filepath+@databaseName+'_'+@month1+'-'+@day1+''+@databaseName+'.bak''' --+' with init'   
   Execute (@sqlstr)  /* 備份databaseName數據 */
   
   
set @sqlstr='backup database master to disk='''+@filepath+@databaseName+'_'+@month1+'-'+@day1+'master.bak'''
   
Execute (@sqlstr)  /* 備份 master 數據 */
   
   
set @sqlstr='backup database msdb to disk='''+@filepath+@databaseName+'_'+@month1+'-'+@day1+'msdb.bak'''
   
Execute (@sqlstr)  /* 備份 msdb 數據 */

   
set @flag='Backup database successful.'
  
end
 
else
  
set @flag='The directory "'+@databaseName+'_'+@month1+'-'+@day1+'" has been in, backup database unsuccessful.' 

 
print @flag  
END
END
GO

 

作業:delete_db_backupfile2pc @databaseName='databaseName',@filepath='filepath'

CREATE PROCEDURE dbo.delete_db_backupfile2pc

@databaseName nvarchar(100)=null,
@filepath     nvarchar(125)=null

AS
DECLARE
 
@year1   varchar(4),
 
@month1   varchar(2),
 
@day1   varchar(2),
 
@sqlstr   varchar(2000),
 
@flag varchar(255),
 
@proc_result tinyint /*返回系統存儲過程xp_cmdshell運行結果*/
begin

 
if @databaseName = null or @filepath = null 
 
set @flag='Variable Error!'
 
else
  
begin             

--保存7天的數據
 SET @month1 =substring(convert(varchar,datepart(mm,getdate()-7)),1,2)
 
SET @day1=substring(convert(varchar,datepart(dd,getdate()-7)),1,2)

 
-- if len(@month1)<2 set @month1 = '0' + @month1 /* 不足兩位的前面加零 */
 -- if len(@day1)<2 set @day1 = '0' + @day1 

 
set @sqlstr='dir '+@filepath+@databaseName+'_'+@month1+'-'+@day1
 
EXEC @proc_result = master..xp_cmdshell @sqlstr,no_output

 
if (@proc_result=0)  /*系統存儲過程xp_cmdshell返回代碼值:0(成功)或1(失敗)*/
  
begin
   
set @sqlstr='del '+@filepath+@databaseName+'_'+@month1+'-'+@day1+' /q'
   
exec master..xp_cmdshell @sqlstr,no_output    --刪除目錄下的文件
   set @sqlstr='rd '+@filepath+@databaseName+'_'+@month1+'-'+@day1
   
exec master..xp_cmdshell @sqlstr,no_output   --刪除目錄
   set @flag='Delete file successful!'
  
end
 
else
  
set @flag='Can not find "'+@filepath+@databaseName+'_'+@month1+'-'+@day1+'" file!'
 
end 
  
print @flag 
end
GO
發佈了46 篇原創文章 · 獲贊 3 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章