Kann ich einen Wartungsplan exportieren, ohne Integration Services zu verwenden?

12

Ich versuche, einen einfachen Wartungsplan aus einer SQL Server-Instanz zu exportieren.

Ich möchte den Export in die Quellcodeverwaltung überprüfen und den exportierten Wartungsplan auf funktionsidentische Instanzen anwenden.

StackOverflow und SQL Server Newbie empfehlen die Verwendung von Integration Services zum Exportieren des Wartungsplans.

Wenn ich versuche, auf dem Exportziel eine Verbindung zu Integration Services herzustellen, wird die folgende Fehlermeldung angezeigt:

Die Verbindung zum Integration Services-Dienst auf dem Computer "WEBSERVER" ist mit folgendem Fehler fehlgeschlagen: Der angegebene Dienst ist nicht als installierter Dienst vorhanden.

Wir haben Integration Services in WEBSERVER deaktiviert, da wir dieses Feld nur zum Bereitstellen von Daten für Consumer-Anwendungen verwenden. Alle Daten auf WEBSERVER werden von einer Backend-Instanz repliziert. Integration Services wird häufig für die Verarbeitung von Daten in der Backend-Instanz verwendet.

Gibt es eine dokumentierte Möglichkeit, einen Wartungsplan ohne Verwendung von Integration Services zu exportieren? Unterstützt Microsoft das?

Iain Samuel McLean Elder
quelle

Antworten:

10

Wartungspläne werden wie alle anderen in SQL Server gespeicherten SSIS-Pakete in msdb.dbo.sysssispackages gespeichert. Ich habe einen praktischen Beitrag über SSIS-Paketauszug aus MSDB , der heilen sollte, was Sie schmerzt.

billinkc
quelle
Dies funktioniert nur, wenn Sie SSIS vollständig installiert haben, da dtutil- worauf aufbauend - dies ansonsten grundsätzlich deaktiviert ist, obwohl es vorhanden ist. In einigen Versionen von SQL Server (z. B. Web Edition) kann SSIS nicht vollständig installiert werden, obwohl Wartungspläne im Wesentlichen die gesamte Funktionalität von SSIS verwenden. (Allerdings gibt es einen Hack, um dies zu umgehen, vorausgesetzt, Sie haben zwei Versionen von SQL Server, von denen eine nicht manipuliert ist - siehe meine Antwort unten.)
Mike Beaton
3

Es gibt einen Weg, dies zu tun.

Angenommen, Sie haben wie das OP zwei SQL Server-Instanzen, von denen eine SSIS installiert hat und eine nicht (wahrscheinlich nicht, z. B. wenn es sich um SQL Server Web Edition handelt).

Schreiben Sie eine gespeicherte Prozedur, die die Zeilen des Benutzerwartungsplans vom ausgelagerten Server auf den nicht ausgelagerten Server kopiert. Die relevanten Zeilen sind:

SELECT name 
FROM msdb.dbo.sysssispackages 
WHERE packagetype = 6

Sie müssen diesen SP so schreiben, dass alle Zeilen mit übereinstimmenden idzuerst gelöscht werden. Anschließend werden die neuesten Versionen (oder ein ähnlicher Ansatz, z. B. UPDATEübereinstimmende ids, dann INSERTfehlende ids) eingefügt. Außerdem müssen Sie auf der einen oder anderen Seite einen Verbindungsserver einrichten, damit Sie SQL schreiben können, das beide Server anspricht.

Das ist es wirklich, Sie können dies dann regelmäßig aufrufen ... zum Beispiel aus einem Wartungsplan heraus ... und alle Wartungspläne auf der nicht-manipulierten Seite sichern.

Dies ist natürlich ein gewaltiger Hack, aber er funktioniert tatsächlich. (Ich würde mir vorstellen, dass es ziemlich wichtig ist, dass die Versionsnummer von SQL Server auf beiden Seiten gleich ist, damit die Daten msdb.dbo.sysssispackageszwischen den verschiedenen Serverinstanzen so kompatibel sind, wie es tatsächlich scheint.)

Natürlich können Sie die relevanten Zeilen immer nur direkt aus der SSIS-Datenbanktabelle sichern. Das würde auf jeden Fall funktionieren - als vollständige Antwort auf die ursprüngliche Frage. Wie bereits erwähnt, hat dies nichts mit der Voraussetzung von SSIS zu tun - es setzt lediglich Wartungspläne voraus!

Das ist also eine unterstützte, leichte Methode, die überall auf dem System ohne SSIS funktioniert. Der Vorteil der oben beschriebenen komplexeren, hackigeren Methode besteht darin, dass exportierte Pläne in einem Standardformat und nicht nur als leere Datenzeilen ausgegeben werden. Daher denke ich, dass dies wahrscheinlich später in eine andere Version von SQL Server importiert werden kann.

Mike Beaton
quelle
0

Schauen Sie sich an:

Wie werden Wartungspläne von einem Server auf einen anderen übertragen (kopiert)? von Sreekanth Bandarla

Um es zu paraphrasieren und zusammenzufassen:

  1. Stellen Sie in SSMS für denselben Servernamen eine Verbindung zu "Integration Services ..." her, anstatt eine Verbindung zu "Database Engine ..." herzustellen.

  2. Navigieren Sie zu "Gespeicherte Pakete / MSDB / Wartungspläne".

  3. Es gibt alle Ihre Wartungspläne. Klicken Sie mit der rechten Maustaste darauf, um sie zu exportieren.

RicardoBalda
quelle
0

Ich habe mit genau dem gleichen Problem zu kämpfen. Hier ist der Haupt-Take-Away:

Auf Ihrem WEBSERVER werden keine Integrationsdienste benötigt. Eine dokumentierte Möglichkeit ist die Verwendung von DTUTIL. Verwenden Sie einfach JEDEN SQL Server (auch die kostenlose Developer Edition mit allen Enterprise-Funktionen), auf dem Integration Services installiert ist, um SQL Server-Wartungspakete von einer Quelle auf ein Ziel zu kopieren - auch wenn es nicht die Quelle oder das Ziel des Pakets ist, wie in gezeigt Beispiel A.

Beispiel A: Führen Sie DTUTIL auf SQL Server MySSISServerA aus, um ein SQL-Wartungspaket von MySourceServerB nach MyDestServerC zu kopieren .

DTUTIL /SQL "Maintenance Plans\Nightly Maintenance" /copy  sql;"Maintenance Plans\Nightly Maintenance" /sourceserver MySourceServerB /destserver MyDestServerC /Q
Stachel
quelle
Mit dem Vorbehalt , die ANYgleiche Version =, andernfalls wird dtutil den Plan vCurrent Upgrade
billinkc
Großartiger Punkt! Aber Upgrades können hilfreich sein - für das, was wir sowieso tun. Ich erstelle gerne Pläne in SQL 2008 und kopiere / aktualisiere diese Pläne auf SQL 2008, 2008 R2, 2012, 2014, 2016.
Sting