Sql server 恢复Sql Server数据库后启用代理
我有一个启用了ServiceBroker的数据库。然后,我想在程序中从其他数据库的备份中恢复我的数据库,但在恢复(我在现有数据库名称上恢复)后,我的方法whitch enables Service Broker会出现以下错误:Sql server 恢复Sql Server数据库后启用代理,sql-server,sql-server-2008,database-restore,service-broker,Sql Server,Sql Server 2008,Database Restore,Service Broker,我有一个启用了ServiceBroker的数据库。然后,我想在程序中从其他数据库的备份中恢复我的数据库,但在恢复(我在现有数据库名称上恢复)后,我的方法whitch enables 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
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();
}
}
我应该在这里修复什么?有什么建议吗?每个数据库都有一个唯一的ID供Service Broker使用。该ID在Sql Server实例中的所有数据库中都必须是唯一的(当然,它在全局上应该是唯一的,但Sql Server没有强制执行该ID的方法)。还原数据库时,您可以选择禁用还原数据库中的Service Broker,使用备份数据库的GUID启用它(以便它可以从备份数据库接管消息处理),或为其分配新的GUID。您正在尝试执行第二个选项,但旧数据库仍然存在,并且遇到GUID冲突
有关更多信息,请参阅。我找到了一个非常简单的解决方案-只需简单地分配新的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();
}
}
记下这些选项
ALTER DATABASE mydb SET ENABLE_BROKER
ALTER DATABASE mydb SET DISABLE_BROKER
ALTER DATABASE mydb SET NEW_BROKER
如果您得到的是这样的东西,并且已经启用了具有相同ID的Service Broker,那么请选择新的\u Broker
ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
这将创建新的service broker运行此查询以找出哪些其他数据库正在使用与您正在使用的数据库相同的service broker(例如,对于名为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
name, is_broker_enabled, service_broker_guid
DATABASE_NAME, 1, ASJCBUHBC-7UIOSUI-IUGGUI87-IUGHUIG
然后运行以下查询以获取数据库的新代理
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_OTHER, 1, KBHDBVJH-SDVHIOHD-SODIVDIOH-UHDSV
DATABASE_NAME_ANOTHER, 0, KBHDBVJH-SDVHIOHD-SODIVDIOH-UHDSV
DATABASE_NAME, 0, KBHDBVJH-SDVHIOHD-SODIVDIOH-UHDSV
name, is_broker_enabled, service_broker_guid
DATABASE_NAME, 1, ASJCBUHBC-7UIOSUI-IUGGUI87-IUGHUIG
杀戮过程很激烈,杀戮不一定是立即的。最好将
与立即回滚一起使用
。