Le fournisseur souhaite exécuter le travail MSDB toutes les 5 minutes pour l'application métier

15

Nous avons un fournisseur tiers essayant d'intégrer 2 applications différentes où les deux bases de données résident sur notre instance SQL Server avec plus de 150 autres bases de données, et ils veulent créer un travail MSDB pour "synchroniser" les 2 applications différentes toutes les 5 minutes (au début, ils voulait l'exécuter toutes les minutes).

Mon intuition initiale est qu'ils devraient plutôt le faire d'une manière ou d'une autre dans le niveau Application avec un travail planifié Windows, ou peut-être même un déclencheur redouté (auquel nous avons généralement recours dans des situations comme celle-ci).

Je préfère garder les travaux MSDB réservés aux tâches DBA autant que possible pour réduire l'encombrement là-bas, et j'ai également rencontré des requêtes lentes de MSDB lors de l'affichage des historiques de travaux avec des travaux super actifs comme celui-ci (qui noient et suppriment également les historiques de travail importants de des choses plus importantes comme les historiques de sauvegarde). Mais là encore, mes préférences sont peut-être erronées et je dois faire de la place pour le niveau Application dans MSDB et retrousser mes manches et résoudre les problèmes d'historique de travail prenant une éternité à charger lorsque j'ai besoin de conserver beaucoup plus d'entrées d'historique pour capturer le des choses importantes comme les sauvegardes (ou purger les entrées de travail hyper actives).

Un autre problème que j'ai est que je dois maintenant donner à ce fournisseur des droits "administrateur système" au lieu de seulement des droits "dbo" sur leurs bases de données uniquement lorsqu'ils effectuent leurs mises à niveau via leur interface graphique et j'espère qu'ils ne feront pas exploser l'instance où ma mission est critique Les DB sont (l'un des inconvénients de la consolidation).

Je suppose que je peux les mettre sur une autre instance "isolée" où nous mettons tous les fournisseurs qui ne jouent pas bien, mais nous devons ensuite reconfigurer les applications pour pointer vers la nouvelle instance SQL ( soupir malheureusement pas trivial dans ce cas).

Le vendeur a déjà repoussé mes préoccupations en parlant de la gravité des déclencheurs. Donc, j'ai "googlé" un peu sur ce sujet et suis venu vide. Quelqu'un a-t-il vu un lien "faisant autorité" selon lequel c'est une mauvaise idée et je peux y faire référence? Ou devrais-je adopter leur approche?

Je ne pense pas avoir déjà posté dans un forum sql avant de demander de l'aide, donc j'espère que ma demande est correctement formulée.

EDIT: Nous exécutons SQL Server 2008 Enterprise R2 x64 SP1 (Merci d'avoir souligné que j'ai oublié de mentionner la version!). Hmmm, j'espère qu'ils n'ont pas besoin de changer leurs scripts de mise à niveau MSDB lorsque nous passerons à une version plus récente.

Merci pour votre temps! Riches

rzuech
la source
Joliment formulé, il l'est. Vous pouvez peut-être ajouter une balise avec la version spécifique que vous utilisez (et mentionner également dans la question l'édition.) Vous ne savez pas s'il existe des différences entre Standard et Enterprise, mais cela peut être pertinent.
ypercubeᵀᴹ
Vous pouvez toujours demander au travail de purger son propre historique (vous pouvez le supprimer assez facilement des tables MSDB), donc "l'interrogation lente des tables d'historique" ne devrait pas être un facteur. Je serais plus nerveux à l'idée de laisser un processus externe gérer cela, précisément parce que j'aurais moins de contrôle sur l'histoire. Aussi, si 5 minutes sont "suffisamment actuelles", pourquoi se tourner vers des déclencheurs qui affecteront chaque opération DML en temps réel?
Aaron Bertrand
PS Je doute fortement que l'un de leurs scripts de création d'emplois ait des changements entre 2008 R2 et 2012 à moins qu'ils ne changent réellement la fonctionnalité du travail (ce qui ne serait pas spécifique à la version à moins qu'ils ne profitent d'une nouvelle fonctionnalité). Le script de travail lui-même ne doit pas changer.
Aaron Bertrand
2
Vous n'avez pas nécessairement à leur donner pour leur sysadminpermettre de modifier les travaux de l'agent SQL - consultez msdn.microsoft.com/en-us/library/ms188283(v=sql.105).aspx
SQLFox
Merci pour la réponse rapide à tous! Je vais embrasser leur approche et regarder la purge tout en ne leur donnant pas d'administrateur système.
rzuech

Réponses:

12

OMI, votre fournisseur est en fait sur la bonne voie.

