最近公司的一台SQL SERVER服務器需要每天進行備份,備份完后需要把備份文件復制到另外一台服務器的其中一個磁盤進行保存,備份文件在本地服務器保留一天,一天后的自動刪除,遠程服務器的備份文件保存3天,3天后的文件自動刪除。
環境:
A服務器:windown 2008 server SQL Server2008
B服務器:windown 2000 server SQL Server2000
A服務器的SQL SERVER里面有三個數據庫需要備份的: A1、A2、A3 (每天進行全備,備份為:D:\Backup),備份完后需要把這些文件物理拷備至B服務器的 J 盤下在目錄db_backup下保存3天,3天后即刪除,A服務器的備份文件只保留1天,1天后即刪除。
實現方法:(目前自己找到的兩種方法)
1、在A服務器上為數據庫A1、A2、A3創建"維護計划",在維護計划里定義執行每天進行對三個庫進行全庫備份,備份完后,在A服務器創建shell腳本,通過windows的“任務計划程序”來定時copy文件至服務器B的J盤db_backup目錄保存。
2、在A服務器上的SQL SERVER的系統數據庫master創建一個存儲過程,存儲過程的功能包括備份A1、A2、A3數據庫,並且在執行完備份后,把備份文件復制到服務器B保存,然后再通過判斷條件,定時刪除服務器A與服務器B上的備份文件。
在這里我們選擇第二種方法來實現,步驟如下:
首先要測試兩台服務器的的連通性,使用ping 命令測試一下A與B相互之間是否能成功ping通,另外在A、B服務器上,檢查服務Computer Browser、Server、Workstation服務是否成功啟動,端口139、445是否有開啟,如果沒有的話,手動啟動服務以及開啟139、445的監聽端口,另外還有一點,要保證兩台服務器的“Microsoft的網絡的文件和打印機共享”服務有在網絡連接處勾選,如下:
上述條件都滿足后,我們可以先測試一下兩台機是否能正常copy文件,可以先在服務器A的其中一盤,比如D:\Backup目錄下創建一個1.txt的文本文件,把這個文件拷貝至服務器B的 j:\db_backup目錄內,首先我們在服務器A打開命令行,開始-->運行-->CMD,這里我們通過net use來創建服務器A與服務器B的連接:
1.在服務器A端,查看默認的共享有哪些,查看系統默認的共享以及當前用戶設置的共享名稱及路徑,如下
紅色框的表示,服務器A目前設置的共享名稱,后面跟是的共享路徑,這里我們需要把d:\Backup設置成共享,共享名為Database,執行如下命令:
net share Database=d:\Backup ,執行完后,再執行net share就可以看到剛才的共享設置是否成功。
(注意,設置文件夾共享之前,要把D盤先給共享出來,才能執行上面的這些步驟,共享D盤,net share d$=d:\)
2、同樣在服務器B也需要設置共享目錄,B的共享目錄為: j:\db_backup 共享名為newbackup$(共享名可以隨意取,不要與現有的共享名同名即可),同樣共享文件夾之前,需要先共享J盤,不然共享目錄是不會成功的,由於B用的是windows 2000 server,我們先手動把 j 盤設置成共享,如下:
net share j$=j:\
共享完成后,我們再共享j:\db_backup
net share newbackup$=j:\db_backup
共享完成后,我們即可在服務器A端測試copy命令是否能正常執行了,如下:
copy d:\Backup\1.txt \\172.17.1.10\newbackup$\ (中間有空格) 172.17.1.10為服務器B的IP地址
如果能復制成功,說明我們之前的配置成功了,就可以繼續往下執行了,如果不通,請仔細檢查設置、服務、端口、網絡等等。
3、在服務器A上的SQL SERVER的master創建如下存儲過程:
代碼如下:
CREATE proc Backup_DataBase_A1
as
Declare @strPsw varchar(50)
Declare @strUsr varchar(50)
Declare @strCmdShell varchar(300)
Declare @strDataBaseName varchar(20)
Declare @FullFileName Varchar(200)
Declare @FullFileName1 Varchar(200)
Declare @FullFileName2 Varchar(200)
Declare @FileFlag varchar(50)
Declare @FileFlag2 varchar(50)
DECLARE @FileFlag3 varchar(50)
Declare @ToFileName varchar(200)
Declare @SQLStr varchar(500)
Declare @SQLStr2 varchar(500)
Declare @SQLStr3 varchar(500)
Declare @FlagDel varchar(20)
--定義備份的數據庫名稱
Set @strDataBaseName='A1'
--定義本地備份文件的名稱
Set @FileFlag=@strDataBaseName + '_db_' + replace(convert(char(20),getdate(),112),' ','')
--定義本地1天前的備份文件名稱
Set @FileFlag3=@strDataBaseName + '_db_' + replace(convert(char(20),getdate()-1,112),' ','')
--定義遠程服務器3天前的備份文件名稱
Set @FileFlag2=@strDataBaseName + '_db_' + replace(convert(char(20),getdate()-3,112),' ','')
--設置遠程服務器的登錄域和用戶名
Set @strUsr='db-b7ca68c1260d\Administrator'
--設置遠程服務器登錄密碼
Set @strPsw='abc123'
--設置遠程服務器連接
Set @strCmdShell= 'net use \\172.17.1.10\j$ ' + @strPsw + ' /user:' +@strUsr
--設置本地備份文件名稱
Set @FullFileName='D:\Backup\'+@FileFlag+'.BAK'
--設置本地1天前的備份文件名稱
set @FullFileName1='D:\Backup\'+@FileFlag3+'.BAK'
--設置遠程服務器3天前的備份文件名稱
set @FullFileName2='\\172.17.1.10\j$\db_backup\'+@FileFlag2+'.BAK'
--設置遠程服務器保存備份文件目錄
Set @ToFileName='\\172.17.1.10\j$\db_backup\'
--設置為True時,即刪除備份,設置為False時,即不刪除備份文件
Set @FlagDel='True'
--設置從本地復制備份文件至遠程服務器的語句
Set @SQLStr='copy '+@FullFileName+' '+@ToFileName
--設置刪除本地1天前的備份文件
Set @SQLStr2='del ' +@FullFileName1
--設置刪除遠程服務器3天前的備份文件
Set @SQLStr3='del ' +@FullFileName2
--備份EliteUC數據庫
BackUp DataBase @strDataBaseName To Disk= @FullFileName with init
--連接遠程服務器
exec master..xp_cmdshell @strCmdShell
--復制備份文件至遠程服務器
exec Master..xp_cmdshell @SQLStr
--刪除1天前本地的備份文件
if (@FlagDel ='True')
exec master.. xp_cmdshell @SQLStr2
--刪除3天前遠程服務器備份文件
if (@FlagDel ='True')
exec master.. xp_cmdshell @SQLStr3
go
4、完成后,再創建一個作業來定時執行上面的存儲過程即可,調用存儲過程命令如下:
execute maste.dbo.Backup_DataBase_A1
5、至些,整個實現過程結束,只需要每天去檢查備份文件是否有正常刪除即可,如果能正常刪除,我們就只檢查作業每天執行是否成功就可以了。另外,當備份文件比較大時,可以考慮用FTP去傳輸,傳輸速度應該比這樣直接copy效率會快。
總結:實現此方法的關鍵是共享目錄的設置,以及net use命令的使用,容易出問題的地方也是這兩點,所以在配置時,要格外小心。