Azure Analysis Services – Powershell Automation im Tagesgeschäft

Im Rahmen des SQLGrillen 2017 hatte ich das Vergnügen mit Gabi Münster einen Vortrag über Azure Analysis Services und deren Automation halten zu dürfen. Diese Inhalte möchte ich euch nicht vorenthalten und im Folgenden näher erläutern, wobei es nicht um die Prozessautomatisierung der Datenbereitstellung geht sondern um die Automatisierung des Deployments bzw des eigentlichen Services, also Möglichkeiten wie man die Services dem Tagesgeschäft entsprechend optimal einsetzen kann. Die hierbei zum Einsatz kommenden Powershell Skripte habe ich versucht so einfach wie möglich zu halten um allen ein Verständnis zu ermöglichen.

Ausgangslage für die Powershell Automation

Sicherlich gibt es zahlreiche Möglichkeiten um die unterschiedlichen Funktionen, Services und VMs in Azure zu deployen oder bearbeiten, ob nun Azure Automation grafisch, als Runbook oder mit der Azure Command Line… ich habe mich als Ausgangslage dafür entschieden, dass die meisten im normalen Tagesgeschäft (meist on-prem) einen Server habe, der die Job-Steuerung übernimmt, dieser dient mir in meinen Beispielen als Ausgangspunkt für alle Skripte. Als weitere Voraussetzung nutze ich eine Active Directory (AD) Applikation und einen Service Principal um mich bzw meine Skripte an Azure anzumelden. Hierbei habe ich mich an die Beschreibung von Christos Matskas gehalten, die recht gut erläutert wie man sich einen Azure Automation Login erstellt.

Azure Analysis Services Automation programmieren

Diesen Login verwende ich nun entweder als Klartext oder als “INCLUDE” innerhalb meiner Skripte, um das Skript bei jeder Ausführung an Azure anzumelden.

$azureAccountName = "1234567-1234-1234-1234-012345678912" 
$azurePassword = ConvertTo-SecureString "Passwort@2017" -AsPlainText -Force 
$psCred = New-Object System.Management.Automation.PSCredential($azureAccountName, $azurePassword) 
Add-AzureRmAccount -Credential $psCred -ServicePrincipal -TenantId "1234567-1234-1234-1234-012345678912"

Was kann man nun automatisieren?

Mit Powershell kann man natürlich auch das Prozessieren der Datenbanken/Cubes automatisieren, aber darum soll es hier nicht gehen, sondern mehr darum was man als DBA oder DevOps “regelmäßig” machen kann/muss. Zum Beispiel benötigt man im Laufe des Tages nicht unbedingt die gleiche Leistung wie in der Nacht während der Verarbeitung. On-premise bleibt einem nichts anderes übrig als eine Hardware zu kaufen, die alle möglichen Lastzustände abdecken kann, in Azure ist das ein wenig anders, hier kann man entsprechend skalieren. Was unter Berücksichtgung eines gewissen Kostendrucks zu einem positiven Eindruck im Management führen kann, wenn man diesem erklären kann, dass die Kosten für eben diesen Azure Analysis Service durch Automatisierung variabl gestaltet werden kann. Aber fangen wir einmal vorne an…

Entsprechend der vorhandenen Umgebung oder der Konzeptionierung der Datenaufbereitung kann man sich zwischen horizontaler und vertikaler Skalierung entscheiden, bei der vertikalen Skalierung benötigen wir nur einen Azure Analysis Service, den wir nach Bedarf “größer” oder “kleiner” machen können. Bei horizontaler Skalierung könnte man sich zum Beispiel zu bestimmten Zeitpunkten weitere Azure Analysis Services hinzu deployen. Oder wenn man eine Testumgebung nur in bestimmten Zyklen braucht, dann kann man diese eben genauso automatisiert erstellen.

Deployment von Azure Analysis Services

Um den Azure Analysis Service neu oder weitere zu deployen benötigen wir den Powershell Befehl “New-AzureRmAnalysisServicesServer“, mit Anmeldung und weiterer Parametrisierung ergibt sich folgender Ablauf bzw folgendes Script:

  • Anmeldung an Azure
  • Variablen deklarieren (SubscriptionID, ResourceGroupName, AAS-Name, etc)
  • Prüfen ob die Ressource-Gruppe existiert, ggfs erstellen.
  • Prüfen ob der anzulegende Azure Analysis Service bereits existiert, ggfs erstellen
    • Angabe von ResourceGroupName, AAS-Name, Performance-Klasse und der EMail des Administrators
$myResourceGroupName = 'SQLGrillen2017'
$mySubscriptionID = '1234567-1234-1234-1234-012345678912'
$myLocation = 'West Europe'
$myAAServerName = 'asbeer01'
 
Set-AzureRmContext -SubscriptionId $mySubscriptionID
 
Get-AzureRmResourceGroup -Name $myResourceGroupName -ev notPresent -ea 0
if ($notPresent) {
    New-AzureRmResourceGroup -Name $myResourceGroupName -Location $myLocation
} else {
    write-host "ResourceGroup already exists"
}
 
Get-AzureRmAnalysisServicesServer -ResourceGroupName $myResourceGroupName -Name $myAAServerName -ev notPresent -ea 0
if ($notPresent) {
    New-AzureRmAnalysisServicesServer -ResourceGroupName $myResourceGroupName -Name $myAAServerName -Location $myLocation -Sku "S0" -Administrator "your-admin-mailadress@test-url.de"
} else {
    write-host "AAS Server already exists"
}

