Der Anbieter möchte den MSDB-Auftrag für Business Application alle 5 Minuten ausführen

15

Wir haben einen Drittanbieter, der versucht, 2 verschiedene Anwendungen zu integrieren, in denen sich beide DBs auf unserer SQL Server-Instanz befinden, zusammen mit mehr als 150 anderen DBs, und der alle 5 Minuten einen MSDB-Job erstellen möchte, um die 2 verschiedenen Anwendungen zu "synchronisieren" (zuerst) wollte es jede Minute laufen lassen).

Meine anfängliche Vermutung ist, dass sie dies stattdessen in der Anwendungsebene mit einem von Windows geplanten Auftrag oder vielleicht sogar mit einem gefürchteten Auslöser tun sollten (auf den wir normalerweise in Situationen wie diesen zurückgreifen).

Ich bevorzuge es, MSDB - Jobs für DBA - Aufgaben so weit wie möglich reserviert zu halten, um die Unordnung dort zu verringern, und habe auch eine langsame Abfrage von MSDB ausgeführt, wenn ich Jobprotokolle mit solchen superaktiven Jobs ansehe (die auch wichtige Jobprotokolle von ertrinken und verwerfen) wichtigere Dinge wie Sicherungsverläufe). Andererseits sind meine Einstellungen möglicherweise falsch, und ich muss etwas Platz für die Anwendungsebene in MSDB schaffen und die Ärmel hochkrempeln und Probleme beheben, bei denen das Laden von Jobprotokollen ewig dauert, wenn ich viel mehr Verlaufseinträge behalten muss, um die zu erfassen wichtige Dinge wie Backups (oder die hyperaktiven Jobeinträge löschen).

Ein weiteres Problem, das ich habe, ist, dass ich diesem Anbieter jetzt "sysadmin" -Rechte erteilen muss, anstatt nur "dbo" -Rechte für ihre DBs, wenn sie ihre Upgrades über ihre GUI ausführen, und hoffen, dass sie die Instanz, in der meine Mission kritisch ist, nicht in die Luft jagen DBs sind (einer der Nachteile der Konsolidierung).

Ich denke , ich kann sie auf einer andere „isoliert“ Instanz setzen , wo wir alle Anbieter setzen, die nicht schön spielen , aber dann müssen wir die Bewerbungen für Punkt auf die neue SQL - Instanz (rekonfigurieren seufzt leider nicht trivial in diesem Fall).

Der Verkäufer hat bereits meine Bedenken zurückgedrängt und darüber gesprochen, wie schlimm Auslöser sind. Also habe ich ein bisschen "gegoogelt" und bin leer ausgegangen. Hat jemand einen Link da draußen gesehen, der "maßgeblich aussieht", dass dies eine schlechte Idee ist und ich sie darauf verweisen kann? Oder sollte ich ihren Ansatz annehmen?

Ich glaube nicht, dass ich jemals in einem SQL-Forum gepostet habe, bevor ich um Hilfe gebeten habe, also ist meine Anfrage hoffentlich richtig gerahmt.

BEARBEITEN: Wir verwenden SQL Server 2008 Enterprise R2 x64 SP1 (Vielen Dank für den Hinweis, dass ich die Version vergessen habe!). Hmmm, hoffentlich müssen sie ihre MSDB-Upgrade-Skripte nicht ändern, wenn wir zu einer neueren Version wechseln.

Vielen Dank für Ihre Zeit! Reich

rzuech
quelle
Schön formuliert ist es. Vielleicht können Sie ein Tag mit der von Ihnen verwendeten Version hinzufügen (und in der Frage auch die Edition erwähnen). Sie sind sich nicht sicher, ob es Unterschiede zwischen Standard und Enterprise gibt, aber dies kann relevant sein.
Ypercubeᵀᴹ
Sie können dem Job jederzeit anweisen, seinen eigenen Verlauf zu löschen (Sie können ihn ganz einfach aus den MSDB-Tabellen löschen), sodass "langsames Abfragen von Verlaufstabellen" kein Faktor sein sollte. Ich wäre nervöser, wenn ich das einem externen Prozess überlassen würde, gerade weil ich weniger Kontrolle über die Geschichte hätte. Auch wenn 5 Minuten "aktuell genug" sind, warum sollten Sie sich Triggern zuwenden, die jede einzelne DML-Operation in Echtzeit betreffen?
Aaron Bertrand
PS Ich bezweifle stark, dass eines ihrer Skripts zur Auftragserstellung Änderungen zwischen 2008 R2 und 2012 enthalten würde, es sei denn, sie ändern tatsächlich die Auftragsfunktionalität (was nicht versionsspezifisch wäre, wenn sie nicht eine neue Funktion nutzen). Das Jobskript selbst sollte sich nicht ändern.
Aaron Bertrand
2
Sie müssen sie nicht unbedingt angebensysadmin , damit sie SQL-Agent-Jobs ändern können
lesen Sie
Vielen Dank für die schnelle Antwort an alle! Ich nehme ihren Ansatz an und schaue mir die Säuberung an, ohne ihnen Sysadmin zu geben.
Rzuech

Antworten:

12

IMO ist Ihr Anbieter tatsächlich auf dem richtigen Weg.

