Для резервного копирования вы, вероятно, хотите использовать 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 Я думаю, вы можете очистить пул соединений (так что ... перехватить ошибку, очистить пул соединений , откройте соединение, попробуйте команду еще раз ... некрасиво, но возможно выполнимо).