Die Ausführung dauert nicht wirklich lange, aber ein wenig Geduld muss schon aufbringen. (2-3 Minuten)

Geduld

Wieviel Leistung wann in Azure Analysis Services

Nun gibt es im Tagesverlauf oder Verlauf eines Monats unterschiedliche Last-Situationen, in der Nacht während der Verarbeitung wird mehr Leistung benötigt, als tagsüber wenn die Mitarbeiter nur ihre Reports ziehen oder Analysen machen. Weitere Möglichkeit sind der Monatsende, das Quartalsende oder der Jahresabschluss, hier wird wesentlich mehr Performance gebraucht als an anderen Tagen, wobei man on-Premise diese Kapazität von Anfang an bedenken muss und die Maschine entsprechend im voraus darauf auslegen, damit alle erdenklichen Last-Verhalten abgedeckt werden. Als Azure Analysis Services ist dies nun wesentlich einfacher, denn Azure bietet die Möglichkeit auf relativ einfache Art und Weise die Leistung des Service an die auftretende Last anzupassen. Auch hierzu benötigt man nur den Powershell Befehl “Set-AzureRmAnalysisServicesServer“, mit Anmeldung und weiterer Parametrisierung ergibt sich auch hier folgendes Script:

  • Anmeldung an Azure
  • Variablen deklarieren (SubscriptionID, ResourceGroupName, AAS-Name, etc)
  • Prüfen ob die Ressource-Gruppe existiert, ggfs erstellen.
  • Prüfen ob der anzulegende Azure Analysis Service existiert, um diese hoch oder runter zu skalieren
    • Angabe von ResourceGroupName, AAS-Name, neuer Performance-Klasse
$myResourceGroupName = 'SQLGrillen2017'
$mySubscriptionID = '1234567-1234-1234-1234-012345678912'
$myLocation = 'West Europe'
$myAAServerName = 'asbeer01'
 
Set-AzureRmContext -SubscriptionId $mySubscriptionID
 
# Upscale Azure Analysis Services
Get-AzureRmAnalysisServicesServer -ResourceGroupName $myResourceGroupName -Name $myAAServerName -ev notPresent -ea 0
if ($notPresent) {
    write-host "AAS Server does not exists"
} else {
    Set-AzureRmAnalysisServicesServer -Name $myAAServerName -ResourceGroupName $myResourceGroupName -SKU "S4"
}
 
# Downscale Azure Analysis Services
Get-AzureRmAnalysisServicesServer -ResourceGroupName $myResourceGroupName -Name $myAAServerName -ev notPresent -ea 0
if ($notPresent) {
    write-host "AAS Server does not exists"
} else {
    Set-AzureRmAnalysisServicesServer -Name $myAAServerName -ResourceGroupName $myResourceGroupName -SKU "S2"
}

Über das Skalieren des Azure Analysis Services kann man nun auch die Kosten reduzieren, da in der Nutzungsärmeren Zeit die benötigte Leistungsklasse verwendet wird und nur wenn die Verarbeitung läuft auf ein performanteres PerformanceModel skaliert. Dieses Skalieren funktioniert online, so dass man nicht einmal mit einer Unterbrechung des Services rechnen muss.

Resize Azure Analysis Services Demo

Kann man das auch abschalten?

In manchen Umgebungen und Lösungen ergibt sich unter Umständen auch die Notwendigkeit oder Möglichkeit den Azure Analysis Services komplett “abzuschalten”, entweder man hat horizontal skaliert und benötigt unter Tage kein Service oder die Solution gibt es her, dass nach der Verarbeitung kein Azure Analysis Service mehr benötigt wird. Hierzu bietet die Azure Powershell Automation ebenfalls ein Cmdlet (Suspend/Resume), mit dem man den Service pausieren bzw wieder starten kann. Da man dieses Skript nur einsetzt, wenn ein AAS bereits vorhanden ist, verzichte ich hier auf das Überprüfen der Ressourcen-Gruppe und prüfe nur, ob der Analysis Service mit dem gegebenen Namen tatsächlich vorhanden ist.

$myResourceGroupName = 'SQLGrillen2017'
$mySubscriptionID = '1234567-1234-1234-1234-012345678912'
$myLocation = 'West Europe'
$myAAServerName = 'asbeer01'
 
Set-AzureRmContext -SubscriptionId $mySubscriptionID
 
# Pause AAS
Get-AzureRmAnalysisServicesServer -ResourceGroupName $myResourceGroupName -Name $myAAServerName -ev notPresent -ea 0
if ($notPresent) {
    write-host "AAS Server does not exists"
} else {
    Suspend-AzureRmAnalysisServicesServer -Name $myAAServerName -ResourceGroupName $myResourceGroupName
}
 
# Resume AAS
Get-AzureRmAnalysisServicesServer -ResourceGroupName $myResourceGroupName -Name $myAAServerName -ev notPresent -ea 0
if ($notPresent) {
    write-host "AAS Server does not exists"
} else {
    Resume-AzureRmAnalysisServicesServer -Name $myAAServerName -ResourceGroupName $myResourceGroupName
}
Björn arbeitet in Hamburg als Datenbank-Administrator und Head of Competence für MS SQL und mySQL. Er nimmt regelmäßig an den PASS Regionalgruppen Treffen in Hamburg, den Veranstaltungen der PASS wie SQLSaturday und SQLGrillen teil und er organisiert in Hamburg das Azure Meetup. Er interessiert sich neben den Themen rund um den SQL Server, Powershell und Azure für Science-Fiction, Snowboarden, Backen 😉 und Radfahren.

