Как мне запустить сценарии резервного копирования и восстановления базы данных из моего приложения winform?

StackOverflow https://stackoverflow.com/questions/431033

Вопрос

Я разрабатываю приложение для малого бизнеса, которое использует базу данных Sqlserver 2005.

Платформа:Платформа .Net framework 3.5;Тип приложения:приложение для Windows;Язык:C#

Вопрос:

Мне нужно взять и восстановить резервную копию из моего приложения.У меня есть необходимый скрипт, сгенерированный из SSME.

Как мне запустить этот конкретный скрипт (или скрипты) из моего приложения winform?

Это было полезно?

Решение

Вы можете запускать эти сценарии так же, как вы запускаете запрос, только вы подключаетесь не к базе данных, которую хотите восстановить, а к master вместо этого.

Другие советы

Если на компьютере, на котором запущено ваше приложение, установлены клиентские средства SQL Server, вы можете использовать sqlcmd.

Если вы хотите сделать это программно, вы можете использовать СМО

Учебник

Просто используйте свое подключение к базе данных (ADO, я полагаю?) и отправьте свои простые инструкции TSQL на сервер через это соединение.

Для резервного копирования вы, вероятно, захотите использовать xp_sqlmaint.У него есть удобная возможность удалять старые резервные копии, и он создает хороший файл журнала.Вы можете вызвать это с помощью чего-то вроде:ВЫПОЛНИТЬ master.dbo.xp_sqlmaint N"-S "[Имя_сервера]" [ServerLogonDetails] -D [имя_базы данных] -Rpt "[Резервное копирование]\BackupLog.txt " [RptExpirationSchedule] -CkDB -BkUpDB"[BackupArchive]" -ДИСК BkUpMedia [BakExpirationSchedule]"

(замените [квадратные скобки] подходящими значениями).

Также для резервного копирования вам может потребоваться создать резервную копию журнала транзакций.Что - то вроде:ЕСЛИ DATABASEPROPERTYEX((ВЫБЕРИТЕ db_name(dbid) ИЗ master..системные процессы, ГДЕ spid=@@SPID), "Восстановление") <> "ПРОСТО" ВЫПОЛНИТЬ master.dbo.xp_sqlmaint N" -S "[имя_сервера]" [ServerLogonDetails] -D [имя_базы данных] -Rpt "[Резервное копирование]\BackupLog_TRN.txt " [RptExpirationSchedule] -BkUpLog "[BackupArchive]" -BkExt TRN -BkUpMedia ДИСК [BakExpirationSchedule]"

Я бы рекомендовал хранить фактические команды, которые вы используете, в таблице базы данных (по 1 строке на команду) и использовать какую-то схему замены шаблона для обработки настраиваемых значений.Это позволило бы легко вносить изменения в команды без необходимости развертывания нового кода.

Для восстановления вам нужно будет прервать все подключения, за исключением внутренних подключений sql server.В основном берут результаты "exec sp_who" и для строк, которые совпадают с dbname, и имеют статус, который не является "фоновым", и cmd, который не является одним из "ОБРАБОТЧИКОВ СИГНАЛОВ", "МОНИТОР БЛОКИРОВКИ", "ЛЕНИВЫЙ ПИСАТЕЛЬ", "ЖУРНАЛ ЗАПИСИ", "КОНТРОЛЬНАЯ ТОЧКА СНА", выполняют "уничтожение" для spid (например:ExecuteNonQuery("убить 1283")).

Вы захотите перехватить и игнорировать любые исключения из команды KILL.Ты ничего не можешь с ними поделать.Если восстановление не может быть продолжено из-за существующих подключений, это вызовет сообщение об ошибке.

Одной из опасностей, связанных с отключением соединений, является пул соединений ADO (больше для приложений asp.net, чем для приложений Windows).ADO предполагает, что соединение, полученное из пула соединений, является действительным...и он плохо реагирует на прерванные соединения.Следующая операция, которая выполняется по этому соединению, завершится неудачей.Я не могу вспомнить причину ошибки...возможно, вам удастся уловить только эту конкретную ошибку и обработать ее...также с 3.5, я думаю, вы можете очистить пул соединений (so...исправьте ошибку, очистите пул подключений, откройте соединение, повторите попытку команды...некрасиво, но может быть выполнимо).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top