¿Cómo puede SQL Server enviar un mensaje de error por correo electrónico cuando el editor de replicación no puede conectarse a un sistema de suscriptor?

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

Pregunta

Tenemos varias ubicaciones remotas donde hemos configurado la replicación de SQL Server 2005. A veces, el editor no puede replicar debido a varias razones como

1) problemas de red,

2) cierre incorrecto del suscriptor,

3) cambio en las contraseñas de dominio,

4) cambio en las contraseñas SQL,

5) falla al encender el sistema del suscriptor.

¿Hay alguna manera de hacer que el servidor SQL envíe un correo electrónico al administrador cuando esto suceda para que pueda verificarlo?

Gracias Chak.

¿Fue útil?

Solución

La forma en que normalmente manejo esto es modificando los trabajos del Agente SQL que son responsables de iniciar / ejecutar los agentes de replicación (dependiendo de su topología de replicación, tendrá una variedad de ellos en lugares potencialmente diferentes). Simplemente agregue un paso de trabajo a los trabajos de agente apropiados (es decir, agente de lector de registro, agente de distribución, agente de fusión, agente de cola, etc.) después del "agente de ejecución". paso que se ejecuta si / cuando ese paso se completa / falla (dependiendo de si está utilizando o no una programación continua).

Por ejemplo, si tengo una configuración de publicación push unidireccional transaccional, el agente de distribución se ejecutará en el distribuidor. Si me conecto con el distribuidor y encuentro el trabajo del Agente SQL responsable de ejecutar el agente de distribución para esta publicación, puedo modificar el trabajo y agregar un paso para enviar un correo electrónico a un grupo en particular si el "agente de ejecución" el paso falla / se completa. Si estoy usando una programación de replicación continua, simplemente agregaré el paso al correo electrónico si el "agente de ejecución" el paso finaliza (ya que quiero recibir una notificación si el agente se detiene por algún motivo). Si estoy usando una programación no continua, es posible que el paso de correo electrónico se ejecute solo en caso de falla del "agente de ejecución". paso. Incluso puede configurar este " correo electrónico " paso para enviar un correo electrónico, haga una pausa por un momento, luego intente reiniciar el agente automáticamente (simplemente configurando el paso para "ir al paso 1" en caso de éxito ").

Aquí hay una captura de pantalla que muestra cómo son los pasos del trabajo para un agente de distribución configurado como describo anteriormente:

 agente de distribución configurado con notificar, pausar, reiniciar paso

Notarás en la imagen de arriba que he agregado un paso llamado "Notificar, pausar, volver a intentar" que se ejecutará cada vez que el agente se detenga (éxito o falla; esto es intencional ya que estoy usando un programa de replicación continua y simplemente quiero saber cuando el agente de distribución no se está ejecutando por cualquier razón). Este paso básicamente envía un correo electrónico a un grupo específico, espera uno o dos minutos y luego vuelve a iniciar el agente. Puede agregar código para hacer lo que quiera, incluido el registro, reiniciar solo un cierto número de veces en un cierto intervalo de tiempo, etc. Es fácil de escribir y repetir para cualquier número de agentes, publicaciones, etc. (Tengo secuencias de comandos para garantizar cualquier nuevo el agente de replicación en cualquier tipo de topología incluye este tipo de configuración; entonces es simplemente cuestión de agregarlos a una herramienta de lanzamiento o programar la ejecución, dependiendo de cómo se implemente en su entorno).

Otros consejos

En cuanto a la detección de problemas del agente, desea saber cuándo se detiene el lector de registros y el distribuidor. La mía también es una replicación continua como chadhoc, pero me resulta más fácil usar una alerta para decirme si los agentes están detenidos.

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 

Los errores de validación / sincronización no son tan fáciles de detectar. Puede configurar un trabajo nocturno para ejecutar sp_publication_validation y configure otra alerta en " Error de validación " ;.

No sé mucho acerca de la replicación específicamente, pero sp_readerrorlog es muy procedimiento almacenado útil que le permite acceder a los registros de la base de datos desde la instancia de la base de datos. Si es necesario, puede permitirle responder de manera más adecuada en función de los mensajes de error específicos en lugar de solo ramas de ÉXITO / FALLO de un trabajo de agente. Por supuesto, también puede enviar un correo electrónico directamente desde un proceso almacenado, personalizando a los destinatarios en función de quién puede responder mejor al error (o la hora de los coordinadores de turnos día - día / noche, por ejemplo).

También quizás sería más apropiado enviar un correo electrónico si el trabajo tiene éxito en lugar de fallar, ¿considerando que sus posibles fallas incluyen la desconectividad de la red? Es posible que desee configurar una regla de intercambio para supervisar esta bandeja de entrada y enviar una notificación de error a su administrador si no recibe un mensaje de éxito esperado ... los humanos son muy buenos para filtrar el estímulo constante y la falta de un mensaje de éxito podría perderse fácilmente. El intercambio, por otro lado, es siempre (generalmente) vigilante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top