SQLGrillen 2017 – die Data Platform Community Veranstaltung im Norden

Anfang Juni war es wieder so weit, William Durkin lud wieder ins Emsland nach Lingen ein, um einen kostenfreien SQL Server Trainingstag – das SQLGrillen – zu veranstalten. Da das zweite SQLGrillen in 2016 schon sehr gut durch die Fachwelt angenommen wurde, hatte man größere Ambitionen für 2017. In 2016 waren es “nur” 3 Tracks und “nur” ein Freitag Nachmittag von 13-20 Uhr und “nur” etwa 60 Teilnehmer, in 2017 sollte es mehr werden… so brachte es das Organisations-Team am Ende auf 4 Tracks für den kompletten Freitag! Und wenn man sich die Sprecher-Liste angeschaut hat, dann wunderte man sich schon sehr, wer dort alles anreist ins kleine, beschauliche Lingen.

SQLGrillen 2017 Agenda

Man könnte fast von einem “Who is Who” der SQL Szene sprechen, wenn selbst aus den USA Sprecher nach Lingen kommen… so wurde das SQLGrillen 2017 sogar zu einem internationalen Event ;-), die weiteren Sprecher kamen aus ganz Europa – von Nord nach Süd, von Norwegen über die Niederlande, Belgien bis nach Slowenien. Die Teilnehmerzahl sprang von 60 auf ~150, was auch einen großartigen Anstieg bedeutet, es gab sogar eine Warteliste.

Für mich war es der erste Event außerhalb meiner Hamburger Regionalgruppe auf dem ich sprechen konnte bzw durfte (Danke an William für die Möglichkeit), daher war es ein ganz besonderer Event. Auch ein Danke geht an Gabi mit der ich einen tollen Vortrag über Azure Analysis Serivces mit Powershell Automation halten konnte. Unsere Session lief großartig, vielleicht ein wenig Zuhörer aber bei der Konkurrenz im gleichen Slot: Johan Brattås, Alex Yates, Chrissy LeMaire and Claudio Silva.
Mehr zu meinem Teil der Präsentation gibt es hier => Demo zu Azure Analysis Services
Eigentlich möchte ich hier mehr über meine Erfahrungen im Rahmen des SQLGrillens sowie meines ersten Talks auf solch einer Veranstaltung berichten.

Anreise und erstes Kennenlernen

Abreise war am Donnerstag Vormittag mit dem Ziel vorab einen Arbeitskollegen auf einen Kaffee zu besuchen, also rechtzeitig los. Bei schönstem Wetter ging es über Autobahn und Landstraße entlang der Elbe durch Finkenwerder und das Alte Land, wie verabredet traf ich beim meinem Kollegen ein und wir konnten in aller Ruhe einen Kaffee auf der Terasse geniessen. Herrlich, mein SQLGrillen fing also großartig an. Da ich mit Gabi verabredet hatte, dass wir uns vorab noch einmal zusammensetzen wollten, um die finale Version unserer Slides durchzugehen, fuhr ich rechtzeitig weiter in Richtung Lingen. Diesmal lange Zeit über Landstraßen und wenig Autobahn durch Bremervörde, durch den Weser-Tunnel und dann Cloppenburg bis nach Lingen. Kaum eingetroffen und hingesetzt, kamen wir eigentlich gar nicht dazu unsere Slides anzuschauen, sondern wurden gleich abgefangen… mal wolle das schöne Wetter ausnutzen, um im Kreise von Bekannten und Freunden zusammen zu sitzen und zu unterhalten. Da liessen wir uns auch nicht lange abhalten und zogen mit den anderen in Richtungen Innenstadt.

Communitytreffen SQLGrillen 2017

Ich muss hierzu sagen, einen Teil der anwesenden Sprecher kannte ich bereits und freute mich sehr diese dort wiederzusehen, da ich wußte, dass noch viel mehr kommen sollten war ich sehr gespannt. Wie man an diesem Foto erkennen kann, belegen wir bereits mind. 3 Tische (> 25 Personen), als dann aber der Großteil der auswärtigen Sprecher eintrag, wurde es “skuril”. Denn plötzlich sprang ein Großteil der Anwesenden auf und rannte auf den Platz um die Eintreffenden lautstark zu begrüssen, es wurden viele Hände geschüttelt und sich überschwenglich begrüßt. Ein herrlicher Anblick und eine tolle Erfahrung, wie sehr sich die SQLFamily mag, freut und sich untereinander bestens versteht.

Am Abend fand dann das beliebte Speakers-Dinner in der “alten Posthalterei” statt, mit Bier-Verprobung, mit leckeren Suppen, Hauptgang und Nachspeise. Auch hier hatte die Organisation keine Mühen gescheut und versucht für jeden die passenden Speisen zu finden. Es war eine sehr gemütliche und gesellige Runde, die teilweise noch bis lange in die Nacht zusammen saß. Gabi und ich hatten aber den ersten Slot und haben rechtzeitig den Weg ins Hotel gefunden.

Der Veranstaltungs-Tag

