Включение брокера после восстановления базы данных Sql Server

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


запомните эти параметры

ALTER DATABASE mydb SET ENABLE_BROKER

ALTER DATABASE mydb SET DISABLE_BROKER

ALTER DATABASE mydb SET NEW_BROKER

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


ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE; 

это создаст новый Service broker


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

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


Я нашел очень простое решение для этого-просто simlpy назначьте новый Service broker, например:

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();
        }
    }

запустите этот запрос, чтобы узнать, какие другие базы данных используют тот же компонент Service broker, что и используемая база данных (например, для базы данных 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