L'attivazione di mediatore dopo il ripristino dei database di SQL Server
-
28-09-2019 - |
Domanda
Ho DataBase con abilitato Service Broker. Poi voglio ripristinare nel database in programma dal backup di altri database, ma dopo il ripristino (I ripristinare il nome del database esistente), il mio metodo, tuute consente Service Broker, pone questo errore:
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.
Questo è il mio metodo:
public void TurnOnBroker()
{
if (!this.database.BrokerEnabled)
{
this.server.KillAllProcesses(this.database.Name);
this.database.BrokerEnabled = true;
this.database.Alter();
RefreshConnection();
}
}
Cosa devo risolvere qui? Eventuali suggerimenti?
Soluzione 4
Ho trovato una soluzione molto semplice per che- solo simlpy nuovo service broker assegnare, in questo modo:
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();
}
}
Altri suggerimenti
mantenere una nota di queste opzioni
ALTER DATABASE mydb SET ENABLE_BROKER
ALTER DATABASE mydb SET DISABLE_BROKER
ALTER DATABASE mydb SET NEW_BROKER
se sei sempre qualcosa di simile è già un abilitato Service Broker con lo stesso ID, andare per il NEW_BROKER
ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
Questo creerà il broker nuovo servizio
Ogni database ha un ID univoco utilizzato da Service Broker. Questo ID deve essere univoco in tutti i database in un'istanza di SQL Server (o meglio, dovrebbe essere univoco globale, ma SQL Server non hanno un modo per far rispettare quello). Quando si ripristina un database, si ha la possibilità di disattivare Service Broker nel database ripristinato, consentendo con il GUID del database di backup (in modo che possa prendere in consegna l'elaborazione dei messaggi dal database di backup) o assegnare un nuovo GUID . Stai cercando di fare la seconda opzione mentre hai ancora il vecchio database intorno e si esegue in conflitto GUID.
qui per maggiori informazioni .
Esegui questa query per scoprire quali altri database stanno usando lo stesso broker di servizio come il database in uso (ad esempio per un database chiamato 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');
... ritorna ...
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
Quindi eseguire le seguenti query per ottenere un nuovo mediatore per il database ...
ALTER DATABASE DATABASE_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE DATABASE_NAME SET NEW_BROKER;
ALTER DATABASE DATABASE_NAME SET MULTI_USER;
Eseguire nuovamente la prima query e il database dovrebbe essere l'unico nella 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');
... ora torna ...
name, is_broker_enabled, service_broker_guid
DATABASE_NAME, 1, ASJCBUHBC-7UIOSUI-IUGGUI87-IUGHUIG