Rechtzeitig zum Frühstück und rechtzeitig vor Ort sein, dann herausfinden, welcher Raum für uns vorgesehen war… gar nicht so einfach, da William im Streß war und wir uns dann mit der Raumtechnik selber vertraut machen mussten. Wir hatten aber Zeit und konnten uns entsprechend vorbereiten, jetzt sind wir dann auch noch mal gemeinsam die Slides durchgegangen… 😉

Unser Vortrag lief im Grunde genauso wie gewünscht, auch die Demos liefen wie erstellt/erhofft. Wir hatten aus unserer Sicht kaum was zu meckern… ok, eine Viertelstunde mehr Zeit wäre toll gewesen, aber wir haben halt versucht auf alle Fragen und Themen aus den Reihen der Zuschauer einzugehen.

Nach unserem Vortrag blieb ausreichend Zeit sich mit den Teilnehmern und anderen Sprechern auszutauschen, also zu netzwerken. Hier kommt der für mich beste Teil des SQLGrillen 2017… ich habe Chrissy LeMaire persönlich getroffen! Eine wirklich tolle Person mit einer unglaublichen Leidschaft für ihr Projekt (dbatools.io) über welches sie und Claudio Silva parallel zu uns einen Vortrag gehalten haben. Ein paar hübsche Aufkleber habe ich auch erhalten, die nun auf meinem Handy und meinem Laptop prangen. Und plötzlich sollte ich dann noch mit auf ein Gruppenfoto derjenigen die sich für das Projekt einsetzen 🙂

Twitter RobSewell dbatools Contributors at SQLGrillen 2017

Nachdem alle Vorträge gehalten wurden, konnte man zum eigentlichen Teil dieser Veranstaltung übergehen… wie William bereits in der Subline seiner Veranstaltung geschrieben hat…

Databases, Bratwurst und Beer

Hier hat man auch nicht zu viel versprochen, es gab nur leckeres Essen und davon reichlich. Hier sollte man auch ein großes “Danke-Schön” an die Sponsoren nicht vergessen, die diesen tollen Event erst möglich gemacht haben! Vielen Dank an Solisyon, vielen Dank auch an die IT-Dienstleistungs GmbH Emsland (it.emsland) und alle weiteren Sponsoren und Freiwilligen, die dazu beigetragen haben, dass diese kostenfreie SQL Server Data Platform Trainingsevent möglich geworden ist.

Ein Termin für das nächste Jahr ist verkündet worden, sowie der erste große Sponsor… am 22.06.2018 ist es wieder soweit, die SQL Server Fachwelt trifft sich in Lingen. Also unbedingt merken, es lohnt sich auf jeden Fall!

 

Björn arbeitet in Hamburg als Datenbank-Administrator und Head of Competence für MS SQL und mySQL. Er nimmt regelmäßig an den PASS Regionalgruppen Treffen in Hamburg, den Veranstaltungen der PASS wie SQLSaturday und SQLGrillen teil und er organisiert in Hamburg das Azure Meetup. Er interessiert sich neben den Themen rund um den SQL Server, Powershell und Azure für Science-Fiction, Snowboarden, Backen 😉 und Radfahren.

neue Session – Powershell Toolbelt für DBAs – PASS UserGroup Hamburg

Am 13.04.2017 habe ich das Vergnügen erneut vor der Regionalgruppe Hamburg der PASS Deutschland e.V. sprechen zu dürfen. Sascha Lorenz und Cornelia Matthesius veranstalten – wie jeden Monat – wieder ein Treffen in der Hamburger Geschäftsstelle von Microsoft, dieses Mal ist es Mittwoch, der 13. April. Anmeldungen am Besten über die Meetup-Plattform =>  SQL Server Hamburg (by PASS Deutschland e.V.)

Automation makes things easier

Wer kennt es nicht? Immer heißt es “du musst effizienter werden”, aber wie… also noch schneller die Arbeit erledigen, aber wo kann man noch Zeit sparen? Natürlich bei immer wieder kehrenden Aufgaben, hier gibt es zweierlei Ansätze…

  • Tasks automatisieren
  • länger dauernde, komplizierte Aufgaben einfacher machen

Wie man das in Bezug auf die DBA-Tätigkeiten umsetzen kann und welche Tools/Produkte/Skripte dabei zum Einsatz kommen (können), darüber werde ich an diesem Abend erzählen.

Beispiele ?!

  • Wie lange braucht man um einen SQL Server von einer älteren Version auf eine neuere Version anzuheben?
    Natürlich inklusiv der Übernahme aller Logins, aller Jobs, aller Linked Server, aller Alerts und aller Datenbanken etc – 1-2 Tage je nach Umfang der einzelnen Unterpunkte.Was würdet ihr aber sagen, wenn man das auch in ~5 Minuten schaffen kann (abhängig von der Datenbank-Größe) und nur einer (!!) Kommandozeile ???
  • Datenbanken von Server zu Server kopieren, Datenfiles und Datenbank umbenennen und Orphaned-Users bereinigen in drei Zeilen Powershell ???

Nicht möglich ???

Lasst euch überraschen, ich habe einige Demos vorbereitet anhand derer ich euch diese Tools vorstellen werde.

Veranstaltungsort

PASS Deutschland e.V. ist die deutsche Microsoft SQL Server Community und ein offizielles Chapter der PASS International. Die Mitgliedschaft bei der PASS ist kostenfrei.

