In che modo SQL Server può inviare un messaggio di errore tramite e-mail quando l'editore di replica non riesce a connettersi a un sistema di abbonati

StackOverflow https://stackoverflow.com/questions/1824939

Domanda

Abbiamo diverse posizioni remote in cui è stata impostata la replica di SQL Server 2005. A volte l'editore non riesce a replicare a causa di vari motivi come

1) problemi di rete,

2) arresti impropri dell'abbonato,

3) modifica delle password del dominio,

4) modifica delle password SQL,

5) impossibile accendere il sistema di abbonamento.

Esiste un modo in cui possiamo fare in modo che SQL Server invii all'amministratore un'e-mail quando ciò accade in modo che possa controllare?

Grazie, Chak.

È stato utile?

Soluzione

Il modo in cui lo gestisco in genere è modificando i processi Sql Agent responsabili dell'avvio / esecuzione degli agenti di replica (a seconda della topologia di replica, ne avrete una varietà in luoghi potenzialmente diversi). È sufficiente aggiungere un passaggio di processo ai lavori dell'agente appropriato (ovvero agente di lettura log, agente di distribuzione, agente di unione, agente di coda, ecc.) Dopo "agente di esecuzione" passaggio che viene eseguito se / quando quel passaggio viene completato / fallito (a seconda che si stia utilizzando o meno un programma continuo).

Ad esempio, se ho una configurazione di pubblicazione push unidirezionale transazionale, l'agente di distribuzione sarà in esecuzione presso il distributore. Se mi connetto al distributore e trovo il lavoro Sql Agent responsabile dell'esecuzione dell'agente di distribuzione per questa pubblicazione, posso modificare il lavoro e aggiungere un passaggio per inviare un'e-mail a un particolare gruppo se "esegui agente" il passaggio fallisce / completa. Se sto utilizzando una pianificazione di replica continua, aggiungerò semplicemente il passaggio all'e-mail se l'agente "esegui agente" il passaggio termina (come voglio essere avvisato se l'agente si ferma per qualsiasi motivo). Se sto utilizzando una pianificazione non continua, potrei invece eseguire il passaggio della posta elettronica solo in caso di errore dell'agente "esegui agente". passo. Puoi anche configurare questa " email " passaggio per inviare un messaggio di posta elettronica, mettere in pausa per un po ', quindi provare a riavviare automaticamente l'agente (semplicemente configurando il passaggio su "vai al passaggio 1" in caso di successo ").

Ecco una schermata che descrive l'aspetto delle fasi del lavoro per un agente di distribuzione configurato come indicato sopra:

 agente di distribuzione configurato con notifica, pausa, riavvia passaggio

Noterai nella foto sopra che ho aggiunto un passaggio chiamato " Notifica, pausa, riprova " che verrà eseguito ogni volta che l'agente si arresta (esito positivo o negativo: ciò è intenzionale poiché utilizzo una pianificazione di replica continua e voglio semplicemente sapere ogni volta che l'agente di distribuzione non è in esecuzione per qualsiasi motivo). Questo passaggio sostanzialmente invia un'email a un gruppo specifico, attende un minuto o due, quindi riavvia l'agente. Puoi aggiungere il codice per fare quello che ti piace, inclusa la registrazione, il riavvio solo un determinato numero di volte in un determinato intervallo di tempo, ecc. È facilmente scriptato e ripetibile per qualsiasi numero di agenti, pubblicazioni, ecc. (Ho degli script per garantire qualsiasi nuovo l'agente di replica in qualsiasi tipo di topologia include questo tipo di configurazione - quindi è semplicemente una questione di aggiungerli a uno strumento di rilascio o pianificare l'esecuzione, a seconda di come si distribuisce nel proprio ambiente).

Altri suggerimenti

Per quanto riguarda il rilevamento dei problemi degli agenti, si desidera sapere quando il logreader e il distributore vengono arrestati. Anche la mia è una replica continua come Chadhoc, ma trovo più facile usare un avviso per dirmi se gli agenti sono fermati.

USE [msdb] 
GO 
EXEC msdb.dbo.sp_add_alert  
    @name=N'Distribution agent stopped',   
    @message_id=0,  
    @severity=0,  
    @enabled=1,   
    @delay_between_responses=2160, 
    @include_event_description_in=1,   
    @category_name=N'[Uncategorized]',  
    @performance_condition=N'MSSQL$MYDATABASE:Replication Agents|Running|Distribution|=|0', 
    @job_id=N'00000000-0000-0000-0000-000000000000' 
GO 
EXEC msdb.dbo.sp_update_notification 
    @alert_name=N'Distribution agent stopped',   
    @operator_name=N'Amit',  
    @notification_method = 1 

Gli errori di convalida / sincronizzazione non sono così semplici da rilevare. È possibile impostare un lavoro notturno per eseguire sp_publication_validation e imposta un altro avviso su " Validation Failed " ;.

Non so molto sulla replica in particolare, ma sp_readerrorlog è molto utile procedura memorizzata che consente di accedere ai log del DB dall'istanza del database. Se necessario, potrebbe consentire di rispondere in modo più appropriato in base ai messaggi di errore specifici anziché alle filiali SUCCESS / FAIL di un lavoro dell'agente. Ovviamente puoi anche inviare un'e-mail direttamente da un proc memorizzato, personalizzando i destinatari in base a chi può meglio rispondere all'errore (o, ad esempio, ai coordinatori del turno giorno / giorno / notte).

Inoltre, forse sarebbe più appropriato inviare un'e-mail se il lavoro ha esito positivo anziché esito negativo, considerando che i potenziali errori includono la disconnessione della rete? Potresti voler impostare una regola di scambio da parte tua per monitorare questa posta in arrivo e inviare una notifica di errore al tuo amministratore se non riceve un messaggio di successo previsto .... gli umani sono molto bravi a filtrare lo stimolo costante e la mancanza di un messaggio di successo potrebbe facilmente essere perso. Lo scambio d'altro canto è sempre (di solito) vigile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top