SQL Server SMO – Резервное копирование – Как определить отказ / успех?

Если вы выполняете резервное копирование с помощью SMO, после успешного завершения я тестирую SqlError для null, считая, что резервная копия завершена без ошибок:

введите описание изображения здесь

Но, как вы можете видеть, это фактически возвращает ошибку класса 0 номер 3014, что означает успех.

Итак, вопрос:

В: Как я могу узнать, успешно ли выполнена резервная копия или нет, и как я должен обрабатывать эти сообщения и состояния чисто?

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

Я согласен, что есть несколько «gotchas», и я лично считаю, что события Microsoft SMO плохо реализованы, так как ServerMessageEventArgs содержит ошибку свойства, которая не всегда содержит информацию об ошибке, но сообщения об успешных операциях!

В качестве примера: «Ошибка» с кодом 4035 является информационным сообщением. Не ошибка. «Ошибка» с кодом 3014 представляет собой информационное сообщение, которое происходит при успешном завершении. Не ошибка

Также обратите внимание, что событие Information не всегда происходит, когда произошла ошибка. Это действительно происходит, когда SQL Server отправляет сообщение, которое может быть информацией об успешной операции

Я также обеспокоен неправильной обработкой ошибок / успехов, но проверка sqlError как Null – это плохая идея, поскольку она никогда не будет нулевой и всегда будет содержать сообщение об успешной работе или ошибке. И если предположить, что информационное событие происходит, когда есть ошибка, это также плохая идея .

Я предлагаю обрабатывать ошибки через SqlError.Number и в зависимости от события SMO, которое оно было вызвано.

Я создал следующий код для создания резервной копии базы данных. Это в VB.NET, но в C # было бы похоже. Он получает необходимые параметры, включая делегат, где вызывать события (для обработки в графическом интерфейсе), ход отчета о процентах и ​​обработке ошибок в зависимости от инициируемого события и SqlError.Number, как указано

Public Sub BackupDatabase(databaseName As String, backupFileFullPath As String, optionsBackup As OptionsBackupDatabase, operationProgress As IProgress(Of Integer), operationResult As Action(Of OperationResult)) Implements IDatabaseManager.BackupDatabase Dim sqlBackup As New Smo.Backup() sqlBackup.Action = Smo.BackupActionType.Database sqlBackup.BackupSetName = databaseName & " Backup" sqlBackup.BackupSetDescription = "Full Backup of " & databaseName sqlBackup.Database = databaseName Dim bkDevice As New Smo.BackupDeviceItem(backupFileFullPath, Smo.DeviceType.File) sqlBackup.Devices.Add(bkDevice) sqlBackup.Initialize = optionsBackup.Overwrite sqlBackup.Initialize = True sqlBackup.PercentCompleteNotification = 5 AddHandler sqlBackup.PercentComplete, Sub(sender As Object, e As PercentCompleteEventArgs) operationProgress.Report(e.Percent) End Sub AddHandler sqlBackup.Complete, Sub(sender As Object, e As ServerMessageEventArgs) Dim sqlMessage As SqlClient.SqlError = e.Error Dim opResult As New OperationResult() Select Case sqlMessage.Number Case 3014 opResult.operationResultType = OperationResultType.SmoSuccess opResult.message = "Backup successfully created at " & backupFileFullPath & ". " & sqlMessage.Number & ": " & sqlMessage.Message Case Else opResult.operationResultType = OperationResultType.SmoError opResult.message = "ERROR CODE " & sqlMessage.Number & ": " & sqlMessage.Message End Select operationResult.Invoke(opResult) End Sub AddHandler sqlBackup.NextMedia, Sub(sender As Object, e As ServerMessageEventArgs) Dim sqlMessage As SqlClient.SqlError = e.Error Dim opResult As New OperationResult() opResult.operationResultType = OperationResultType.SmoError opResult.message = "ERROR CODE: " & sqlMessage.Number & ": " & sqlMessage.Message operationResult.Invoke(opResult) End Sub AddHandler sqlBackup.Information, Sub(sender As Object, e As ServerMessageEventArgs) Dim sqlMessage As SqlClient.SqlError = e.Error Dim opResult As New OperationResult() Select Case sqlMessage.Number Case 4035 opResult.operationResultType = OperationResultType.SmoInformation opResult.message = sqlMessage.Number & ": " & sqlMessage.Message Case Else opResult.operationResultType = OperationResultType.SmoError opResult.message = "ERROR CODE " & sqlMessage.Number & ": " & sqlMessage.Message End Select operationResult.Invoke(opResult) End Sub Try sqlBackup.SqlBackupAsync(smoServer) Catch ex As Exception Throw New BackupManagerException("Error backing up database " & databaseName, ex) End Try End Sub 

Я могу ошибаться, но я считаю, что Complete стрельба по событию является основным показателем успешности резервного копирования – ошибки будут сообщаться через событие Information .

Поскольку класс ошибки равен 0 (или любому значению ниже 10), это указывает на то, что это информационное сообщение, а не фактическая ошибка ( Error несколько неназванная). И 3014 определяется как сообщение, которое отправляется при успешной резервной копии.

Я не уверен, что другие «gotchas» вас беспокоят, так как вы их не задокументировали.

  • Как надежно определить, какие компоненты SQL Server 2008 установлены, используя C #?
  • Проверьте, запущен ли SQL Server Agent из кода?
  • Исключение создания транзакции после запуска резервного копирования sql-сервера через SMO
  • Запуск скрипта установки SQL с SMO. Необходимы альтернативные решения
  • Добавление пользователя и пользователя на SQL Server без использования SMO
  • Могу ли я заставить SQL SMO использовать READ UNCOMMITTED изоляцию?
  • Как получить возвращаемое значение из сообщения системы Sql Server?
  • Используя C # и SMO, как мне добавить резервное устройство на SQL Server?
  • Модульные тесты для сценариев восстановления SMO Powershell
  • Не удалось загрузить файл или сборку «Имя файла Microsoft.SqlServer.BatchParserClien.dll
  • Как установить параметры базы данных с помощью SMO SQL Server и powershell из хэша?
  • Interesting Posts

    Производительность IIS

    sum (DATALENGTH), возвращающая ошибку «Арифметическое переполнение»

    Сравнение времени SQL Server со временем до полуночи

    SQL Server 2005 с пространствами имен XML – запрос нескольких узлов и свойств

    Как получить более одной записи с помощью SqlDataReader?

    Нужно ли мне <> после SqlQuery <> (sql, parameters); когда он ничего не возвращает?

    Что означают множественные результаты синтаксического анализа и компиляции в статистическом времени?

    Оптимизация SQL-запроса с несколькими объединениями

    Причина создания хранимой процедуры для отказа, если ссылаться на несуществующие таблицы / столбцы

    Поиск специальных символов SQL Server 2008 R2

    Использование SQL Server в качестве хранилища изображений

    Есть ли элемент управления WPF, который позволяет подключаться к базе данных SQLSERVER?

    SQL Server: как я могу копировать данные из одной таблицы в другую таблицу без добавления символов «e +» в результаты

    Группа MSSQL до изменения типа

    SSIS, как перенаправить строки в OLEDB Destination, когда включена опция быстрой загрузки, и максимальный размер фиксации вставки установлен на ноль

    Давайте будем гением компьютера.