Das Treffen findet am 13. April 2017 um 18:30 in der Microsoft Niederlassung Hamburg in der Gasstraße 6a statt und wird von PASS Deutschland e.V.. ausgerichtet.

Björn arbeitet in Hamburg als Datenbank-Administrator und Head of Competence für MS SQL und mySQL. Er nimmt regelmäßig an den PASS Regionalgruppen Treffen in Hamburg, den Veranstaltungen der PASS wie SQLSaturday und SQLGrillen teil und er organisiert in Hamburg das Azure Meetup. Er interessiert sich neben den Themen rund um den SQL Server, Powershell und Azure für Science-Fiction, Snowboarden, Backen 😉 und Radfahren.

SQLSaturday München #555 – Erlebnisbericht

Historischer SQLSaturday #555 in München

Als erste Veranstaltung überhaupt konnte Andre Essing als Organisator der beliebten Trainingsveranstaltung die Räumlichkeiten des neuen Microsoft Headquarters in München nutzen. Die gelungene Umgebung hatte einen großen Einfluss auf das Wohlbefinden aller Teilnehmer, so dass sowohl die Precons als auch der eigentliche SQLSaturday ein großer Erfolg waren.

Es war mein zweiter SQLSaturday überhaupt, mein zweiter in diesem Jahr und erneut eine wirklich großartige Erfahrung mit welcher Leidenschaft alle Speaker, Volunteers und Orga-Team diese Tage über die Bühne gebracht haben. Erneut hatte ich mich als Volunteer zu zahlreichen Aufgaben als Unterstützer gemeldet und freute mich schon riesig auf die bekannten Namen ( zu vielen Namen hatte ich kein Gesicht, was sich aber im Laufe der beiden Tage änderte ). Aber ich sollte vielleicht vorne anfangen 😉

Meine Anreise nach München

In erster Linie muss ich hier meiner Familie und meinem Arbeitgeber danken. Meiner Familie ging in der Woche gesundheitlich nicht wirklich gut und ich wäre am liebsten zu Hause geblieben, aber meine Frau wollte mir diese Zeit nicht verderben und ließ mich fahren. Zum anderen mein Arbeitgeber, der so freundlich war die Reisekosten zu übernehmen, wenn ich schon in meiner Freizeit (Abbau Gleitzeitstunden 😉 ) mich mit fachlichen Themen beschäftige, mich kostengünstig weiterbilde und (wäre ich als Speaker aufgetreten) auch noch “Marketing” betrieben hätte.

Also meine Anreise fand bereits am Donnerstag mit der Deutschen Bahn statt, über Kassel ging es mit dem ICE nach München, so hatte ich noch etwas Zeit mir den englischen Garten anzuschauen und mich sehr nett mit meiner Vermieterin und Ihrem Lebensgefährten zu unterhalten. Auch dieses Mal habe ich meine Unterkunft mit Airbnb gebucht, die Hälfte vom Ibis-Preis bezahlt und wesentlich weniger als im Innside… und beide Hotels sowie das Microsoft Headquarter waren keine 5 Minuten Fußweg entfernt. Nach einem ausgiebigen Spaziergang im englischen Garten vorbei am chinesischen Turm und dem Eisbach ging es in das Milchhäusl zum gemütlichen Bio-Bierchen und einer leckeren Brotzeit. Wieder in meiner Unterkunft angekommen, lud mich die Vermieterin mit ihrem Lebensgefährten noch auf ein Bierchen und ein lockeres Gespräch ein. Später erfuhr ich, dass die anderen bereits Anwesenden Speaker, Orga und Volunteers sich zum #Warmup in einer Kneipe getroffen hatten…

Die PreCons und der Aufbau

Der Freitag begann recht lustig, manche würden sagen hektisch… anscheinend war von der Security keiner so wirklich auf unsere Veranstaltung und die kommenden Teilnehmer vorbereitet oder man war schlicht überfordert. 😉
Die Teilnehmerlisten und Besucherausweise (im Public-Bereich?) waren vorbereitet und so haben wir uns die Listen und Ausweise geschnappt und allen Teilnehmern selber ausgehändigt. Die nächste Hürde waren die Zugänge… ursprünglich waren die Sessionräume als öffentlicher Bereich geplant, irgendwann hat irgendwer umentschieden und dort “Vereinzeler” aufgestellt… so musste immer einer mit Microsoft-Badge die Türen öffnen um unsere Teilnehmer rein zulassen.

Pünktlich zum 8:30 konnten dann die PreCons starten, zumindest drei von vier… im ersten Session-Raum fehlte es an Strom so dass William und Andre leider nicht mit Ihrer Präsentation starten konnten… aber auch davon hat man sich nicht kleinkriegen lassen und erst einmal ohne Beamer angefangen. Nach rund einer Stunde hatten wir dann auch endlich Strom und konnten die Session ohne Einschränkungen fortsetzen.

SQL Saturday #555 München - PreCons

  • From Zero To Hero – Datawarehousing mit dem SQL Server – Gabi Münster, Frank Geisler, Klaus Höltgen
  • Power BI – Ein Rundumblick – Wolfgang Strasser
  • Azure Extrem – Robert Rasp
  • DevOps & SQL Server – Expert Advice for Teams without a DBA – William Durkin, Andre Kamann