Un travail de couche application l'obligerait à refaire de nombreuses fonctionnalités prêtes à l'emploi de l'Agent SQL (par exemple, la logique de ne pas exécuter un travail déjà en cours d'exécution, de proposer une solution de stockage des informations d'identification et de sécurité, d'intégrer les résultats du travail avec rapport d'erreurs et suivi des résultats dans SQL etc etc etc etc). Et, plus important encore, fournissez une solution de sauvegarde / HA / DC pour la planification. Vous ne voulez pas que votre histoire de reprise après sinistre soit «et après avoir terminé la récupération du serveur de secours, créez ces 50 tâches de planificateur NT». Il a donc raison de repousser l'utilisation du planificateur système, il n'a rien des fonctionnalités et des capacités de l'agent.

Il a d'autant plus raison de repousser les déclencheurs. Le remplacement d'un travail périodique par un déclencheur synchrone augmente la latence des demandes, augmente la cohésion et le couplage (pensez aux changements de schéma ...), augmente le risque d'indisponibilité en raison de problèmes de synchronisation (erreur de déclenchement-> erreur d'application vs erreur de travail-> correction et réessayer plus tard) , augmente considérablement les problèmes de blocage (en raison de mises à jour croisées entre tracked / trackee) et a beaucoup plus de problèmes.

La solution la plus simple est en effet un travail d'agent et msdbn'est en aucun cas réservée aux DBA. Une solution plus sophistiquée consisterait à utiliser des minuteries de conversation et une activation interne , ce qui aurait certains avantages par rapport aux tâches d'agent, principalement en raison du confinement (tout se trouve dans la base de données d'application, pensez à la mise en miroir de scénarios de basculement), mais je peux totalement comprendre si votre fournisseur est réticents à essayer quelque chose qui nécessite un savoir-faire très spécifique. BTW J'espère que vous ne voulez pas dire un travail toutes les 5 minutes par DB .

Quant aux autorisations sysadmin: le nom du jeu est la signature de code . Vous pouvez donner n'importe quelle autorisation à des procédures spécifiques, inspectées et validées par vous, en les signant avec votre certificat privé.

Remus Rusanu
la source
Voici un lien vers votre réponse sur Stack Overflow qui montre un exemple de minuteurs de conversation et d'activation interne: stackoverflow.com/a/4079716
Jon Seigel
1
J'ai marqué cela comme la réponse acceptée qui semble être le consensus. La plus grande chose que j'ai retirée de tout cela est que les applications peuvent utiliser des tâches MSDB fréquentes, et je n'aurai qu'à utiliser les liens fournis ici pour le faire de manière appropriée pour la sécurité. Très perspicace tout le monde, et merci pour vos commentaires et votre temps!
rzuech
2

Ma préférence personnelle serait d'utiliser des déclencheurs pour gérer au moins une partie de la synchronisation. Je ne me soucie pas particulièrement de la synchronisation des interrogations planifiées, car vous devez gérer les conflits potentiels, les données périmées, l'impact sur les performances de la tâche répétée, etc. S'ils veulent le faire de manière aussi agressive que 1 à 5 minutes, je suppose c'est pour atténuer les conflits et l'obsolescence, et l'immédiateté d'un déclencheur réglerait cela.

Si tout se passe sur le même serveur, vous pouvez probablement placer le code de synchronisation dans les déclencheurs ou demander aux déclencheurs d'appeler une procédure stockée qui synchronise chaque enregistrement affecté. Si la synchronisation s'étend sur les serveurs, ou si vous voulez vous assurer qu'une base de données hors ligne n'empêchera pas l'autre base de données d'être utilisable, envisagez d'utiliser Service Broker pour gérer les mises à jour asynchrones. J'ai fait cela pour synchroniser les chiffres de saisie des ventes avec les données CRM entre deux serveurs différents, tout en permettant à l'un ou l'autre des serveurs d'être mis hors ligne sans affecter l'autre application. Une fois qu'il est de retour, Service Broker remet les messages et met à jour les données sur le serveur distant.

Et il n'y a vraiment rien de intrinsèquement mauvais à propos des déclencheurs, mais comme la plupart des aspects de T-SQL, il est très possible d'écrire du code qui fonctionne horriblement. J'ai écrit un article sur les pièges courants des déclencheurs, si cela aide.

Écrire des déclencheurs bien comportés

db2
la source
Oui, les 2 bases de données se trouvent sur la même instance de serveur. Personnellement, j'aurais aussi fait des déclencheurs et leurs applications sont de très petites pommes de terre par rapport à certaines des bases de données assez lourdes que nous avons là-bas. Mais, je ne pense pas que je puisse vraiment convaincre le fournisseur autrement, car je ne peux pas vraiment pointer vers des "meilleures pratiques" concernant la non-utilisation des travaux MSDB pour la synchronisation des applications. De plus, je respecte un peu l'opinion d'Aaron, donc je ne vais pas y insister. db2 J'ai lu votre lien et l'ai trouvé assez informatif, et Service Broker est une autre bonne option que je n'ai même pas envisagée. Merci!
rzuech
Oui, si vous craignez que les déclencheurs échouent (base de données hors ligne, modifications de schéma, etc.), Service Broker est le chemin à parcourir, en supposant que vous souhaitez une synchronisation (presque) instantanée.
db2