Ich arbeite an einem SSIS-Paket, das Entwicklungsdatenbanken aus Produktionssicherungen aktualisiert. Das Paket ist seit Jahren vorhanden, aber wir stellen Verfügbarkeitsgruppen auf der Entwicklungsinstanz bereit, sodass die Aufgaben geändert werden müssen, um sowohl mit den primären als auch mit den sekundären Replikaten zu arbeiten. Hintergrund: Alle Instanzen sind SQL Server 2014 SP2. Eine Produktionsinstanz (PD1), zwei Entwicklungsinstanzen (DV3 & DV7) und eine Dienstprogramminstanz (DV1), in denen das SSIS-Paket in SSISDB bereitgestellt wird und in der der SQL Agent-Job ausgeführt wird. Nachdem im SSIS-Paket die vollständigen Sicherungen abgerufen und eine Netzwerkfreigabe aus der Produktion bereitgestellt wurden, müssen die nächsten Aufgaben (in einem separaten SSIS-Paket) herausfinden, auf welchem Knoten sich das primäre Replikat befindet. Ich folge den hier aufgeführten Schrittenum diese Arbeit zu erledigen, und alles funktioniert großartig, wenn es fest codiert ist (was natürlich nicht funktioniert, wenn / wenn ein Failover auftritt). Die einzige Möglichkeit, darüber nachzudenken, besteht darin, zur Laufzeit zu bewerten, welche Instanz primär ist, und dann mit den Aufgaben fortzufahren (die übrigens alle "Execute SQL Task" -Objekte sind - für die eine eigene Verbindungsdefinition erforderlich ist ). Ich habe einige Beispiele für die Verwendung von Ausdrücken in ConnectionStrings und Variablen gesehen, kann jedoch nicht herausfinden, wie der von der folgenden Abfrage in SQL Server zurückgegebene Wert festgelegt wird, um die richtige Instanz zum Festlegen der Verbindungszeichenfolge im Paket zurückzugeben.
select cs.replica_server_name
from sys.dm_hadr_availability_replica_states rs
join sys.dm_hadr_availability_replica_cluster_states cs
on rs.replica_id = cs.replica_id
join sys.dm_hadr_name_id_map n
on rs.group_id = n.ag_id
where rs.role = 2
and n.ag_name = 'DVAG001'
Im Idealfall gibt es zwei dieser Verbindungsmanager, einen für den primären und einen für den sekundären, die ich dann in den Objekten "SQL-Task ausführen" verwenden kann. Dann würde alles perfekt funktionieren. Es gibt vielleicht auch andere Möglichkeiten, dies zu tun, aber ich bin nicht sehr erfahren in SSIS oder der Entwicklung außerhalb von TSQL.
UPDATE: Der obige Vorgang wird jeden Tag ausgeführt. Deshalb verwende ich ein SSIS-Paket und einen SQL-Agenten. Daher muss der gesamte Prozess automatisiert werden und alle erforderlichen Werte - insbesondere die Bestimmung der Replikationszustände (primär und sekundär) - im Paket enthalten sein, damit kein manueller Eingriff erforderlich ist.
quelle
Als alternative Strategie könnte ich in Betracht ziehen, Dinge zu vereinfachen, ohne dass SSIS-Parameter mithilfe der T-SQL-Ausführung erforderlich sind (keine Parameter erforderlich). SSIS, insbesondere Legacy-Pakete, scheinen immer so fehleranfällig und fehlerhaft zu sein, dass ich sie einfach nicht berühren möchte, wenn sie nicht benötigt werden:
A Ziehen Sie zunächst in Betracht, Ihren "Primary AG Check" auf den Produktionsservern selbst und nicht auf den Entwicklungsservern auszuführen.
B. Importieren Sie dann Ihre SSIS-Pakete in die Produktion, falls sie noch nicht vorhanden sind - um dort ausgeführt zu werden. Man könnte Entwickler-Wiederherstellungen von Prod sowieso eher als Produktionsprozess betrachten.
C. Und schließlich sollten Sie vermeiden, Ihre alten SSIS-Pakete so weit wie möglich zu ändern, indem Sie einen T-SQL Agent-Job ausführen, der die Ausführung des SSIS-Pakets (Datenbankwiederherstellung) von jeder "potenziellen" primären AG mit dem folgenden Code - oder ähnlichem - aufruft. - wie in Listing A gezeigt.
Listing A: Führen Sie das SSIS-Paket (Datenbankwiederherstellung) nur aus, wenn der SQL Server der primäre ist - über einen SQL Agent-Job.
Hinweis:
Wenn ich Sie richtig verstehe, werden die Entwicklungsserver immer gleich benannt. Es sind nur die Namen der Produktionsserver, die sich ändern können. Angesichts dessen glaube ich, dass Sie mit der in Listing A gezeigten Code-Ausführung mit etwas weniger Zeit und Aufwand das erreichen können, was Sie benötigen. Sie können diese Ausführung sogar am Ende Ihrer SQL-Sicherungen huckepack nehmen, um eine schnellere Aktualisierung der Entwicklungsumgebungen zu erhalten.
quelle