In den Pausen während des Tages wurden wir sehr gut durch Microsoft verpflegt (Vielen Dank an Jan!), so dass es keinem an irgendwas mangelte… Butter-Brezel, Tee, Kaffee, Erfrischungsgetränke und zum Mittag die volle Auswahl (!!)… Respekt dafür. So konnten alle Teilnehmer allzeit gestärkt und frisch in die Sessions zurückkehren.SQL Saturday #555 München - Snacks

Nach den PreCons Sessions haben wir (also das eigentliche SQLSaturday Team um Andre Essing und die Volunteers, sowie die Sponsoren) alle Stände aufgebaut und vorbereitet, alle Banner aufgestellt und uns über die großartigen technischen Möglichkeiten des Microsoft-Atriums erfreut. Zum Abschluss ging es dann für die Speaker, Orga-Team und exc. Volunteers zum gemeinsamen Speakers-Dinner ins Paulaner Brauhaus mit Führung!

SQL Saturday #555 München - Aufbau/Dinner

Der SQL Saturday #555 München

Aufgrund der guten Vorbereitungen und spitzen Vorbereitungen des Orga-Teams (Danke an euch und Andres’ Frau) konnten wir am Samstag Morgen rechtzeitig und ohne großen Stress in den SQL Saturday starten. Die Anmeldung verlief recht ruhig, alle Teilnehmer waren auf das neue Microsoft-Gebäude und die interessanten Sessions gespannt. Nach einer kurzen Einleitung durch Andre Essing (PASS Chapter Leader Bayern) und Jan Schenk (Microsoft Audience Evangelist) verteilte sich die Menge auf die einzelnen Räume (diesmal alle mit Strom).

SQL Saturday #555 München - Einleitung Andre Essing, Jan Schenk

Auch auf diesem SQL Saturday konnten die Teilnehmer aus verschiedenen Tracks wählen und sich so einen individuellen Session-Plan zusammenstellen. Jede Session war maximal 60 Minuten lang, so dass man je nach Zielgruppe einen mehr oder weniger tiefen Einblick in die angebotenen Themen erhielt.

Andre Essing hat es mit seinem Team geschafft zahlreiche nationale und internationale Sprecher für den SQLSaturday #555 zu begeistern, so fanden sich unter den Sprechern auch die verschiedensten Nationalitäten wieder. Diese Sprachen-MischMasch sorgte in Verbindung mit den jeweiligen Themen für sehr spannende und unterhaltsame Vorträge.

Session-Beispiele

  • Niko Neugebauer aus Portugal – Columnstore Technology Improvements in SQL Server 2016
  • Ryan Yates aus England – Why and how to Implement PowerShell DSC for SQL Server
  • Kalen Delaney aus Amerika – Are You Optimistic About Concurrency?
  • Dejan Sarka aus Slowenien – Using R in SQL Server, Power BI, and Azure ML
  • Andre Kamman aus Holland – Powershell community scripts for DBAs
  • Wolfgang Strasser aus Österreich – Bauer BI und seine Pig Data

Ihr seht es war sehr bunt und sehr informativ für jeden…

Den Abschluss bildete – wie auf jedem SQLSaturday – die Raffle, also eine Verlosung von gesponserten Preisen. Diesmal mit dabei eine X-Box, zahlreiche Lizenzen, Sitzkissen, eine Video-DVD vom letzten Summit und viel mehr.

SQL Saturday #555 München - Raffle

Ich möchte mich bei allen Teilnehmern, Sponsoren, Organisatoren, Volonteers und bei Microsoft bedanken für diesen großartigen SQLSaturday #555 in München, es war richtig toll euch alle zu treffen, interessante Vorträge zu hören und nette Leute kennenzulernen. Ich hoffe wir sehen uns bald wieder, aus meiner Sicht voraussichtlich zur SQL Server Konferenz in Darmstadt (oder den einen oder anderen schon vorher in der Regionalgruppe)

Copyright der Bilder liegt bei jeweiligen Fotografen, hier neben meinen eigenen Bilder… Vielen Dank an den @SQLPaparazzo und seinem Flickr-Fotostream

Björn arbeitet in Hamburg als Datenbank-Administrator und Head of Competence für MS SQL und mySQL. Er nimmt regelmäßig an den PASS Regionalgruppen Treffen in Hamburg, den Veranstaltungen der PASS wie SQLSaturday und SQLGrillen teil und er organisiert in Hamburg das Azure Meetup. Er interessiert sich neben den Themen rund um den SQL Server, Powershell und Azure für Science-Fiction, Snowboarden, Backen 😉 und Radfahren.

Powershell meets SQL Server – Backup einer Remote Datenbank

Auf dem SQLSaturday #525 in St. Augustin hatte ich bereits das Vergnügen Andre Kamann zu lauschen, was er alles mit Powershell und dem SQL Server anstellt, meinen zweiten Kontakt zu Andre hatte ich jetzt beim SQLGrillen in Lingen, bei dem er uns die wesentliche Vereinfachung eines Rollouts des Ola Hallengren Skriptes näher brachte. Irgendwie hat mich diese “Vereinfachung” inspiriert… ich bin eigentlich auch eher ein “fauler Hund” und versuche mir mit Tools, Skripten  oder eigenen unterstützenden Webseiten das DBA Leben zu erleichtern. Heute kam dann ein Ticket zu mir, bei dem es um ein einfaches Backup einer Datenbank ging, der Kunde hat Probleme mit seiner Applikation und möchte nun eine Kopie der Datenbank an den Software-Hersteller schicken. Solche Aufgaben haben wir immer wieder, daher dachte ich heute morgen an Andre und seine Powershell-Skripte.
Viele werden jetzt sagen, so ein Backup ist doch recht einfach => entweder auf den Server per RDP oder von seiner Workstation mit dem SQL Server Management Studio verbinden, dann die Datenbank auswählen und mit der rechten Maus “Tasks => Backup => …” Klar das geht, ABER da wir hier meistens über Citrix Steppingsstones oder Admingates in die Kundennetze müssen, erleichtert es uns die Arbeit schon um einiges, wenn wir den einen oder anderen Hop reduzieren können.

