Программно отключить базу данных SQL Server для копирования файла mdf - PullRequest
6 голосов
/ 16 апреля 2009

У меня есть небольшая база данных SQL Server, которую мне нужно скопировать по команде - мне нужно иметь возможность в любой момент взять файлы mfd и ldf, скопировать их, сжать их и сделать доступными для конечного пользователя .

В настоящее время это возможно вручную:

1) Вход на сервер SQL через удаленный рабочий стол

2) Отключение базы данных через SQL Management Studio. Мне нужно поиграть с комбинацией установки базы данных на single_user и / или перезапуска службы, чтобы я мог отключить ее, поскольку сервер приложений обычно подключается к ней.

3) В автономном режиме я прохожу файловую систему и копирую файлы mdf и ldf.

4) Я заново присоединяю базу данных через SQL Management Studio

5) Я заархивировал скопированные файлы и перенес их на FTP-сервер, чтобы люди, которым они нужны, могли получить их.

Это ужасный, неэффективный процесс. Это не просто вопрос необходимости схемы, а скорее необходимость людей работать со снимками реальных производственных данных на своих локальных машинах с целью разрушительного эксперимента. К счастью, zip-база данных очень мала - возможно, 30 мегабайт с журналом.

Так что в идеале я хотел бы создать страницу в веб-приложении ASP .NET, в которой есть кнопка, которую пользователь может нажать, чтобы инициировать упаковку текущей базы данных в zip-файл, а затем я просто предоставил бы ссылка на скачивание файла.

Ответы [ 6 ]

9 голосов
/ 16 апреля 2009

Почему бы не сделать обычное резервное копирование (это легко сделать с помощью команды sqlcom) и добавить функцию, позволяющую пользователям легко восстанавливать этот файл резервной копии одним нажатием кнопки?

  • Вы можете сделать резервную копию базы данных с помощью sql-команд
  • Вы можете выложить и заархивировать файл резервной копии с помощью команд sql
  • Вы также можете автоматически выложить и скопировать файл резервной копии на веб-сервер.

Что конечные пользователи используют для потребления вашей базы данных? Winform-программа? Тогда легко сделать все одним нажатием кнопки для пользователя.

Вот пример кода для этого:

Declare @CustomerID int
declare @FileName nvarchar(40)
declare @ZipFileName nvarchar(40)
declare @ZipComand nvarchar(255)


set @CustomerID=20 --Get from database instead in real life application
SET @FileName='c:\backups\myback'+ cast(@customerID as nvarchar(10))+'.bak'
SET @ZipFileName='c:\backups\myback'+ cast(@customerID as nvarchar(10))+'.zip'

--Backup database northwind
backup database northwind to DISK=@FileName

--Zip the file, I got a commanddriven zip.exe from the net somewhere.
set @ZipComand= 'zip.exe -r '+@ZipFileName+' '+@FileName
EXEC xp_cmdshell @zipcomand,NO_output

--Execute the batfile that ftp:s the file to the server
exec xp_cmdshell 'c:\movetoftp.bat',no_output

--Done!

Вы должны иметь файл movetoftp.bat, который содержит это (смените ftp-сервер на свой):
ftp -s: ftpcommands.txt ftp.myftp.net

И у вас должен быть файл ftpcommands.txt, содержащий это (вы можете создать этот файл динамически, используя только правильный zip-файл с помощью sqlcommands, но я позволю вам сделать это самостоятельно):

ftpusername
ftppassword
двоичный

подскажите mput c: \ backups \ *. zip
выйти

8 голосов
/ 16 апреля 2009

Посмотрите на диалоговые окна, которые вы используете в SQL Management Studio, вверху каждого есть кнопка, которая сгенерирует скрипт для выполнения действия. Это быстрый способ узнать, как сделать это в SQL, который можно выполнить из соединения с базой данных.

например. отсоединить базу данных db1:

EXEC master.dbo.sp_detach_db @dbname = N'db1'
2 голосов
/ 16 апреля 2009

Легко - войдите в SMO «Объекты управления SQL», которые поставляются с SQL Server - хорошие классы C # / VB.NET и методы для всего этого.

См .: SMO - управляйте SQL Server!

или

Резервное копирование и восстановление базы данных SQL Server 2005 с использованием C # и .NET 2.0

Марк

0 голосов
/ 03 января 2015

Первое подключение к SQL-серверу без присоединения какого-либо файла БД и без использования имени базы данных.

ConnectionString = @"Data Source=XXX;Integrated Security=True;Connect Timeout=30";

Примечание: XXX =. ИЛИ. \ SQLEXPRESS ИЛИ. \ MSSQLSERVER ИЛИ (локальный) \ SQLEXPRESS ИЛИ (локальный db) \ v11.0 & ...

затем в разделе Query Detach your DB file.

"ALTER DATABASE [your DB] SET OFFLINE WITH ROLLBACK IMMEDIATE \n\r exec sp_detach_db @dbname = [your DB]";

Хорошо.

Мой пример кода:

sql_connect1.ConnectionString = @"Data Source=.\sqlexpress;Integrated Security=True;Connect Timeout=30";
sql_command.CommandText = "ALTER DATABASE [IRAN] SET OFFLINE WITH ROLLBACK IMMEDIATE \n\r exec sp_detach_db @dbname = [IRAN]";
                  sql_command.Connection = sql_connect1;
                  sql_connect1.Open();
                  sql_command.ExecuteNonQuery();
                  sql_connect1.Close(); 
0 голосов
/ 17 апреля 2009

Я бы использовал SQL Dumper консольную версию и сжал дамп sql.

ИМХО, всегда лучше иметь текстовую копию вместо двоичного файла. Если что-то идет не так, по крайней мере, вы можете переписать свои данные вручную, потому что вы можете прочитать их.

0 голосов
/ 16 апреля 2009

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

Причина отключения базы данных делает ее недоступной для других.

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