Включение брокера после восстановления базы данных 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();
}
}
Что я должен здесь исправить? Любые предложения?
Ответы
Ответ 1
Я нашел очень простое решение для этого: просто попробуйте назначить нового сервис-брокера, например:
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
сохраните примечание этих параметров
ALTER DATABASE mydb SET ENABLE_BROKER
ALTER DATABASE mydb SET DISABLE_BROKER
ALTER DATABASE mydb SET NEW_BROKER
Если вы получаете что-то вроде этого, это уже включенный сервисный брокер с тем же идентификатором, идите в NEW_BROKER
Ответ 3
ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
Это создаст новый сервисный брокер
Ответ 4
Каждая база данных имеет уникальный идентификатор, используемый Service Broker. Этот идентификатор должен быть уникальным для всех баз данных в экземпляре сервера Sql (ну, он должен быть уникальным в глобальном масштабе, но Sql Server не имеет возможности обеспечить его выполнение). Когда вы восстанавливаете базу данных, у вас есть возможность отключить Service Broker в восстановленной базе данных, включив ее с GUID резервной базы данных (чтобы она могла перехватить обработку сообщений из резервной базы данных) или назначить ей новый GUID, Вы пытаетесь сделать второй вариант, пока у вас все еще есть старая база данных, и вы столкнулись с конфликтом GUID.
Подробнее см. здесь.
Ответ 5
Запустите этот запрос, чтобы узнать, какие другие базы данных используют тот же сервисный брокер, что и база данных, которую вы используете (например, для базы данных под названием 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