Mein Powershell-Template

Da dies meine ersten Schritte mit Powershell-Skripten sind, musste ich mich erst damit auseinandersetzen, wie man am besten ein solches Powershell Skript strukturell aufbaut. Hierzu habe ich auf diesen Powershell Blogs gelesen und keinen “Standard” ausfindig machen können, aber überall konnte ich mir ein wenig abschauen und somit einen “ersten Wurf” eines Powershell Skript Templates erstellen. Natürlich muss sich dieser noch in der täglichen Arbeit bewähren und eventuell angepasst werden, aber erst einmal kann ich (denke ich zumindest) damit arbeiten.

Angefangen habe ich natürlich mit einem Header

# #############################################################################
# DBA - SCRIPT - POWERSHELL
# NAME: template.ps1
# 
# AUTHOR: Björn Peters, SQL-aus-Hamburg.de
# DATE: 2016/08/24
# EMAIL: info@sql-aus-hamburg.de
# 
# COMMENT: This script will....
#
# VERSION HISTORY
# 1.0 2016.08.24 Initial Version.
# 
#
# OPEN POINTS TO ADD
# -Add a Function to ...
# -Fix the...
# 
# #############################################################################

Aus dem Tagesgeschäft weiß ich bzw habe ich die Erkenntnis gezogen, dass es für den DBA/Ausführenden am einfachsten ist, wenn die ggfs manuell zu konfigurierenden Parameter (wenn sie nicht übergeben werden) ganz oben stehen sollten, damit man sie möglichst schnell findet und einfach editieren kann. Also kommt direkt in meinem Powershell Skript Template nach dem Header ein Abschnitt zur Konfiguration des Skriptes.

# --- CONFIG ---#
# Script Path/Directories
$ScriptPath = (Split-Path ((Get-Variable MyInvocation).Value).MyCommand.Path)
$ScriptPluginPath = $ScriptPath + "\plugin\"
$ScriptToolsPath = $ScriptPath + "\tools\"
$ScriptOutputPath = $ScriptPath + "\Output\"
# Date Format
$DateFormat = Get-Date -Format "ddMMyyyy_HHmmss"
# -- END CONFIG ---#

Jetzt kommen wir zu einem der wichtigsten, aber am meisten vernachlässigten Abschnitten eines solchen Powershell Skriptes… der Hilfe.
Bei meinen Recherchen bin ich immer wieder über den Widerspruch gestolpert, dass man auf der einen Seite möglichst sein Skript kurz und übersichtlich gestalten soll, auf der anderen Seite aber gut dokumentiert und erläutert. Natürlich kann man aus einem Skript mehrere Versionen machen, eine zum Ausführen und eine zum Weitergeben… aber das führt meist zu Fehlern da man garantiert nicht immer alle Änderungen in beiden Daten ausführt => also bitte gleich richtig machen und einen Hilfe-Abschnitt integrieren und ausführlich beschreiben.

# --- HELP ---#
<#
.SYNOPSIS
Cmdlet help is awesome.
 
.DESCRIPTION
This Script does a ton of beautiful things!
 
.PARAMETER
 
.INPUTS
 
.OUTPUTS
 
.EXAMPLE
 
.LINK
http://www.sql-aus-hamburg.de
#>
# --- END HELP ---#

Zu guter letzt bleiben nur noch die Abschnitte für die einzelnen Funktionen und das eigentliche Powershell Skript. Früher (zu meinen VB / VBA Zeiten) hatte ich gelernt, dass man die Funktionen immer nach unten schreibt und den eigentlichen Programmcode nach oben. Aber dies scheint (zumindest für Powershell) mittlerweile überholt zu sein, also kommen die Funktionsaufrufe, die eigentliche Logik des Skriptes nach unten.

# --- FUNCTIONS ---#
Param(
 
)
 
BEGIN {
 
}
 
PROCESS {
 
}
 
END {
 
}
# --- END FUNCTIONS ---#
 
# --- SCRIPT ---#

Quellen und großen Dank an :
http://www.lazywinadmin.com/2012/03/powershell-my-script-template.html
Bei Francois habe ich die meisten Dinge (nachdem ich sie auch anderweitig unter “Best Practices” für Powershell Skripte gelesen hatte) in einem Template gefunden und für mich am besten geeignet befunden. Also habe ich sein Template nahezu 1:1 übernommen.

Mein erstes Powershell Skript

Nun zum eigentlichen SQL Server Backup Skript, welches ich mit Powershell umsetzen wollte.
Also ich wollte mit “Bordmitteln” von einer zentralen Maschine ein Backup auf einem Remote SQL Server erstellen, welches ich dann “einfach” für den Kunden oder Drittdienstleister kopieren und bereitstellen konnte. Was liefert also die SQL Server Installation von Haus aus für Möglichkeiten? Natürlich die SQL Server Management Objects (SMO), welche im Rahmen der Management Tools Installation mitinstalliert werden .

