【问题标题】:Copy SQL Server MDF and LDF files while server is in use在服务器使用时复制 SQL Server MDF 和 LDF 文件
【发布时间】:2011-12-30 15:26:52
【问题描述】:

我正在使用以下代码将文件从一个文件夹复制到另一个文件夹...

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 并复制文件,然后重新启动服务器?

【问题讨论】:

  • 你见过这个吗? devx.com/vb2themax/Tip/18459
  • 如果我是你,我会计划创建一个.sql 文件,其中包含将数据库文件备份到另一个文件夹的 T-SQL。使用 sqlcmd (msdn.microsoft.com/en-us/library/ms170572.aspx) 我更喜欢这个而不是篡改正在运行的 SQL Server 实例。
  • 干扰 sql sever 操作可能很糟糕
  • @JasonEvans 您能否详细说明您的备份方式...我是新手...欢迎任何帮助。
  • 为什么要复制.mdf.ldf 文件?为什么不进行“正常”备份并在其他地方恢复呢?

标签: sql vb.net file-io


【解决方案1】:

扩展我的评论 - 我将使用 T-SQL 命令构建一个 .sql 文件以将数据库备份到另一个位置,然后我可以在命令行中使用 sqlcmd 来运行备份 .sql文件。

因此,要构建.sql 文件,我将通过 SQL Server Management Studio 完成备份数据库的过程。以下是有关如何执行此操作的教程:

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

然后,在单击确定执行备份之前,单击备份窗口上的“脚本”按钮并选择“脚本操作到新查询窗口”。这将从备份数据库窗口生成设置的 SQL。将该 SQL 保存到一个文件中,您就完成了。

接下来是使用sqlcmd.exe 执行.sql 文件,以便随时备份数据库。这里有一个非常好的使用 C# 代码中的sqlcmd.exe 的例子:

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

我总是喜欢在不影响正在运行的 SQL Server 的情况下做这样的事情(除非它是在我的开发机器上运行的,我会很高兴地停止/启动服务)。如果您停止生产 SQL Server 服务以复制某些文件,您永远不会发生什么。可能非常昂贵,所以最好是安全的。

【讨论】:

    【解决方案2】:

    根据您使用的 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

    【讨论】:

    【解决方案3】:

    我在我的应用程序中使用 .mdf 文件...如果系统崩溃或格式化用户将丢失数据..因此如果用户将数据 (.mdf) 复制到其他驱动器。 .he/she 可以用包含所有数据的旧文件替换新的 .mdf 文件...如果我错了请纠正我...谢谢。

    这正是“正常”备份的用途。
    正如您自己注意到的,您可以通过简单地复制 .mdf.ldf 文件来备份 SQL Server 数据库,但缺点是您只能在 SQL Server 服务未运行时执行此操作.

    仅仅为了备份数据库而停止 SQL Server 服务并不是一个好主意,因为当服务停止时,您的用户无法访问数据库。

    可以在数据库运行时进行“正常”备份(通常是.bak 文件),因此无需在每次要进行备份时都停止 SQL Server。

    有几种方法可以进行备份:

    a) 在 SQL Server Management Studio 中手动操作:
    Jason Evans' answer中的第一个链接

    b) 如果您想定期进行备份(例如,每天一次),您需要使用 sqlcmd
    Jason Evans 在他的回答中也描述了这一点,但 IMO 有一种更简单的方法 - 您只需要两个文件,每个文件一行。见How to create jobs in SQL Server Express edition

    (如果您使用的是完整的 SQL Server 版本,而不仅仅是 Express,您可以改为 set up a Maintenance Task in Management Studio,但这在 SQL Server Express 中是不可能的,因此您必须像上面描述的那样手动完成)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多