News zu Servicewelten

DBA Tipp: Zeit­ge­steu­er­te Aufgaben im MS SQL Server ohne SQL Server Agent auslösen

Wenn für Rou­ti­ne­auf­ga­ben zeit­ge­steu­er­te Vorgänge im Hin­ter­grund ausgelöst werden sollen kommt im Nor­mal­fall der SQL Server Agent zum Einsatz. Beispiele hierfür sind Backups oder Da­ten­bank­pfle­ge (Index-Er­neue­rung). Was passiert aber außerhalb des Nor­mal­fal­les, wenn der SQL Server Agent aus ir­gend­ei­nem Grund nicht zur Verfügung steht?

Mögliche Szenarien hierfür können sein:

  • Der SQL Server Agent startet nicht und eine Re­pa­ra­tur­instal­la­ti­on ist nicht un­mit­tel­bar möglich.
  • Die T‑SQL-Befehle sind in hohem Maße abhängig von den Rück­ga­be­wer­ten oder Er­geb­nis­sen anderer Programme.
  • Ein Vorgang soll in leicht ab­ge­wan­del­ter Form auf ver­schie­de­nen Datenbank-Servern (Hosts) durch­ge­führt werden.
  • Bei Ver­wen­dung eines SQL Server Express, oder auch eines SQL Server Express LocalDB.
  • Eine Ad-Hoc-Lösung auf Hosts, welche nicht aus der Ferne ad­mi­nis­triert werden können und auch kein SSMS in­stal­liert haben.


Unserer Erfahrung nach ist der wohl häufigste Fall eine Umgebung, in der ver­schie­de­ne Schritte auf einem SQL Server Express au­to­ma­ti­siert werden müssen. Daher wird das Thema auch anhand einer kleinen und schlich­ten Si­che­rungs­lö­sung demonstriert.

Die er­läu­ter­te Lösung wurde bewusst simpel gehalten, um in erster Linie das grund­le­gen­den Prinzip zu ver­an­schau­li­chen. Im Pra­xis­ein­satz empfiehlt es sich, die einzelnen Kommandos nicht als lange Parameter anzugeben, sondern statt­des­sen Skripte zu verwenden. In einem echten Szenario würde es darauf hin­aus­lau­fen, dass die SQLCmd.exe nicht direkt, sondern innerhalb eines Windows-Be­fehls­skripts (.Cmd) gestartet wird. Außerdem erhöht es den Komfort spürbar, wenn man auch die T‑SQL-Befehle in einem kurzen SQL-Skript un­ter­bringt, welches von der SQLCmd.exe aus­ge­le­sen wird. Dazu dient der Parameter -i gefolgt vom Pfad-/Da­tei­na­men der SQL-Skriptdatei.

Zu beachten sind zudem folgende zwei Vor­aus­set­zun­gen hin­sicht­lich des Be­nut­zer­kon­tos welches verwendet wird, um das Dienst­pro­gramm zu starten.

  1. Auf dem Server, der den Task ausführt (sprich: die SQLCmd.exe startet) muss das Be­nut­zer­kon­to über die Be­rech­ti­gung “Als Sta­pel­ver­ar­bei­tungs­auf­trag anmelden” verfügen. Darauf weißt der Auf­ga­ben­pla­ner beim Anlegen der Aufgabe auch hin.
  2. Im SQL Server, der die Befehle be­ar­bei­tet, muss zu jenem Be­nut­zer­kon­to eine Anmeldung (Login) auf In­stanz­ebe­ne angelegt sein, das der Ser­ver­rol­le “ser­ver­ad­min” angehört.

Außerdem häufen sich mit der Zeit ent­spre­chend viele Si­che­run­gen an, da die ge­si­cher­ten Trans­ak­ti­ons­pro­to­kol­le ja nicht über­schrie­ben werden (im Gegensatz zu den Voll­si­che­run­gen.) Doch dieses Problem ist nicht Be­stand­teil dieses DBA Tipps.

Windows Task Scheduler als Lösung

Wie können also Aktionen zur Ver­wal­tung von Rou­ti­ne­auf­ga­ben aus­ge­führt werden, außer von Hand? Die Lösung ist na­he­lie­gen­der, als man viel­leicht denkt. Denn obwohl der Auf­ga­ben­pla­ner (englisch “Task Scheduler”) bereits im Windows Server 2008 eine Art Ge­ne­ral­über­ho­lung bekam, findet er im All­ge­mei­nen wenig Beachtung. Für die zeit­ge­steu­er­te Aus­füh­rung von wie­der­keh­ren­den Aufgaben eines SQL Servers ist er jedoch gut geeignet, da im Alltag die meisten solcher Aufgaben simple T‑SQL-State­ments sind. Und genau die kann man auch anders absetzen, wie sich gleich zeigt.

