已經封裝成存儲過程了,如下:
create procedure RemoteBackup
as
begin
declare @datestr nvarchar(30)
declare @bakfilename nvarchar(50)
declare @bakpath nvarchar(50)
--時間字元串
set @datestr = convert(nvarchar(30), getdate(),121)
set @datestr = Left(@datestr,19)
set @datestr = replace(replace(replace(@datestr,'-',''),':',''),' ','')
--bak檔案路徑
set @bakfilename = N'CITAS_GDB_' + @datestr + '.bak'
set @bakpath = 'z:\' + @bakfilename
print @bakpath
--開始備份
--注意:(Z:後面要有一個空格)
exec master..xp_cmdshell 'net use z: \\192.168.20.54\Share\RemoteBackup userpassword /user:computename\username'
backup database CITAS_GDB to disk=@bakpath
exec master..xp_cmdshell 'net use z: /delete'
end
下面的說明,供參考-----
--你是否有足夠的權限?如果有足夠的權限,可以備份到本機
--如果有,可以用下面的方法,查詢分析器中操作:
-- 建立共享目錄
exec master.dbo.XP_cmdshell 'md c:\bak'
exec master.dbo.XP_cmdshell 'net share bak=c:\bak'
--進行資料備份
backup database 資料庫 to disk='c:\bak\備份.bak'
/*--以下操作在我的電腦中進行:
打開我的電腦,位址欄中輸入:
\\SQL伺服器的計算機名\bak\
複制裡面的備份.bak到你的電腦就行了
--我的電腦中的操作結束--*/
--删除備份生成的檔案
exec master..xp_cmdshell 'del c:\bak\備份.bak'
--删除共享
exec master.dbo.XP_cmdshell 'net share c:\bak /delete /y'
exec master.dbo.XP_cmdshell 'rd c:\bak'
--否則,你還是完全共享你本機的目錄,用下面的方法備份:
backup database 資料庫 to disk='\\你的計算機名\共享目錄名\備份檔案名'
---或通過映射網絡驅動器(這樣可以解決權限問題)
--1.映射
exec master..xp_cmdshell 'net use z: \\xz\c$ "密碼" /user:xz\administrator'
/*--說明:
z: 是映射網絡路徑對應本機的盤符,與下面的備份對應
\\xz\c$ 是要映射的網絡路徑
xz\administrator xz是遠端的計算機名,administrator是登陸的使用者名
密碼 上面指定的administrator使用者的密碼
--*/
--2.進行資料庫備份
backup database 資料庫名 to disk='z:\備份檔案名'
--3.備份完成後删除映射
exec master..xp_cmdshell 'net use z: /delete'
注意事項:
如果遇到通過網路上的芳鄰通路一切正常。在企業管理器裡對資料庫進行備份,備份檔案名寫入網絡路徑'\\20.1.250.83\share';系統卻提示“無法驗證該備份檔案位置是否存在。是否要使用該備份檔案位置?”點選确認後,系統提示“無法打開備份裝置,裝置出現錯誤或裝置脫機....”時,因該注意:SQL Server并不以Windows登入帳戶通路網絡共享,而是以SQL Server服務的啟動帳戶來通路。這時應該進入“管理工具-->服務-->MSSQLSERVER-->登入”将啟動服務的本地系統帳戶修改為本機管理者,重新啟動服務後,問題解決。
還應該注意:同樣的“本地系統”帳戶,在2000與2003裡的權限卻不盡相同,2000及以前的系統中的本地系統帳戶隻具備本地最高權限,而2003及以後的系統中,該賬戶在具備本機完全通路權限的同時,可以像其他域帳戶一樣通路網絡資源。是以在2003中,卻不用修改SQL服務的登入帳戶就能順利備份。
--------------------------------------
使用SQLSERVER的擴充存儲過程實作遠端備份與恢複
最近我在為公司的架構程式(以資料應用為導向的應用體系)做資料管理子產品,這個子產品的需求比較簡單:備份、恢複和清理日志。我公司的軟體基本上以C/S為基本架構,是以資料管理子產品中兩個主要的功能‘備份與恢複’都可能會在Client端操作,備份與恢複’的檔案也都有可能存儲在client端,因而這個資料管理子產品就必須能夠實作在遠端備份與恢複資料庫。
文章的前提闡述完了,就該說說如何具體實作吧。其實都很簡單,我想寫個遠端備份的測試執行個體
給大家看,就能夠很清楚的描述吧!
執行個體說明:
環境:win2k+sqlserver 2K+查詢分析器
SQLSERVER服務執行個體名稱:mainserver
需要備份的資料庫名稱: msdb
本地機器名稱(Client端):david
本地使用者:zf 密碼:123
本地域名:domain
本地提供備份需求的檔案夾:e:\test
第一步: 建立共享檔案夾
在程式代碼中調用(或者CMD視窗) net share test=e:\test
或者用NetShareAdd這個API
簡要說明:
net share : 是WINDOWS内部的網絡指令。
作用:建立本地的共享資源,顯示目前計算機的共享資源資訊。
文法:參見 net share /?
第二步: 建立共享信用關系
master..xp_cmdshell 'net use \\david\test 123 /user:domain\zf'
1:xp_cmdshell :是SQLSERVER的擴充存儲過程。
作用,以作業系統指令行解釋器的方式執行給定的指令字元串,
并以文本行方式傳回任何輸出。
文法:參見SQLSERVER聯機幫助
2:net use : 是WINDOWS内部的網絡指令。
作用,将計算機與共享資源連接配接或斷開,或者顯示關于計算機
連接配接的資訊。該指令還控制持久網絡連接配接。
文法:參見 net use /?
第三步:備份資料庫
backup database msdb to disk='\\david\test\msdb.bak'
這個不需要說明吧,文法參見SQLSERVER聯機幫助
第四步: 删除共享檔案夾
在程式代碼中調用(或者CMD視窗) net share test /delete
或者用NetShareDel這個API
結果:
已處理 1376 頁,這些頁屬于資料庫 'msdb' 的檔案 'MSDBData'(位于檔案 1 上)。
已處理 1 頁,這些頁屬于資料庫 'msdb' 的檔案 'MSDBLog'(位于檔案 1 上)。
BACKUP DATABASE 操作成功地處理了 1377 頁,花費了 3.653 秒(3.086 MB/秒)。
這樣mainserver伺服器上的msdb就備份到了david機器的E:\test\msdb.bak檔案了,使用起來很簡單吧?恢複資料庫操作也是一樣,隻要将第三個步驟的語句改為'restore database msdb from disk='\\david\test\msdb.bak'就可以啦。。你看完了也可以試試呀?!(最簡單的測試工具查詢分析器+CMD視窗)
備注:xp_cmdshell 這個擴充存儲過程隻能SA級别的使用者調用,而且是SQLSERVER的安全隐患之一,許多DBA都喜歡将其删除或者禁用,是以開發人員使用時要倍加小心哦。
文章中的例子隻是簡要的說明了應如何利用擴充存儲過程實作遠端備份與恢複,沒有涉及安全以及其他方面的考慮,希望讀者在代碼中自行完善。