Копирование файлов MDF и LDF SQL Server во время использования сервера - PullRequest
1 голос
/ 30 декабря 2011

Я использую следующий код для копирования файлов из одной папки в другую ...

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 и скопировать файлы, а затем снова запустить сервер?

Ответы [ 3 ]

1 голос
/ 30 декабря 2011

Чтобы расширить мой комментарий, я бы создал файл .sql с командой T-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 (если только он не запущен намоя машинка, где я с радостью остановлюсь / начну сервис).Просто никогда не произойдет, что произойдет, если вы остановите производственную службу SQL Server для копирования некоторых файлов.Может быть очень дорогостоящим, поэтому лучше быть в безопасности.

1 голос
/ 04 января 2012

Я использую файл .mdf в своем приложении ... в случае сбоя или форматирования системы пользователь потеряет данные ... поэтому, если пользователь скопирует данные (.mdf) на другой диск. Он / она может заменить новый файл .mdf старым, в котором есть все данные ... поправьте меня, если я ошибаюсь ... спасибо.

Это именно то, для чего предназначены "нормальные" резервные копии.
Как вы сами заметили, вы можете сделать резервную копию базы данных SQL Server, просто скопировав файлы .mdf и .ldf, но недостатком является то, что вы можете делать это только тогда, когда служба SQL Server не запущена.

А останавливать службу SQL Server только для резервного копирования базы данных не очень хорошая идея, поскольку ваши пользователи не могут получить доступ к базе данных, пока служба остановлена.

Выполнение «обычной» резервной копии (обычно файла .bak) можно выполнить во время работы базы данных, поэтому нет необходимости останавливать SQL Server каждый раз, когда вы хотите сделать резервную копию.

Существует несколько способов сделать резервную копию:

а) Вручную в SQL Server Management Studio:
см. первую ссылку в ответе Джейсона Эванса

б) Если вы хотите делать резервные копии регулярно (скажем, раз в день), вам нужно использовать sqlcmd.
Джейсон Эванс также описал это в своем ответе, но в IMO есть более простой способ - вам нужно всего два файла с одной строкой в ​​каждом. См. Как создавать задания в SQL Server Express edition .

(если вы использовали полную версию SQL Server, а не только Express, вы могли бы настроить задачу обслуживания в Management Studio вместо этого, но это невозможно в SQL Server Express, поэтому вам придется сделать это это вручную, как описано выше).

1 голос
/ 30 декабря 2011

В зависимости от того, какую версию SQL вы используете, вы можете использовать объекты Microsoft.SqlServer.Management.Smo.Wmi.Service для запуска и остановки службы, которая запускает экземпляр SQL.

После этого вы сможете просто копировать файлы по мере необходимости.

Для 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...