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

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

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

Вопрос:

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

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

Ответы [ 5 ]

1 голос
/ 10 января 2009

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

0 голосов
/ 11 января 2009

Для резервного копирования вы, вероятно, хотите использовать xp_sqlmaint. У него есть удобная возможность удалять старые резервные копии, и он создает хороший файл журнала. Вы можете позвонить через что-то вроде: ИСПОЛНИТЬ [BakExpirationSchedule] ''

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

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

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

Для восстановления вам нужно уничтожить все соединения, кроме внутренних подключений к серверу sql. В основном берут результаты "exec sp_who" и для строк, которые совпадают с именем dbname и имеют статус, который не является "фоновым", и cmd, который не является одним из "SIGNAL HANDLER", "LOCK MONITOR", "LAZY WRITER" , "LOG WRITER", "CHECKPOINT SLEEP" делают "kill" на спиде (например: ExecuteNonQuery ("kill 1283")).

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

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

0 голосов
/ 10 января 2009

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

0 голосов
/ 10 января 2009

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

Учебник

0 голосов
/ 10 января 2009

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

...