http://topic.csdn.net/u/20080709/10/9b299342-c509-4e8c-908f-982d186d4a99.html
前言
項目由於以前是把資料庫和主程式放在一台電腦上,所以出於安全目的現在要把資料庫和程式分離,把資料庫放到內網裡,不公布到外網上.這樣一般的資料庫操作都沒問題,就是備份與還原資料庫需要實現遠程備份與還原.
我實現的是用的資料庫的xpcmd命令,在主程式機器上臨時開一個區域網路共用資料夾,然後在遠端資料庫上開啟xpcmd來執行net use命令串連上共用,然後就可以按本在本機一樣還原備份.
簡單的思路就是這樣的,缺點就是很多資料庫會幹掉xpcmd用的那個dll,所以不是十全十美吧.
實現
下面就看下具體的實現過程:
1:在本機開一個共用資料夾
Code
//開啟本機共用
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.Arguments = "/c net share 共用的名稱(例如test)=要開啟共用的檔案夾(例如c:\\testfolder) ";
p.Start();
p.WaitForExit();
注意WaitForExit這個方法,開始的時候非常奇怪,就是程式啟動後的第二次備份總不能成功,原來是我們開共用時沒有等待net share 命令完全執行完就去執行net use這個共用資料夾,所以肯定不會成功了...
2:啟動遠端資料庫的xpcmdCode
//開啟xpcmd
string sql = "EXEC sp_configure 'show advanced options', 1\r\n" +
"RECONFIGURE \r\n" +
"EXEC sp_configure 'xp_cmdshell', 1; \r\n" +
"RECONFIGURE \r\n";//執行這個sql
3:執行net use命令引用主程式所在機器開啟的共用資料夾Code
string sql = "xp_cmdshell 'net use \\\\" + Dns.GetHostName() + "\\共用的名稱(例如test)= 使用者密碼 /user:domain\\使用者名稱 '; ";//執行這個sql
需要注意的就是這個Dns.GetHostName() ,我們用的是主機名稱來串連的,本來我們是要用內網ip的,但是機器的內網ip很不好擷取,有的還沒有內網ip,所以用的主機名稱,對於有防火牆的可能需要配置一下允許通過主機名稱來訪問.
4:上面已經通過xp_cmdshell串連上了遠程共用了,那麼下面的備份還是還原就都簡單了只要把以前的備份還原的路徑換成現在的"\\主機名稱\共用目錄名\備份或還原檔案"即可.例如備份的sql就是:Code
StringBuilder sql = new StringBuilder();
//備份到本地
sql.Append("BACKUP DATABASE [");
sql.Append(要備份的資料庫名稱);
sql.Append("] to disk='");
sql.Append("\\\\" + Dns.GetHostName() + "\\共用名稱");
sql.Append("\\");
sql.Append(備份的檔案名稱);
sql.Append("'");
執行這個sql即可.5:最後不要忘了關閉共用目錄和xp_cmdshellCode
//關閉共用
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.Arguments = "/c net share 共用名稱 /delete /y";
p.Start();
p.WaitForExit();
這裡要注意一下"/delete /y",因為執行這個delete命令時會提示輸入y或n來確定一下,所以這樣就直接通過提示了.
Code
//關閉xpcmd
string sqlcmd = "EXEC sp_configure 'show advanced options', 1; \r\n" +
"RECONFIGURE\r\n" +
"EXEC sp_configure 'xp_cmdshell', 0; \r\n" +
"RECONFIGURE \r\n";//執行這個sql
ok.