Welche Parameter möchte ich denn angeben bzw übergeben, damit mein Backup erfolgreich läuft…

  • Servername
  • Instanzname
  • Datenbankname
  • SQL-Login => Username/Passwort

Nach einigem Nachdenken kamen noch zwei weitere Parameter dazu… => CopyOnly (True/False) und OpenInExplorer (True/False)

Param(
          [Parameter(Mandatory=$true)][string]$ServerName,
          [string]$InstanceName,
          [Parameter(Mandatory=$true)][string]$DatabaseName,
          [string]$SQLUserName,
          [string]$SQLPwd,
          [switch]$CopyOnly = $True,
          [switch]$OpenInExplorer = $False
)

Also BEGIN der Funktion

Erst einmal alle Parameter überpüfen, zusammensetzen und ggfs umsetzen, so dass sie im Skript bzw T-SQL Befehl verwendet werden können.
Vielleicht kann man das optimaler/sicherer gestalten (Anmerkungen/Tips hierzu bitte über die Kommentarfunktion), aber ich wollte ja einen schnellen Erfolg. Zu Beginn der Funktion prüfe ich also, ob es sich um eine Named-Instance oder Default-Instance handelt, wie der User sich anmelden möchte => Windows Authentifizierung oder SQL Login, on das Backup als Copy-Only-Backup erstellt werden soll und natürlich den Zielort des Backups (Default Backup Directory).

BEGIN {
	"Starting Backup on $($ServerName)"
 
        [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null
        [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | out-null
 
        $CommonParameters = ''
 
        if ($InstanceName) {
	    $SQLServer = $ServerName + "\" + $InstanceName
        } else {
            $SQLServer = $ServerName
        }
 
        $SQLSvr = New-Object 'Microsoft.SqlServer.Management.SMO.Server' $SQLServer
        if ($SQLUserName -and $SQLPwd) {
            $SQLSvr.ConnectionContext.LoginSecure=$false;
            $SQLSvr.ConnectionContext.Login=$SQLUserName
            $SQLSvr.ConnectionContext.Password=$SQLPwd
        }
 
	$BackupDir = $SQLSvr.Settings.BackupDirectory "BackupName - $($BackupDir)\$($DatabaseName)_db_$($DateFormat).bak"
 
        if ($CopyOnly -eq $True) { $CommonParameters += " -CopyOnly" }
 
}

Nun kommt der PROCESS

Wie der Name schon sagt, hier geschieht der eigentliche Prozess, also die eigentlich Hauparbeit… Im Falle eines Backup-Skriptes werden hier die Backup Befehle ausgeführt. Da dies mein Einstieg in die Powershell Programmierung ist, es gibt bestimmt Wege dies anders bzw optimaler zu gestalten, aber für mich funktionierte das erst einmal ganz gut so. Wenn also der String $CommonParameters leer oder Null ist wird der einfache Backup Befehl ausgeführt ansonsten werden die WITH-Parameter an den Backup Befehl angehängt. Ansonsten passiert in diesem PROCESS Schritt nicht viel 😉

PROCESS {
        IF([string]::IsNullOrWhiteSpace($CommonParameters)) {
            Backup-SqlDatabase -InputObject $SqlServer -Database $DatabaseName -BackupFile "$($BackupDir)\$($DatabaseName)_db_$($DateFormat).bak"
        } else {
		    Backup-SqlDatabase -InputObject $SqlServer -Database $DatabaseName -BackupFile "$($BackupDir)\$($DatabaseName)_db_$($DateFormat).bak" $CommonParameters
        }
	}

Alles hat ein ENDe

Eigentlich wäre hier nun alles zu Ende, wir haben ein Backup auf einem Remote SQL Server in das Default Backup Verzeichnis geschrieben… hier könnten wir es abholen und dem Anforder zur Verfügung stellen. Aber ich bin ein wenig faul… also was liegt näher als den letzten Schritt noch etwas zu vereinfachen.
Also habe ich in den END Abschnitt einfach einen Explorer Aufruf mit dem Zielpfad (Default Backup Verzeichnis) hinzugefügt, so muss ich nicht erst lange suchen und hin und her klicken, sondern der Explorer öffnet sich direkt mit dem Zielpfad und ich brauche die Datei nur noch weg zu kopieren. 😉

END {
        "Finished Backup on $($ServerName)"
        if ($OpenInExplorer -eq $True) { 
            $NewBackupDir = "\\$($ServerName)\"
            $NewBackupDir += $BackupDir.Replace(':\', '$\')
            Invoke-Item $NewBackupDir 
        }
	}
}
# --- END FUNCTIONS ---#

Zum Abschluss im Skript muss natürlich noch der ganze Ablauf einmal gestartet werden, also rufe ich als “letzte” Zeile des Skriptes schnell die Funktion auf… FERTIG.

Vielen Dank nochmal an Andre für die Inspiration.

Björn arbeitet in Hamburg als Datenbank-Administrator und Head of Competence für MS SQL und mySQL. Er nimmt regelmäßig an den PASS Regionalgruppen Treffen in Hamburg, den Veranstaltungen der PASS wie SQLSaturday und SQLGrillen teil und er organisiert in Hamburg das Azure Meetup. Er interessiert sich neben den Themen rund um den SQL Server, Powershell und Azure für Science-Fiction, Snowboarden, Backen 😉 und Radfahren.