News:
Planungssicherheit ˗ Routineaufgaben im MS SQL Server verwalten

Zeitgesteuerte Routineaufgaben werden vom SQL Server Agent übernommen. Was aber tun, wenn der SQL Server Agent einmal nicht zur Verfügung steht?

Icon Unternehmen

In neun von zehn Fällen kommt der SQL Server Agent zum Einsatz, wenn zeitgesteuerte Vorgänge - beispielsweise bei Sicherungen (Backups), oder zur Datenbankpflege (Index-Erneuerung) - im Hintergrund ausgelöst werden sollen. Obwohl der SQL Server Agent ausgereift und vor Allem hervorragend in das SQL Server Management Studio integriert ist, mag es Situationen geben, in denen man ihn entweder nicht nutzen kann oder nicht nutzen will.

Der wohl häufigste Fall ist - unserer Erfahrung nach - eine Umgebung, in der verschiedene Schritte auf einem SQL Server Express automatisiert werden müssen. Daher wird das Thema auch anhand einer kleinen und schlichten Sicherungslösung demonstriert.
 

Also wie können Aktionen ausgelöst werden - außer von Hand?

Die Lösung ist naheliegender, als man denkt. Denn obwohl der Aufgabenplaner (englisch "Task Scheduler") bereits im Windows Server 2008 eine Art Generalüberholung bekam, findet er im Allgemeinen wenig Beachtung. Für die zeitgesteuerte Ausführung von wiederkehrenden Aufgaben eines SQL Servers ist er jedoch gut geeignet, da im Alltag die meisten solcher Aufgaben simple T-SQL-Statements sind. Und genau die kann man auch anders absetzen, wie sich gleich zeigt.
 

Wie können SQL-Befehle per Kommandozeile zum SQL Server geschickt werden?

Dies kann mit Hilfe von zwei kleinen Dienstprogrammen im Lieferumfang des SQL Serves erfolgen - nämlich die (bei SQL-Experten bekannte) SQLCmd.exe sowie deren PowerShell-Variante invoke-SQLCmd. Beides sind Werkzeuge, um T-SQL-Befehle abzusetzen, welche dann vom SQL Server - wie gewohnt - verarbeitet werden.

Die SQLCmd.exe kennt viele Parameter, doch die wichtigsten sind:

-S für die Angabe der SQL-Serverinstanz
-d für die Angabe der zu verwendenden Datenbank
-U für den Benutzernamen (bei SQL-Logins im gemischten Modus)
-P für das dazugehörige Kennwort

und entweder ...

-Q für das/die SQL-Statements als direkter Parameter

oder ...

-i für eine Textdatei mit SQL-Statements, welche eingelesen wird

Ausgerüstet mit diesem Werkzeug kann man sich eine schlichte, aber dennoch funktionale Lösung schaffen, um sowohl Datenbanken als auch Transaktionsprotokolle eines SQL Servers zu sichern - wohlgemerkt ohne den SQL Server Agent zu verwenden.
 

Vorgehensweise am Beispiel einer Datenbanksicherung

Wenn man sich bewusst macht, dass die Vollsicherung einer Datenbank nichts weiter benötigt, als ein …

BACKUP DATABASE … TO DISK … WITH …

… versteht man schnell, dass es nur darauf ankommt, einen solchen Befehl an den SQL Server abzusetzen. Und genau da setzt das genannte Dienstprogramm an. Denn wenn man die dafür nötigen Parameter angibt, kann man durch ...

SQLCmd.exe   -S ExampleServer\MSSQL   -Q "BACKUP DATABASE [ExampleDB] TO DISK = '\\FilesServer\Share\ExampleBackup.bak' WITH NAME='Full-Backup-of-ExampleDB', CHECKSUM;"

… im Grunde das Gleiche erreichen, was auch ein "echter" SQL Server Agent Job tun würde.

Anmerkung für SSMS-Benutzer
Hierdurch wird sehr gut deutlich, dass eine Datenbanksicherung keine "interne Aktion" des SQL Server Agents ist, sondern lediglich eine recht simple SQL-Anweisung. Besonders den Fans von Wartungsplänen sei an's Herz gelegt, sich dies einmal klar zu machen.

