El proveedor desea ejecutar el trabajo de MSDB cada 5 minutos para la aplicación comercial

15

Tenemos un proveedor externo que intenta integrar 2 aplicaciones diferentes donde ambas bases de datos residen en nuestra instancia de SQL Server con más de 150 bases de datos y desean crear un trabajo de MSDB para "sincronizar" las 2 aplicaciones diferentes cada 5 minutos (al principio quería ejecutarlo cada minuto).

Mi presentimiento inicial es que deberían hacer esto de alguna manera en el nivel de Aplicación con un trabajo programado de Windows, o tal vez incluso un temido desencadenante (que generalmente recurrimos en situaciones como esta).

Prefiero mantener los trabajos de MSDB reservados para las tareas de DBA tanto como sea posible para reducir el desorden allí, y también me he encontrado con consultas lentas de MSDB al ver historiales de trabajos con trabajos súper activos como este (que también ahogan y eliminan los historiales de trabajo importantes de cosas más importantes como historiales de respaldo). Pero, de nuevo, tal vez mis preferencias son incorrectas y necesito hacer un poco de espacio para el nivel de aplicación en MSDB y arremangarme y arreglar los problemas de los historiales de trabajo que tardan una eternidad en cargarse cuando necesito retener muchas más entradas del historial para capturar el cosas importantes como copias de seguridad (o purgar las entradas de trabajo hiperactivas).

Otro problema que tengo es que ahora tengo que otorgarle a este vendedor derechos de "administrador de sistemas" en lugar de solo derechos de "dbo" solo en sus bases de datos cuando realizan sus actualizaciones a través de su GUI y espero que no exploten la instancia donde mi misión es crítica Los DB son (uno de los inconvenientes de la consolidación).

Supongo que puedo ponerlos en otra instancia "aislada" donde ponemos a todos los proveedores que no juegan bien, pero luego necesitamos reconfigurar las aplicaciones para que apunten a la nueva instancia de SQL ( desafortunadamente, el suspiro no es trivial en este caso).

El vendedor ya rechazó mis inquietudes al hablar sobre cuán malos son los desencadenantes. Entonces, "busqué en Google" un poco esto y salí vacío. ¿Alguien ha visto algún enlace "con autoridad" que indique que es una mala idea y que puedo referirlo? ¿O debería abrazar su enfoque?

No creo que haya publicado nunca en un foro SQL antes de pedir ayuda, así que espero que mi consulta esté correctamente enmarcada.

EDITAR: Estamos ejecutando SQL Server 2008 Enterprise R2 x64 SP1 (¡Gracias por señalar que olvidé mencionar la versión!). Hmmm, espero que no necesiten cambiar sus scripts de actualización de MSDB cuando vamos a una versión más nueva.

¡Gracias por tu tiempo! Rico

rzuech
fuente
Muy bien redactado. Quizás pueda agregar una etiqueta con la versión específica que usa (y también mencionar en la pregunta la edición). No estoy seguro de si existen diferencias entre Standard y Enterprise, pero puede ser relevante.
ypercubeᵀᴹ
Siempre puede indicarle al trabajo que purgue su propio historial (puede eliminarlo de las tablas de MSDB con bastante facilidad), por lo que la "consulta lenta de las tablas de historial" no debería ser un factor. Estaría más nervioso por dejar que un proceso externo maneje esto, precisamente porque tendría menos control sobre la historia. Además, si 5 minutos es "lo suficientemente actual", ¿por qué recurrir a disparadores que afectarán cada operación DML en tiempo real?
Aaron Bertrand
PD: Dudo mucho que cualquiera de sus scripts de creación de trabajo tenga algún cambio entre 2008 R2 y 2012 a menos que realmente cambien la funcionalidad del trabajo (que no sería una cosa específica de la versión a menos que aprovechen alguna nueva característica). El script de trabajo en sí no debería cambiar.
Aaron Bertrand
2
No necesariamente tiene que darles sysadminpara que puedan modificar los trabajos del agente SQL: consulte msdn.microsoft.com/en-us/library/ms188283(v=sql.105).aspx
SQLFox
Gracias por la rápida respuesta a todos! Adoptaré su enfoque y miraré la purga junto con no darles administrador de sistemas.
rzuech

Respuestas:

12

OMI, su proveedor está realmente en el camino correcto.

Un trabajo de capa de aplicación requeriría que rehaga muchas características de Agente SQL listas para usar (por ejemplo, lógica para no ejecutar un trabajo que ya se está ejecutando, proponer una solución de almacenamiento de credenciales y seguridad, integrar los resultados del trabajo con informe de errores y seguimiento de resultados en SQL, etc., etc., etc.). Y, lo más importante, proporcione una solución de respaldo / HA / DC para la programación. No desea que su historia de recuperación de desastres sea "y después de que termine de recuperar el servidor en espera, cree estas 50 tareas del planificador NT". Entonces tiene razón al rechazar el uso del planificador del sistema, no tiene nada de las características y capacidades que tiene el Agente.

