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
quelle
sysadmin
, damit sie SQL-Agent-Jobs ändern könnenAntworten:
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
msdb
keineswegs 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.
quelle
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
quelle