Mit Hilfe von zwei kleinen Dienst­pro­gram­men im Lie­fer­um­fang des SQL Serves können SQL-Befehle per Kom­man­do­zei­le zum SQL Server geschickt werden. Nämlich die SQLCmd.exe sowie deren Power­Shell-Variante invoke-SQLCmd. Beides sind Werkzeuge, um T‑SQL-Befehle ab­zu­set­zen, welche dann vom SQL Server wie gewohnt ver­ar­bei­tet werden.

Die SQLCmd.exe kennt viele Parameter, doch die wich­tigs­ten sind:

-S für die Angabe der SQL-Ser­ver­in­stanz
-d für die Angabe der zu ver­wen­den­den Datenbank
-U für den Be­nut­zer­na­men (bei SQL-Logins im ge­misch­ten Modus)
-P für das da­zu­ge­hö­ri­gen Kennwort

und entweder …

-Q für das/die SQL-State­ments als direkter Parameter

oder …

-i für eine Textdatei mit SQL-State­ments, welche ein­ge­le­sen wird.

Aus­ge­rüs­tet mit diesem Werkzeug kann man sich eine schlichte aber funk­tio­na­le Lösung schaffen, um sowohl Da­ten­ban­ken als auch Trans­ak­ti­ons­pro­to­kol­le eines SQL Servers zu sichern – ohne den SQL Server Agent zu verwenden.

Vor­ge­hens­wei­se am Beispiel eines Backups

Wenn man sich bewusst macht, dass die Voll­si­che­rung einer Datenbank nichts weiter benötigt, als ein … 
BACKUP DATABASE … TO DISK … WITH …
… versteht man schnell, dass es nur darauf ankommt, einen solchen Befehl irgendwie an den SQL Server ab­zu­set­zen. Und genau da setzt das genannte Dienst­pro­gramm an. Denn wenn man die dafür nötigen Paramter 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 Datenbank-Sicherung keine “interne Aktion” des SQL Server Agents ist, sondern lediglich eine SQL-Anweisung. Besonders den Fans von War­tungs­plä­nen sei an ’s Herz gelegt, sich dies einmal klar zu machen.

Es spricht also nichts dagegen, wenn der Windows Auf­ga­ben­pla­ner diesen Pro­gramm­auf­ruf (mitsamt Pa­ra­me­tern) übernimmt. Natürlich muss man bei einer solchen Lösung einige zu­sätz­li­che Details beachten. Dazu bitte den Hinweis am Ende beachten. 

Teil 1 – Komplettsicherung

Da die T‑SQL-Logik in diesem Beispiel aus­ge­spro­chen simpel ist, werden die Da­tei­na­men der Backup-Container nicht dynamisch generiert. Daher muß dieser Aspekt durch den Taskpla­ner abgedeckt werden.
Will man bei­spiels­wei­se nach jedem Werktag ein Voll­back­up an­fer­ti­gen lassen, so richtet man kur­zer­hand fünf Vorgänge ein, welche jeweils ein in­di­vi­du­el­les Voll­back­up auslösen.

Ein­rich­tung – ex­em­pla­risch dar­ge­stellt für einen Vorgang

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

Die Ein­stel­lung zur er­zwun­ge­nen Be­en­di­gung des Tasks ist optional und kann auch an die realen Ver­hält­nis­se angepasst werden. Nor­ma­ler­wei­se sollte jedoch auch ein Voll­back­up in circa vier Stunden ab­ge­schlos­sen sein.

Die Aktion besteht im Aufruf des Programms mit in­di­vi­du­el­len Pa­ra­me­tern. Diese sind aufgrund ihrer Länge nach­fol­gend noch einmal voll­stän­dig abgebildet.

Wenn alle fünf Si­che­run­gen (ergo: Vorgänge) korrekt vor­be­rei­tet wurden, sollte es so … 
… be­zie­hungs­wei­se so … 

…aussehen.

Anmerkung

