Включение посредника после восстановления базы данных Sql Server - PullRequest
30 голосов
/ 16 августа 2010

У меня есть база данных с включенным компонентом Service Broker.Затем я хочу восстановить свою базу данных в программе из резервной копии другой базы данных, но после восстановления (я восстанавливаю по существующему имени базы данных) мой метод, включающий компонент Service Broker, выдает следующую ошибку:

    Msg 9772, Level 16, State 1, Line 1
The Service Broker in database "ServeDB2" cannot be enabled because there is already an enabled Service Broker with the same ID.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.

Этомой метод:

public void TurnOnBroker()
{
    if (!this.database.BrokerEnabled)
    {
        this.server.KillAllProcesses(this.database.Name);
        this.database.BrokerEnabled = true;
        this.database.Alter();
        RefreshConnection();
    }
}

Что мне здесь исправить? Есть предложения?

Ответы [ 5 ]

61 голосов
/ 22 июня 2011

запомните эти опции

ALTER DATABASE mydb SET ENABLE_BROKER

ALTER DATABASE mydb SET DISABLE_BROKER

ALTER DATABASE mydb SET NEW_BROKER

, если вы получаете что-то подобное, это уже включен Service Broker с тем же идентификатором, перейдите к NEW_BROKER

29 голосов
/ 15 сентября 2014
ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE; 

Это создаст нового сервисного брокера

8 голосов
/ 16 августа 2010

Каждая база данных имеет уникальный идентификатор, используемый Service Broker.Этот идентификатор должен быть уникальным для всех баз данных в экземпляре Sql Server (ну, он должен быть уникальным в глобальном масштабе, но у Sql Server нет способа обеспечить это).При восстановлении базы данных у вас есть возможность отключить компонент Service Broker в восстановленной базе данных, включив его с GUID резервной копии базы данных (чтобы он мог взять на себя обработку сообщений из резервной копии базы данных), или назначить ему новый GUID,Вы пытаетесь сделать второй вариант, пока у вас все еще есть старая база данных, и вы сталкиваетесь с конфликтом GUID.

См. здесь для получения дополнительной информации.

4 голосов
/ 17 августа 2010

Я нашел очень простое решение для этого - просто назначьте нового сервисного брокера, например:

public void TurnOnBroker()
    {
        if (!this.database.BrokerEnabled)
        {
            this.server.KillAllProcesses(this.database.Name);

            string brokerCommand = String.Format("ALTER DATABASE {0} SET NEW_BROKER", this.database.Name);
            this.database.ExecuteNonQuery(brokerCommand);

            RefreshConnection();
        }
    }
2 голосов
/ 06 июня 2017

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

SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases 
WHERE service_broker_guid IN (SELECT service_broker_guid FROM sys.databases where name = 'DATABASE_NAME');

... возвращает ...

name, is_broker_enabled, service_broker_guid
DATABASE_NAME_OTHER, 1, KBHDBVJH-SDVHIOHD-SODIVDIOH-UHDSV
DATABASE_NAME_ANOTHER, 0, KBHDBVJH-SDVHIOHD-SODIVDIOH-UHDSV
DATABASE_NAME, 0, KBHDBVJH-SDVHIOHD-SODIVDIOH-UHDSV

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

ALTER DATABASE DATABASE_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE DATABASE_NAME SET NEW_BROKER;
ALTER DATABASE DATABASE_NAME SET MULTI_USER;

Выполните первый запрос еще раз, и ваша база данных должна быть единственной всписок ...

SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases 
WHERE service_broker_guid IN (SELECT service_broker_guid FROM sys.databases where name = 'DATABASE_NAME');

... теперь возвращает ...

name, is_broker_enabled, service_broker_guid
DATABASE_NAME, 1, ASJCBUHBC-7UIOSUI-IUGGUI87-IUGHUIG
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...