Der folgende Beitrag zeigt, wie man unter Windows 11 eine MySQL-Datenbank per PowerShell Skript automatisiert sichert. Dabei werden mehrere Backups vorgehalten und abgelaufene Sicherungen automatisch gelöscht. Die MySQL-Dumps sind UTF8-kodiert und auf allen Plattformen zurücklesbar.
Vorsicht: Zerschossene Umlaute bei mysqldump.exe + PowerShell
Andere Skripts dieser Art schreiben zwar einen SQL-Dump, doch schaut man näher hin, sind die Umlaute zerschossen.
Der Grund hierfür:
PowerShell kodiert den bereits UTF8-kodierten Stream von mysqldump.exe nochmals als UTF8, was das Ganze am Ende zuverlässig shreddert. Solche Backups sind nicht mehr oder nur unter großem Korrekturaufwand zurücklesbar.
Die Lösung für korrekte Zeichenkodierung in MySQL Backups per PowerShell
Der Trick ist nun der: Man startet mysqldump.exe aus PowerShell heraus in einem regulären Shell-Prozess. Somit bleibt alles sauber UTF8-kodiert, da PowerShell keinen Zugriff auf den Output-Stream hat.
Doch nun zum Backup-Skript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# backup-mysql 1.0.4 # # Backup a MySQL database. # # Run this from a Admin PowerShell, to enable local script execution: # Set-ExecutionPolicy RemoteSigned # # (c)2020-2023 Harald Schneider # Config.start # $PATH_MYSQL = "C:\xampp\mysql\bin\" $PATH_ZIPTOOL = "C:\Program Files\7-Zip\" $PATH_BACKUP = "C:\xampp\custom\backup-mysql\backups\" $HOLD_DAYS = 7 $MYSQL_USR = "root" $MYSQL_PWD = "YOUR_PASSWORD" $MYSQL_DB = "worktime" # # Config.end $date = Get-Date $timestamp = "" + $date.year + "-" + $date.month + "-" + $date.day $backupfile = $PATH_BACKUP + $MYSQL_DB + "_" + $timestamp +".sql" $backupzip = $PATH_BACKUP + $MYSQL_DB + "_" + $timestamp +".zip" echo "" echo "Starting backup ..." cd $PATH_MYSQL # Force output to UTF8 encoding by running this part in a regular shell # This is the way :-) # $CMD = '.\mysqldump.exe --force --opt --routines --quote-names --skip-set-charset --default-character-set=utf8 -u"'+$MYSQL_USR+'" -p"'+$MYSQL_PWD+'" --databases '+$MYSQL_DB+' > '+$backupfile & cmd /c $CMD cd $PATH_ZIPTOOL .\7z.exe a -tzip $backupzip $backupfile del $backupfile echo "Cleaning up ..." cd $PATH_BACKUP $oldbackups = gci *.zip* for($i=0; $i -lt $oldbackups.count; $i++){ if ($oldbackups[$i].CreationTime -lt $date.AddDays(-$HOLD_DAYS)){ $oldbackups[$i] | Remove-Item -Confirm:$false } } echo "DONE!" |
Da die Backups komprimiert gespeichert werden, benötigen wir vorab 7-Zip, Download hier.
Standardmässig ist das Ausführen von PowerShell Scripts in Windows 11 aus Sicherheitsgründen abgeklemmt. Um die Sperre aufzuheben starten wir eine PowerShell per Rechtsklick als Admin und geben den folgenden Befehl ein:
1 |
Set-ExecutionPolicy RemoteSigned |
Wir bestätigen mit A für “Alle”. Von nun an sind lokal erstellte Skripts erlaubt, aus dem Internet geladen Skripts jedoch nicht.
Windows 11: Die Konfiguration des PowerShell MySQL Backup-Skripts
Die verwendeten Konfigurations-Variablen haben die folgende Bedeutung:
- PATH_MYSQL:
Der Pfad zum “bin” Ordner des MySQL Datenbankservers. Hier befinden sich alle Tools, die MySQL mitbringt. Unter Anderem das von uns benötigte mysqldump.exe. Bitte auf den Backslash (“\”) am Ende achten. - PATH_ZIPTOOL:
Der Pfad zur 7-Zip-Installation. Hier benötigen wir 7z.exe. Bitte auf den Backslash am Ende achten. - PATH_BACKUP:
Der Pfad in dem unsere MySQL Backups gespeichert werden sollen, ebenfalls mit Backslash am Ende. - HOLD_DAYS:
Die Anzahl der Tage nach denen Backups automatisch gelöscht werden. - MYSQL_USR und MYSQL_PWD
Der Datenbank User und dessen Passwort. - MYSQL_DB:
Der Name der zu sichernden MySQL Datenbank.
Das Skript speichern wir unter dem Namen “backup-mysql.ps1”.
Powershell Script im Windows Taskplaner (Aufgabenplaner) starten
Folgendes ist beim Anlegen des Tasks zu beachten:
Wir starten nicht das Skript direkt, sondern
1 |
powershell.exe |
Als Parameter übergeben wir in einer einzigen Zeile den PowerShell Switch um die Execution-Policy zu ignorieren und den absoluten Pfad zum Script:
1 |
-ExecutionPolicy ByPass c:\xampp\custom\backup-mysql\backup-mysql.ps1 |
Das ist bereits alles – viel Spass beim Sichern :-)