Der ein oder andere Server-Ad­mi­nis­tra­tor mag hier einwenden, dass man auch jene fünf Ein­zel­auf­ga­ben zu­sam­men­fas­sen könnte. Das stimmt natürlich, al­ler­dings ist der gezeigte Weg auch nur ein Bespiel und soll leicht ver­ständ­lich sein. Außerdem kann man so die Si­che­rungs-Zeit­punk­te in­di­vi­du­ell kon­fi­gu­rie­ren – etwa falls zur gleichen Zeit ein anderer Vorgang statt­fin­det und die Datenbank-Sicherung mit ein bis zwei Stunden Ver­schie­bung starten soll.

Teil 2 – Transaktionsprotokoll-Sicherungen

Bleibt noch das Backup des Trans­ak­ti­ons­pro­to­kolls. Doch auch das ist keine Kunst – nur etwas auf­wän­di­ger, da hierbei die Da­tei­na­men dynamisch zur Laufzeit generiert werden sollten. Sonst würde bei jedem neuen Backup das vorherige Backup über­schrie­ben. Zwar ist dies keine Bedingung für ein er­folg­rei­ches Backup, al­ler­dings will man im Echt­be­trieb si­cher­lich nicht nur ein Backup des Trans­ak­ti­ons­pro­to­kolls aufheben.

Um also diesen Aspekt ab­zu­bil­den genügt eine kleine Änderung am T‑SQL-Befehl (sprich: der Teil hinter dem ‑Q-Parameter), sowie ein anderer Zeitplan. Im Regelfall werden Trans­ak­ti­ons­pro­to­kol­le drei bis vier Mal stündlich gesichert.

Ein­rich­tung

Diese Angaben dienen nur der Übersichtlichkeit.

Beim Auslöser (Trigger) muß diesmal auch eine Wie­der­ho­lung gesetzt werden.

Auch hier ist der komplette Befehl im Bild nicht erkennbar und dafür im folgenden Bild in seiner vollen Länge dargestellt. 
Fertig ein­ge­rich­tet sollte man Folgendes sehen: 

Kurze Er­läu­te­rung:

Der T‑SQL-Befehl macht nichts Anderes, als die aktuelle Sys­tem­zeit in einen ganz­zah­li­gen Wert zu kon­ver­tie­ren. Diese Zahl wird an­schlie­ßend als Teil des Da­tei­na­mens verwendet, der für die jeweilige Back­up­da­tei vor­ge­se­hen ist.

der Ver­zeich­nis­na­meder Dateiame
\\FileServer\Share\ExampleDB1-###############.trn
der komplette Pfad einer .trn-Back­up­da­tei

Dabei gilt: “#” steht für variable Anteile.

Fazit

Auch wenn es viel­leicht 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, pro­to­kol­liert die einzelnen Schritte sorg­fäl­tig und ver­schickt auf Wunsch E‑Mails über die Er­geb­nis­se. Kurz: Er ist ein kom­for­ta­bler Verwalter der einzelnen Aufgaben, aber die Arbeit machen andere. Entweder die SQL Server Engine direkt oder externe Programme, welche bereits im Windows vorhanden bzw. in­stal­liert sind.

Wie die vor­ge­stell­te Lösung zeigt, ist man jedoch nicht auf den SQL Server Agent an­ge­wie­sen, falls man bestimmte Vorgänge im SQL Server auslösen will. Natürlich wird niemand be­strei­ten, dass die Ver­wen­dung des SQL Server Agents wann immer es geht vor­zu­zie­hen ist. Al­ler­dings gibt es im Alltag auch hin und wieder An­wen­dungs­fäl­le, in denen man tat­säch­lich auf eine Al­ter­na­ti­ve an­ge­wie­sen ist. In einem weiteren DBA Tipp wird das hier gezeigte Beispiel erneut auf­ge­grif­fen und dann durch den Einsatz anderer Werkzeuge/Technologien rea­li­siert sowie ergänzt.

Du hast ver­schie­de­ne An­wen­dun­gen, die aus un­ter­schied­li­chen Gründen Vorgänge in deinen MS SQL Servern auslösen müssen, weißt jedoch nicht wie?

Ruf uns unter +49.371.909515–100 an. Unsere Spe­zia­lis­ten helfen dir gern weiter.

Hier findest du weitere in­ter­es­san­te DBA Tipps oder Posts zum Thema SQL Server aus unserem News und Insights Bereich. 
icon-arrow_right_medium-violet-blue.svg

Share this article

Facebook 
Twitter 
LinkedIn 
XING 
WhatsApp 
Email