Es spricht also nichts dagegen, wenn der Windows Aufgabenplaner diesen Programmaufruf (mitsamt Parametern) übernimmt. Natürlich muss man bei einer solchen Lösung einige zusätzliche Details beachten (Hinweise hierzu am Ende).

Teil 1 - Komplettsicherungen


Da die T-SQL-Logik in diesem Beispiel ausgesprochen simpel ist, werden die Dateinamen der Backup-Container nicht dynamisch generiert. Daher muss dieser Aspekt durch den Taskplaner abgedeckt werden. Will man beispielsweise nach jedem Werktag ein Vollbackup anfertigen lassen, so richtet man kurzerhand fünf Vorgänge ein, welche jeweils ein individuelles Vollbackup auslösen.

Einrichtung - exemplarisch dargestellt für einen Vorgang

Name und Beschreibung sind zwar nicht weiter von Bedeutung, sollten jedoch möglichst sinnvoll gewählt sein.
Name und Beschreibung sind zwar nicht weiter von Bedeutung, sollten jedoch möglichst sinnvoll gewählt sein.

Die Einstellung zur erzwungenen Beendigung des Tasks ist optional und kann auch an die realen Verhältnisse angepasst werden. Normalerweise sollte jedoch auch ein Vollbackup in circa vier Stunden abgeschlossen sein.
Die Einstellung zur erzwungenen Beendigung des Tasks ist optional und kann auch an die realen Verhältnisse angepasst werden. Normalerweise sollte jedoch auch ein Vollbackup in circa vier Stunden abgeschlossen sein.

Die Aktion besteht im Aufruf des Programms mit individuellen Parametern. Diese sind aufgrund ihrer Länge nachfolgend noch einmal vollständig abgebildet.
Die Aktion besteht im Aufruf des Programms mit individuellen Parametern. Diese sind aufgrund ihrer Länge nachfolgend noch einmal vollständig abgebildet.

Wenn alle fünf Sicherungen (ergo: Vorgänge) korrekt vorbereitet wurden, sollte es so …
Task Scheduler

… beziehungsweise so …
Task Scheduler

...aussehen.

Anmerkung
Der ein oder andere Server-Administrator mag hier einwenden, dass man auch jene fünf Einzelaufgaben zusammenfassen könnte. Das stimmt natürlich; allerdings ist der gezeigte Weg auch nur ein Bespiel und soll leicht verständlich sein. Außerdem kann man so die Sicherungszeitpunkte individuell konfigurieren – etwa falls zur gleichen Zeit ein anderer Vorgang stattfindet und die Datenbanksicherung mit ein bis zwei Stunden Verschiebung starten soll.

Teil 2 - Transaktionsprotokoll-Sicherungen


Was noch aussteht ist das Backup des Transaktionsprotokolls. Doch auch das ist keine Kunst – nur etwas aufwändiger, da hierbei die Dateinamen dynamisch zur Laufzeit generiert werden sollten. Sonst würde bei jedem neuen Backup das vorherige Backup überschrieben. (Zwar ist dies keine Bedingung für ein erfolgreiches Backup. Allerdings will man im Echtbetrieb sicherlich nicht nur ein Backup des Transaktionsprotokolls aufheben.)
Um also diesen Aspekt abzubilden, genügt eine kleine Änderung am T-SQL-Befehl sowie ein anderer Zeitplan. Im Regelfall werden Transaktionsprotokolle drei bis vier Mal stündlich gesichert.

Einrichtung

Diese Angaben dienen nur der Übersichtlichkeit
Diese Angaben dienen nur der Übersichtlichkeit.

Beim Auslöser (Trigger) muß diesmal auch eine Wiederholung gesetzt werden.
Beim Auslöser (Trigger) muss diesmal auch eine Wiederholung gesetzt werden.

Auch hier ist der komplette Befehl im Bild nicht erkennbar und dafür im folgenden Bild in seiner vollen Länge dargestellt.
Auch hier ist der komplette Befehl im Bild nicht erkennbar und dafür im folgenden Bild in seiner vollen Länge dargestellt.

