【问题标题】:Enabling broker after Restoring Sql Server DataBase恢复 Sql Server 数据库后启用代理
【发布时间】:2010-08-16 06:43:40
【问题描述】:

我有启用了 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();
    }
}

我应该在这里解决什么问题?有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    记下这些选项

    ALTER DATABASE mydb SET ENABLE_BROKER
    
    ALTER DATABASE mydb SET DISABLE_BROKER
    
    ALTER DATABASE mydb SET NEW_BROKER
    

    如果您得到类似的东西已经是具有相同 ID 的已启用服务代理,请选择 NEW_BROKER

    【讨论】:

      【解决方案2】:
      ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE; 
      

      这将创建新的服务代理

      【讨论】:

        【解决方案3】:

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

        请参阅here 了解更多信息。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            我找到了一个非常简单的解决方案——只需简单地分配新的服务代理,如下所示:

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

            【讨论】:

            • 杀死进程是活泼的,杀死不一定是立即的。最好使用WITH ROLLBACK IMMEDIATE
            猜你喜欢
            • 1970-01-01
            • 2021-12-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多