2011-12-30 71 views
1

我使用下面的代碼從一個文件夾中的文件複製到另一個...我複製複製的SQL Server MDF和LDF文件,而服務器在使用

Public Shared Sub CopyFlashScriptFile(ByVal SourceDirectory As String, ByVal DestinationDirectory As String) 
    Try 
     Dim f() As String = Directory.GetFiles(SourceDirectory) 
     For i As Integer = 0 To UBound(f) 
     File.Copy(f(i), DestinationDirectory & "\" & System.IO.Path.GetFileName(f(i)),True) 
     Next 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 

的文件是數據庫文件,.mdf.ldf。應用程序正在使用哪些內容。現在的問題是,當我試圖複製它拋出正在被另一個進程使用了​​錯誤

文件中的文件

誰能幫助我?

是否有無論如何我可以編程方式停止SQL Server並複製文件,然後再次啓動服務器?

+0

你見過這個嗎? http://www.devx.com/vb2themax/Tip/18459 – 2011-12-30 15:33:51

+2

如果我是你,我會按照計劃創建一個'.sql'文件,其中包含T-SQL,它將數據庫文件備份到另一個文件夾中。使用'sqlcmd'(http://msdn.microsoft.com/en-us/library/ms170572.aspx)我寧願這樣做,而不是篡改正在運行的SQL Server實例。 – 2011-12-30 15:35:54

+0

干擾sql服務器操作可能會令人討厭 – 2011-12-30 15:39:25

回答

1

根據您使用的SQL版本,您可以使用Microsoft.SqlServer.Management.Smo.Wmi.Service對象來啓動和停止運行SQL實例的服務。

這樣做後,你應該能夠根據需要簡單地複製文件。

For SQL Server 2008

{ 
    //Declare and create an instance of the ManagedComputer 
    //object that represents the WMI Provider services. 
    ManagedComputer mc; 
    mc = new ManagedComputer(); 
    //Iterate through each service registered with the WMI Provider. 

    foreach (Service svc in mc.Services) 
    { 
     Console.WriteLine(svc.Name); 
    } 
//Reference the Microsoft SQL Server service. 
    Service Mysvc = mc.Services["MSSQLSERVER"]; 
//Stop the service if it is running and report on the status 
// continuously until it has stopped. 
    if (Mysvc.ServiceState == ServiceState.Running) { 
     Mysvc.Stop(); 
     Console.WriteLine(string.Format("{0} service state is {1}", Mysvc.Name, Mysvc.ServiceState)); 
     while (!(string.Format("{0}", Mysvc.ServiceState) == "Stopped")) { 
     Console.WriteLine(string.Format("{0}", Mysvc.ServiceState)); 
      Mysvc.Refresh(); 
     } 
     Console.WriteLine(string.Format("{0} service state is {1}", Mysvc.Name, Mysvc.ServiceState)); 
//Start the service and report on the status continuously 
//until it has started. 
     Mysvc.Start(); 
     while (!(string.Format("{0}", Mysvc.ServiceState) == "Running")) { 
     Console.WriteLine(string.Format("{0}", Mysvc.ServiceState)); 
     Mysvc.Refresh(); 
     } 
     Console.WriteLine(string.Format("{0} service state is {1}", Mysvc.Name, Mysvc.ServiceState)); 
     Console.ReadLine(); 
    } 
    else { 
     Console.WriteLine("SQL Server service is not running."); 
     Console.ReadLine(); 
    } 
} 

msdn

+0

我正在使用SQL Server Express 2008 – 2011-12-30 15:54:35

+0

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.wmi.service(v=SQL.100).aspx – msarchet 2011-12-30 15:55:04

+0

我的評論有鏈接到2008版的庫 – msarchet 2011-12-30 15:55:30

1

要擴大我的意見 - 我將建立一個與T-SQL命令備份數據庫到另一個位置.sql文件,然後我可以使用sqlcmd從命令行運行備份.sql文件。

因此,要構建.sql文件,我將通過SQL Server Management Studio備份數據庫的過程。這裏是如何做到這一點的教程:

http://www.serverintellect.com/support/sqlserver/database-backup-ssmse.aspx

然後,單擊OK來執行備份,請單擊「腳本」按鈕,備份窗口,選擇「操作腳本保存到新的查詢窗口」前。這將從備份數據庫窗口中生成您的設置的SQL。將該SQL保存到一個文件中,然後完成。

接下來是使用sqlcmd.exe執行.sql文件來隨時備份數據庫。有使用sqlcmd.exe從C#代碼在這裏的一個很好的例子:

http://geekswithblogs.net/thomasweller/archive/2009/09/08/automating-database-script-execution.aspx

我總是喜歡做這樣的東西,而不會影響運行SQL Server(除非它是我的dev的機器,在那裏我會運行一個高興地停止/開始服務)。如果您停止生產SQL Server服務來複制某些文件,您就不會發生什麼情況。可能會非常昂貴,如此安全。

1

我用我的應用程序的.mdf文件......在系統崩潰的情況下,或格式化用戶要鬆data..so如果用戶將數據複製(密度纖維板)一些其他驅動器..他/她可以用舊的那個具有所有數據的新的.mdf文件替換...糾正我,如果我錯了...謝謝。

這正是「正常」備份的用處。
正如你注意到你自己,你可以通過簡單地複製.mdf.ldf文件來備份SQL Server數據庫,但缺點是隻能在SQL Server服務未運行時執行此操作。

並且停止SQL Server服務僅用於備份數據庫不是一個好主意,因爲您的用戶在服務停止時無法訪問數據庫。

在數據庫運行時可以執行「正常」備份(通常是.bak文件),因此每次要備份時都不需要停止SQL Server。

有幾種方法如何做一個備份:

一)手動在SQL Server Management Studio中:如果你要定期做備份
看到Jason Evans' answer

B中的第一個鏈接)(比如說,每天一次),你需要使用sqlcmd
傑森埃文斯在他的回答中也描述了這一點,但國際海事組織有一個更簡單的方法 - 你只需要兩行文件,每行一行。見How to create jobs in SQL Server Express edition。 (如果您使用的是完整的SQL Server版本,而不是Express,則可以使用set up a Maintenance Task in Management Studio代替,但這在SQL Server Express中是不可能的,因此您必須像上述那樣手動執行此操作)。