Für einen Auftrag auf Anwendungsebene müsste er viele sofort einsatzbereite SQL Agent-Funktionen wiederholen (z. B. Logik, um einen bereits ausgeführten Auftrag nicht auszuführen, eine Lösung zum Speichern von Sicherheits- und Anmeldeinformationen bereitzustellen und Auftragsergebnisse zu integrieren) Fehlerberichte und Ergebnisverfolgung in SQL usw. usw. usw. usw.). Und vor allem bieten Sie eine Backup / HA / DC-Lösung für die Planung. Sie möchten nicht, dass Ihre Disaster Recovery-Geschichte "und nachdem Sie den Standby-Server wiederhergestellt haben, erstellen Sie diese 50 NT-Scheduler-Tasks". Er hat also Recht, sich gegen die Verwendung des System-Schedulers zu wehren, da dieser keine der Funktionen und Fähigkeiten des Agenten aufweist.

Er hat umso mehr recht damit, sich gegen Auslöser zu wehren. Das Ersetzen eines periodischen Jobs durch einen synchronen Trigger erhöht die Anforderungslatenz, die Kohäsion und die Kopplung (denken Sie an Schemaänderungen ...), erhöht das Ausfallrisiko aufgrund von Synchronisierungsproblemen (Triggerfehler-> Anwendungsfehler vs. Jobfehler-> Beheben und später wiederholen). , erhöht Deadlock-Probleme dramatisch (aufgrund von Cross-Updates zwischen verfolgt / trackee) und hat viele, viele weitere Probleme.

Die einfachste Lösung ist in der Tat ein Agent-Job, der msdbkeineswegs für DBAs reserviert ist. Eine ausgefallenere Lösung wäre die Verwendung von Konversations-Timern und interner Aktivierung , was einige Vorteile gegenüber Agent-Jobs hätte, hauptsächlich aufgrund der Eindämmung (alles ist in der App-DB enthalten, denken Sie an Failover-Spiegelungsszenarien) Sie möchten nur ungern etwas ausprobieren, das ein sehr spezifisches Know-how erfordert. Übrigens hoffe ich, Sie meinen nicht alle 5 Minuten einen Job pro DB .

Zu den Sysadmin-Berechtigungen: Der Name des Spiels lautet Codesignatur . Sie können für bestimmte von Ihnen überprüfte und validierte Verfahren eine Erlaubnis erteilen, indem Sie sie mit Ihrem privaten Zertifikat signieren.

Remus Rusanu
quelle
Hier ist ein Link zu Ihrer Antwort auf Stack Overflow, der ein Beispiel für Gesprächszeiten und interne Aktivierung zeigt: stackoverflow.com/a/4079716
Jon Seigel
1
Ich habe dies als die akzeptierte Antwort markiert, die der Konsens zu sein scheint. Das Wichtigste, was ich daraus gemacht habe, ist, dass die Anwendungen häufig MSDB-Jobs ausführen können. Ich muss nur die hier bereitgestellten Links verwenden, um dies aus Sicherheitsgründen ordnungsgemäß durchzuführen. Sehr aufschlussreich an alle, und vielen Dank für Ihre Kommentare und Zeit!
rzuech
2

Ich persönlich würde es vorziehen, Trigger zu verwenden, um zumindest einen Teil der Synchronisation zu handhaben. Die zeitgesteuerte Synchronisierung von Abfragen ist mir nicht besonders wichtig, da Sie sich mit potenziellen Konflikten, veralteten Daten, Leistungseinbußen durch den wiederholten Auftrag usw. auseinandersetzen müssen Es geht darum, Konflikte und Staleness zu mildern, und die Unmittelbarkeit eines Auslösers würde dies beheben.

Wenn alles auf demselben Server stattfindet, können Sie wahrscheinlich den Synchronisierungscode in die Trigger einfügen oder eine gespeicherte Prozedur aufrufen, die jeden betroffenen Datensatz synchronisiert. Wenn sich die Synchronisierung über mehrere Server erstreckt oder wenn Sie sicherstellen möchten, dass eine Datenbank offline ist, kann die andere Datenbank nicht verwendet werden. Verwenden Sie Service Broker, um asynchrone Aktualisierungen durchzuführen. Ich habe dies getan, um Verkaufszahlen mit CRM-Daten zwischen zwei verschiedenen Servern zu synchronisieren, wobei jeder Server offline geschaltet werden kann, ohne die andere Anwendung zu beeinträchtigen. Sobald es wieder verfügbar ist, übermittelt Service Broker die Nachrichten und aktualisiert die Daten auf dem Remoteserver.

Und Trigger haben eigentlich nichts Schlechtes an sich, aber wie die meisten Aspekte von T-SQL ist es sehr gut möglich, Code zu schreiben, der eine schreckliche Leistung erbringt. Ich habe einen Artikel über die häufigen Fallstricke von Triggern geschrieben, wenn das hilft.

Gut erzogene Trigger schreiben

db2
quelle
Ja, die beiden DBs befinden sich auf derselben Serverinstanz. Persönlich hätte ich auch Trigger gemacht und ihre Anwendungen sind ziemlich kleine Kartoffeln im Vergleich zu einigen der ziemlich leistungsstärkeren DBs, die wir dort haben. Aber ich glaube nicht, dass ich den Anbieter wirklich davon überzeugen kann, da ich nicht wirklich auf "Best Practice" -Stoffe verweisen kann, die darauf abzielen, MSDB-Jobs nicht für die Anwendungssynchronisierung zu verwenden. Außerdem respektiere ich Aarons Meinung ein wenig, damit ich sie nicht unter Druck setzen werde. db2 Ich habe Ihren Link gelesen und fand ihn recht informativ, und Service Broker ist eine weitere gute Option, die ich nicht einmal in Betracht gezogen habe. Vielen Dank!
Rzuech
Ja, wenn Sie jemals Bedenken haben, dass Trigger fehlschlagen (Offline-Datenbank, Schemaänderungen usw.), ist Service Broker der richtige Weg, vorausgesetzt, Sie möchten eine (nahezu) sofortige Synchronisierung.
db2