Fertig eingerichtet sollte man Folgendes sehen:

Task Scheduler

Fazit

Auch wenn es vielleicht auf den ersten Blick so aussehen mag, aber der SQL Server Agent erledigt die Aufgaben nicht selbst. Er schaut auf die Uhr, setzt die Dinge in Gang, protokolliert die einzelnen Schritte sorgfältig und verschickt auf Wunsch E-Mails über die Ergebnisse. Kurz: Er ist ein komfortabler Verwalter der einzelnen Aufgaben, aber die Arbeit machen Andere - entweder die SQL Server Engine direkt oder externe Programme, welche bereits im Windows vorhanden bzw. installiert sind.
Wie die vorgestellte Lösung zeigt, ist man jedoch nicht auf den SQL Server Agent angewiesen, falls man bestimmte Vorgänge im SQL Server in Gang setzen will. Natürlich wird niemand bestreiten, dass die Verwendung des SQL Server Agents wann immer es geht vorzuziehen ist. Allerdings gibt es im Alltag auch hin und wieder Anwendungsfälle, in denen man tatsächlich auf etwas anderes ausweichen muss.

Dazu zählen u.a.:

  • Der SQL Server Agent startet nicht und eine Reparaturinstallation ist nicht unmittelbar möglich.
  • Die T-SQL-Befehle sind in hohem Maße abhängig von den Rückgabewerten oder Ergebnissen anderer Programme.
  • Ein Vorgang soll in leicht abgewandelter Form auf verschiedenen Datenbank-Servern (Hosts) durchgeführt werden.
  • bei Verwendung eines SQL Server Express oder auch eines SQL Server Express LocalDB.
  • eine Ad-Hoc-Lösung auf Hosts, welche nicht aus der Ferne administriert werden können und auch kein SSMS installiert haben.


Hinweise

Zu beachten sind folgende zwei Voraussetzungen hinsichtlich des Benutzerkontos, welches verwendet wird, um das Dienstprogramm zu starten.

Auf dem Server, der den Task ausführt, muss das Benutzerkonto über die Berechtigung "Als Stapelverarbeitungsauftrag anmelden" verfügen. Darauf weist der Aufgabenplaner beim Anlegen der Aufgabe auch hin.
Im SQL Server, der die Befehle bearbeitet, muss zu jenem Benuterkonto, das der Serverrolle "serveradmin" angehört, eine Anmeldung (Login) auf Instanzebene angelegt sein.
Außerdem häufen sich mit der Zeit entsprechend viele Sicherungen an, da die gesicherten Transaktionsprotokolle ja nicht überschrieben werden.
Doch dieses Problem ist bewusst nicht Bestandteil dieses DBA-Tipps und sollte von einem halbwegs geübten Server-Administrator in den Griff zu bekommen sein.
 

Schlussbemerkung

Die erläuterte Lösung wurde bewusst simpel gehalten, um in erster Linie das grundlegenden Prinzip zu veranschaulichen. Im Praxiseinsatz empfiehlt es sich, die einzelnen Kommandos nicht als lange Parameter anzugeben, sondern stattdessen Skripte zu verwenden. In einem echten Szenario würde es darauf hinauslaufen, dass die SQLCmd.exe nicht direkt, sondern innerhalb eines Windows-Befehlsskripts (.cmd) gestartet wird. Außerdem erhöht es den Komfort spürbar, wenn man auch die T-SQL-Befehle in einem kurzen SQL-Skript unterbringt, welches von der SQLCmd.exe ausgelesen wird. Dazu dient - wie oben bereits erwähnt - der Parameter -i gefolgt vom Pfad-/Dateinamen der SQL-Skriptdatei.

In einem weiteren DBA-Tipp wird das hier gezeigte Beispiel erneut aufgegriffen und dann durch dem Einsatz anderer Werkzeuge/Technologien realisiert sowie ergänzt.

Sie haben verschiedene Anwendungen, die aus unterschiedlichen Gründen Vorgänge in Ihren MS SQL Servern auslösen müssen, wissen jedoch nicht wie? Rufen Sie uns unter +49.371.909515-100 an. Unsere Spezialisten helfen Ihnen gern weiter.