Strato Datenbank Backup mit PowerShell via SSH/SFTP

Dieser Blog läuft mit WordPress und wird von Strato gehostet. Es gibt zwar unzählige Backup PlugIns für WordPress, doch ich habe bisher keins gefunden, welches meine Anforderungen erfüllt. Ich möchte eigentlich nur ein Backup der WordPress mySQL Datenbank auf meiner NAS ablegen und dazu meine NAS nicht per FTP oder SSH öffentlich im Internet verfügbar machen.

Ich habe mir daher ein kleines PowerShell Script gebastelt, welches per Taskplaner von meinem lokalem Server ausgeführt wird und sich per SSH und SFTP zu Strato verbindet. Per SSH wird zunächst ein Backup der Datenbank erzeugt, welches im Anschluss runtergeladen wird.

Im Prinzip lässt sich das Script auch mit jedem anderen Hoster oder mySQL Server verwenden, wenn der Server per SSH und SFTP erreichbar ist, daher stelle ich das Script in vereinfachter Form mal hier ein:

$sshserver = "ssh.strato.de"
$sshuser = "domain.de"
$sshpass = "MasterPassword"
$dbname = "DB1234567"
$dbhost = "rdbms.strato.de"
$dbuser = "U1234567"
$dbpass = "DatabasePassword"
$backuppath = "D:\Backup"

$sshpass = $sshpass | ConvertTo-SecureString -AsPlainText -Force
$Creds= New-Object System.Management.Automation.PSCredential -ArgumentList $sshuser, $sshpass

#Load Posh Module
try
{
	Import-Module Posh-SSH
}
catch
{
	write-host "Failed to load Posh"
}

#Create Database Backup

try
{
	[string]$backupfilename = "$dbname" + "_" + (get-date -Format ddMMyyyy) + ".sql"
	$sshsession = New-SSHSession -ComputerName $sshserver -Credential $creds -AcceptKey:$true
	[string]$backupcmd = "mysqldump $dbname --add-drop-table -h $dbhost -u $dbuser -p$dbpass > $backupfilename"
	$backupdb = Invoke-SSHCommand -Index $sshsession.index -Command "$backupcmd"
}
catch
{
	write-host "Backup failed"
}

#Download Backup File

try
{
	$sftpsession = New-SFTPSession -ComputerName $sshserver -Credential $creds
	$backupfile = Get-SFTPFile -Index $sftpsession.index -RemoteFile $backupfilename -LocalPath $backuppath
}
catch
{
	write-host "Backup download failed"
}

#Delete Backup File from webserver

try
{
	$deletecmd = "rm " + "$backupfilename"
	$deletefile = Invoke-SSHCommand -Index $sshsession.index -Command "$deletecmd"
}
catch
{
	write-host "Could not delete Backup on webserver"
}

#Disconnect Session

try
{
	$disconnect = remove-sshsession -index $sshsession.index
	$disconnect = Remove-SFTPSession -Index $sftpsession.index
}
catch
{
	write-host "Could not disconnect SSH/SFTP Session"
}

#Verify
try
{
	test-path "$backuppath\$backupfilename"
}
catch
{
	write-host "Verify failed"
}

Vorausetzung für das Script ist das SSH Powershell Modul, welches hier runtergeladen werden kann:

Das Script lässt sich einfach erweitern, zum Beispiel um einen Bericht bei Fehler/Erfolg per Mail zu verschicken. In der oben angegeben Form wird allerdings nur das Datenbank Backup erzeugt und runtergeladen:

Backup

Vieleicht kann es ja jemand gebrauchen…

3 Kommentare zu “Strato Datenbank Backup mit PowerShell via SSH/SFTP”

  1. Hi Frank,
    beim Aufruf des Befehls „$sshsession = New-SSHSession -ComputerName $strSshServerDnsName -Credential $(Get-PSCredential $strSshServerUsername) -AcceptKey:$true“

    Erhalte ich folgende Fehlermeldung:
    New-SSHSession : Die Datei oder Assembly „Renci.SshNet, Version=2014.4.6.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106“ oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden. In C:\Jobs\Backup\test.ps1:75 Zeichen:15 + $sshsession = New-SSHSession -ComputerName $strSshServerDnsName -Credential $(Ge … + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-SSHSession], FileNotFoundException
    + FullyQualifiedErrorId : System.IO.FileNotFoundException,SSH.NewSshSession

    Ich habe alle Dateien unter „C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PoshSSH“ abgelegt.

    1. Hi Daniel,

      ich glaube da gibt es ein Problem mit dem Modul, kannst du mittels New-SSHSession eine Verbindung zu irgendeinem SSH fähigem Server aufbauen?
      Gruß, Frank

  2. Hi Frank,
    es lag am Modul…entweder war der Download fehlerhaft oder die Installation lief nicht sauber durch.
    Inzwischen funktioniert alles wie gewünscht. Ich habe dein Skript etwas modifiziert und habe nun das Problem, dass wenn die Datei mehr als 2GB hat, die Powershell abstürtzt. System ist Windows Server 2012R2 und die Datei wird auf einer CIFS-Freigabe abgelegt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.