significa script restoring restaurar restauracion respaldo recuperar recuperacion que para estado datos compatibilidad borrada sql-server sql-server-2008 database-restore service-broker

sql-server - script - restaurar base de datos sql server 2008



Habilitando el agente después de restaurar la base de datos del servidor SQLL (5)

Tengo DataBase con Service Broker habilitado. Luego quiero restaurar mi base de datos en el programa desde la copia de seguridad de otra base de datos, pero después de restaurar (restauro el nombre de la base de datos existente), mi método, que habilita a Service Broker, pone este error:

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.

Este es mi método:

public void TurnOnBroker() { if (!this.database.BrokerEnabled) { this.server.KillAllProcesses(this.database.Name); this.database.BrokerEnabled = true; this.database.Alter(); RefreshConnection(); } }

¿Qué debo arreglar aquí? ¿Alguna sugerencia?


Cada base de datos tiene una ID única utilizada por Service Broker. Esta ID debe ser única en todas las bases de datos en una instancia de Sql Server (bueno, debe ser única globalmente, pero Sql Server no tiene una manera de hacer cumplir eso). Cuando restaura una base de datos, tiene la opción de deshabilitar Service Broker en la base de datos restaurada, habilitándola con el GUID de la base de datos respaldada (para que pueda hacerse cargo del procesamiento de mensajes de la base de datos respaldada) o asignarle un nuevo GUID. . Está intentando hacer la segunda opción mientras aún tiene la base de datos anterior y se encuentra con un conflicto GUID.

Vea here para más información.


Ejecute esta consulta para averiguar qué otras bases de datos utilizan el mismo Service Broker que la base de datos que está utilizando (por ejemplo, para una base de datos llamada 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'');

... devoluciones ...

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

Luego, ejecute las siguientes consultas para obtener un nuevo agente para su base de datos ...

ALTER DATABASE DATABASE_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE; ALTER DATABASE DATABASE_NAME SET NEW_BROKER; ALTER DATABASE DATABASE_NAME SET MULTI_USER;

Ejecute la primera consulta nuevamente y su base de datos debe ser la única en la lista ...

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'');

... ahora vuelve ...

name, is_broker_enabled, service_broker_guid DATABASE_NAME, 1, ASJCBUHBC-7UIOSUI-IUGGUI87-IUGHUIG


Encontré una solución muy simple para eso, simplemente asigne un nuevo agente de servicio de manera simple, como esto:

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


mantén una nota de estas opciones

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

Si está obteniendo algo como esto, ya es un Service Broker habilitado con la misma ID, vaya a NEW_BROKER


ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE;

Esto creará el nuevo agente de servicios.