恢复Sql Server数据库后启用代理

时间:2010-08-16 06:43:41

标签: sql-server sql-server-2008 database-restore service-broker

我有启用Service Broker的DataBase。然后我想在程序中从其他数据库的备份恢复我的数据库,但在恢复(我恢复现有数据库名称)之后,我的方法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 个答案:

答案 0 :(得分:61)

记下这些选项

ALTER DATABASE mydb SET ENABLE_BROKER

ALTER DATABASE mydb SET DISABLE_BROKER

ALTER DATABASE mydb SET NEW_BROKER

如果你得到这样的东西已经是一个具有相同ID的启用Service Broker,请转到NEW_BROKER

答案 1 :(得分:28)

ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE; 

这将创建新的服务代理

答案 2 :(得分:8)

每个数据库都有Service Broker使用的唯一ID。此ID在Sql Server实例中的所有数据库中必须是唯一的(嗯,它应该是全局唯一的,但Sql Server没有办法强制执行该操作)。还原数据库时,您可以选择在还原的数据库中禁用Service Broker,使用备份数据库的GUID启用它(以便它可以从备份的数据库接管消息处理)或为其分配新的GUID 。您仍然尝试使用旧数据库时遇到第二个选项,并且遇到GUID冲突。

有关详细信息,请参阅here

答案 3 :(得分:4)

我找到了一个非常简单的解决方案 - 只需要分配新的服务代理,就像这样:

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

答案 4 :(得分:2)

运行此查询以找出哪些其他数据库正在使用与您正在使用的数据库相同的服务代理(例如,对于名为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