Raus aus der Komfortzone: Linux, PowerShell und MySQL

comfort

Manchmal ist es an der Zeit, etwas Neues zu probieren. Seit fast zwanzig Jahren beschäftige ich mich mit MySQL Datenbanken. Dabei kommt bei mir (und unseren Kunden) fast ausschließlich Linux zum Einsatz. In diesem Umfeld wurden von mir ein paar Dutzend Skripte in Shell und/oder Perl zur Verwaltung oder zum Monitoring entwickelt und implementiert. So weit, so gut.

Die andere Welt da draußen

In den letzten Tagen hatte ich Kontakt mit einem Kunden, der aktuell seine Datenbanken auf einer Vielzahl von internen Windows-Servern verteilt hat. Im Rahmen einer neuen IT-Strategie sollen diese Systeme nun in die Cloud migriert und auch ein wenig konsolidiert werden. Auch hier existieren viele hilfreiche Skripte. Der größere Teil wurde mit der PowerShell implementiert. Die Frage des Kunden lautet daher: Muss ich die nun alle neu implementieren oder kann ich diese weiter nutzen?

Mut zur Lücke

Bis zum heutigen Tage habe ich mich nicht wirklich tiefgehend mit der PowerShell beschäftigt. Allerdings ist mir bekannt, dass die PowerShell auch für Windows-fremde Systeme wie Linux und den Mac verfügbar ist. Genutzt habe ich das allerdings nie. Zeit dies zu ändern!

Ein Selbstversuch in drei Akten

Es folgt also ein Selbstversuch (unter Zeitdruck), wie und ob man mit der PowerShell unter Linux und MySQL arbeiten kann. Zeit die Stoppuhr zu starten:

Akt 1: Powershell Installation (00 Min. 00 Sek.)

Mein Versuchsobjekt ist ein Ubuntu 18.04 Server mit einer MySQL 8.0.19 DB. Der erste Akt ist auch wieder schnell vorbei und besteht nur aus zwei Kommandos:

  1. Download der Software
  2. Installation der Software
bash> wget https://github.com/PowerShell/PowerShell/releases/download/v6.2.3/powershell_6.2.3-1.ubuntu.18.04_amd64.deb 
bash> dpkg -i powershell_6.2.3-1.ubuntu.18.04_amd64.deb 

Zusätzlich wird noch der MySQL Connector/NET benötigt, um mit der Datenbank kommunizieren zu können.

bash> wget https://dev.mysql.com/get/Downloads/Connector-Net/mysql-connector-net-8.0.19-noinstall.zip 

Akt 2: Skripting (12 Min. 30 Sek.)

Ok, hier habe ich geschummelt. Da ich keine PowerShell Skills habe, habe ich mir im Internet einige Tutorials und Vorlagen angeschaut, um schnell ein Ergebnis zu bekommen. In diesem Moment geht es mir auch nicht darum ein perfektes, möglichst elegantes und effizientes Skript zu schreiben, sondern lediglich um einen funktionalen Test. Mein Ziel: Das Ergebnis eines einfachen SELECTs auf STDOUT auszugeben:

# Import MySQL functions

Add-Type -Assembly /Users/mj/pwsh/mysql-connector-net-8/v4.8/MySql.Data.dll

# Connect to remote MySQL server
$db_con = New-Object MySql.Data.MySqlClient.MySqlConnection
$db_con.ConnectionString = "server=192.168.56.101;port=3310;uid=root;pwd=root;database=mysql"
$db_con.Open()

# Execute MySQL SQL command
$sql = New-Object MySql.Data.MySqlClient.MySqlCommand
$sql.CommandText = "select user, host from user"
$sql.Connection = $db_con
$sql.Prepare()
$data = $sql.ExecuteReader()

# Present data to STDOUT
While ($data.Read())
{
  [PSCustomObject]@{
    $data.GetName(0) = $data.GetValue(0)
    $data.GetName(1) = $data.GetValue(1)
    }
}

$db_con.close() 

Im ersten Abschnitt wird der Funktionsumfang der PowerShell um MySQL Funktionen erweitert. Dazu wird die entsprechende runtergeladene DLL des Connectors eingebunden. Danach wird die Verbindung zur DB aufgebaut. Im nächsten Abschnitt wird das SQL-Kommando an den Server gesendet und das Ergebnis entgegengenommen. Im letzten Schritt wird über das Ergebnis zeilenweise iteriert und die Datensätze werden auf STDOUT ausgegeben.

Akt 3: Testen ( 42 Min. 30 Sek.)

Das Skript funktioniert tadellos.

bash> pwsh mysql.ps

user                       host
----                       ----
backup                     %
blog                       localhost
mj                         localhost
mysql.infoschema           localhost
mysql.session              localhost
mysql.sys                  localhost
root                       localhost
... 

Beflügelt von dem Ergebnis habe ich mir ebenfalls eine PowerShell Umgebung auf meinem Macbook installiert (siehe unten) und das identische Skript (Pfadangabe zur DDL musste angepasst werden) erneut getestet. Auch hier lief das Skript sorgenfrei (48 Min 00. Sek).

bash> brew cask install powershell 

Fazit

Das Ergebnis überzeugt und wird sicherlich unseren Kunden erfreuen. Generell ist es problemlos möglich, mit der PowerShell Skripte in heterogenen Umgebungen (Windows/Linux) zu entwickeln und zu betreiben. Die PowerShell ist sicher auch ein mächtiges Werkzeug (der Name legt dieses ja nah ;-)). Ich werde mich daher in naher Zukunft mehr damit beschäftigen und dieses Tool vielleicht auch häufiger einsetzen.