Está aún más en lo correcto al rechazar los disparadores. Reemplazar un trabajo periódico con un desencadenador síncrono aumenta la latencia de la solicitud, aumenta la cohesión y el acoplamiento (piense en los cambios de esquema ...), aumenta el riesgo de tiempo de inactividad debido a problemas de sincronización (error de activación-> error de la aplicación frente a error del trabajo-> corregir y volver a intentar más tarde) , aumenta drásticamente los problemas de punto muerto (debido a actualizaciones cruzadas entre rastreados / trackee) y tiene muchos más problemas.

La solución más fácil es, de hecho, un trabajo de Agente, y msdbde ninguna manera está reservado para los DBA. Una solución más sofisticada sería usar temporizadores de conversación y activación interna , lo que tendría algunas ventajas sobre los trabajos del Agente, principalmente debido a la contención (todo está dentro de la base de datos de la aplicación, piense en reflejar escenarios de conmutación por error), pero puedo entender totalmente si su proveedor es reacio a probar algo que requiere un conocimiento muy específico. Por cierto, espero que no se refiera a un trabajo cada 5 minutos por DB .

En cuanto a los permisos de administrador de sistemas: el nombre del juego es la firma de código . Puede otorgar cualquier permiso para procedimientos específicos, inspeccionados y validados por usted, firmando con su certificado privado.

Remus Rusanu
fuente
Aquí hay un enlace a su respuesta en Stack Overflow que muestra un ejemplo de temporizadores de conversación y activación interna: stackoverflow.com/a/4079716
Jon Seigel
1
Marqué esto como la respuesta aceptada que parece ser el consenso. Lo más importante que eliminé de todo esto es que está bien que las Aplicaciones usen trabajos frecuentes de MSDB, y solo necesitaré usar los enlaces proporcionados aquí para hacerlo de manera adecuada por seguridad. Muy perspicaz a todos, y gracias por sus comentarios y tiempo!
rzuech
2

Mi preferencia personal sería usar disparadores para manejar al menos una parte de la sincronización. No me interesa particularmente la sincronización de sondeo programada, ya que tiene que lidiar con posibles conflictos, datos obsoletos, impacto en el rendimiento del trabajo repetido, etc. Si quieren hacerlo de forma tan agresiva como 1 a 5 minutos, supongo es para mitigar conflictos y estancamiento, y la inmediatez de un desencadenante abordaría eso.

Si todo sucede dentro del mismo servidor, probablemente esté bien poner el código de sincronización dentro de los disparadores, o hacer que los disparadores llamen a un procedimiento almacenado que sincroniza cada registro afectado. Si la sincronización abarca servidores, o si desea asegurarse de que tener una base de datos fuera de línea no evitará que la otra base de datos sea utilizable, considere usar Service Broker para manejar actualizaciones asincrónicas. He hecho esto para sincronizar las cifras de entrada de ventas con datos CRM entre dos servidores diferentes, al tiempo que permite que cualquiera de los servidores se desconecte sin afectar a la otra aplicación. Una vez que vuelve a funcionar, Service Broker entrega los mensajes y actualiza los datos en el servidor remoto.

Y realmente no hay nada inherentemente malo en los desencadenantes, pero como la mayoría de los aspectos de T-SQL, es muy posible escribir código que tenga un rendimiento horrible. Escribí un artículo sobre las trampas comunes de los desencadenantes, si eso ayuda.

Escribir desencadenantes bien comportados

db2
fuente
Sí, los 2 DB están en la misma instancia del servidor. Personalmente, también habría hecho disparadores y sus aplicaciones son muy pequeñas en relación con algunos de los DB de servicio más pesados ​​que tenemos allí. Pero, no creo que pueda convencer realmente al proveedor de lo contrario, ya que no puedo señalar ninguna cosa de "mejores prácticas" con respecto a no usar trabajos MSDB para la sincronización de aplicaciones. Además, respeto bastante la opinión de Aaron, así que no voy a presionarlos. db2 Leí su enlace y lo encontré bastante informativo, y Service Broker es otra buena opción que ni siquiera consideré. ¡Gracias!
rzuech
Sí, si alguna vez le preocupa que los desencadenantes fallen (base de datos fuera de línea, cambios de esquema, etc.), Service Broker es el camino a seguir, suponiendo que desea una sincronización instantánea (casi).
db2