Механизм восстановления SQL сервера - PullRequest
1 голос
/ 02 июня 2011

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

Иногда служба MSSQLSERVER зависала по неизвестной причине, и мое приложение также зависало. Я хочу создать механизм восстановления SQL, в котором я проверяю состояние sqlconnection, прежде чем писать в базу данных, но как мне это сделать?

Я пытался остановить службу MSSQLSERVER и sqlconnection.State всегда открыт, даже когда служба MSSQLSERVER остановлена.

Ответы [ 4 ]

1 голос
/ 02 июня 2011

Общая стратегия проверки состояния соединения перед вызовом команды SQL принципиально не будет работать.Что произойдет, если служба выйдет из строя после проверки вашего соединения, но перед тем, как вы вызовете команду SQL?

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

1 голос
/ 02 июня 2011

Во-первых: исправьте вашу реальную проблему.SQL Server должен быть очень, очень стабильным.

Второе: рассмотрите возможность использования MSMQ (или SQL Service Broker) как на клиентском приложении, так и на сервере для постановки в очередь обновлений.

0 голосов
/ 02 ноября 2016

Вручную это очень сложно восстановить поврежденную базу данных sql, особенно для тех, кто не является технически надежным. Эти типы людей могут использовать любое стороннее приложение. Много доступно на Google. Хорошо, что многие из них предлагают бесплатную пробную версию, в бесплатной версии вы можете восстановить свою базу данных и увидеть предварительный просмотр восстановленных исходных результатов. Вот приложение, которое я получил от Google. http://www.softmagnat.com/sql-database-recovery.html

0 голосов
/ 02 июня 2011

Я думаю, что выбранный вами подход не очень хорош.

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

Если ваше приложение является службой Windows внутри и имеет какой-то запланированный таймер, вы просто убедитесь, что ваша служба не дает сбоя, обрабатывая SqlExcpetion. Повторите попытку, пока сервер не будет запущен.

Кроме того, вы можете использовать распределенные транзакции. Чтобы гарантировать целостность процедуры копирования, но нужно ли вам это или нет, зависит от требований.

[Изменить] В ответ на повторный вопрос.

var attemptNumber = 0;
while (true)
{
    try
    {
        using (var connection = new SqlConnection())
        {
            connection.Open();

            // do the job
        }
        break;
    }
    catch (SqlException exception)
    {
        // log exception
        attemptNumber++;
        if (attemptNumber > 3)
            throw; // let it crash
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...