2017-09-11 1 views
1

Ich habe eine sehr kleine, nicht-essentielle Datenbank auf meinem NAS, die wöchentlich von einem kleinen Bash-Skript gesichert that is a modified version of this link's one werden:Powershell auf Debian 8 - Rohr von mysqldump gzip

outpath='/media/backupfiles/mysql_data' 
dumpdate=$(date +"%Y-%m-%d") 

mysqldump --user=xxx --password=xxx --events --all-databases | gzip -7 > ${outpath}/mysqldump_${dumpdate}.sql.gz 

Dieses Skript funktioniert einwandfrei. Allerdings habe ich nicht viel Erfahrung mit Bash, während ich gerne mit PowerShell herumcodiere. Natürlich wollte ich einen analogen Powershell-Skript erstellen:

param(
    [string]$OutPath = "/media/backupfiles/mysql_data", 
    [string]$DumpBaseName = "mysqldump_$(Get-Date -Format "yyyy-MM-dd").sql" 
) 

mysqldump --user=xxx --password=xxx --events --all-databases | gzip -7 > $($OutPath)/$($DumpBaseName).gz 

das Skript zu starten, begann ich zuerst die Konsole als root begann dann powershell und dann begann das Skript /home/mysqldump.ps1.

Leider ist das obige Skript nicht funktioniert:

out-Datei: Der Zugriff auf den Pfad '/ media/backupfiles/mysql_data' ist verweigert.

Als ich

mysqldump --user=xxx --password=xxx --events --all-databases | gzip -7 > /media/backupfiles/mysql_data/test.sql.gz

in der Konsole manuell eingeben, wird die Datei erzeugt, aber es ist zu groß (etwa doppelt so groß wie die Bash-Version), hat keine User- Privilegien selbst (was bedeutet, dass ich chown ausführen muss, bevor ich darauf zugreifen kann), und auch, wenn ich dann versuche, es (mit 7-zip oder mit gzip -d) zu öffnen, sagen mir beide, dass die Datei nicht geöffnet werden kann und dass Es ist nicht im Gzip-Format.

ich dann versucht:

Start-Process mysqldump -ArgumentList " --user=xxx --password=xxx --events --all-databases | gzip -7 > /media/backupfiles/mysql_data/test.sql.gz" 

Dies schlägt fehl, auch:

mysqldump: unbekannte Option '-7'

Für mich scheint es, wie das Rohr/Umleitungsoperator ist das Problem. Leider habe ich keine Ideen mehr, wie dieses Skript funktioniert (ohne Zwischendateien oder -skripte). Das Internet erwies sich dieses Mal nicht als sehr hilfreich, aber das könnte dadurch entstehen, dass ich nach den falschen Dingen suche.

Gibt es etwas, das ich vermisse? Oder versuche ich einfach eine Funktionalität zu bekommen, die (noch) nicht in PowerShell für Linux implementiert ist?

Gebrauchte Software:

  • OS: Openmediavault 3.0.88 (die Debian ist 4.9.30-2 + ​​deb9u2 ~ bpo8 + 1 2017.06.27) x86_64 GNU/Linux)
  • Powershell: v6.0.0-beta.6
  • gzip: 1,6
  • mysqldump: Ver 10.13 Verteilung 5.5.57

Antwort

2

Der Umleitungsoperator > in PowerShell funktioniert genauso wie | Out-File. Die Standardcodierung für Out-File ist Unicode (genau UTF-16 LE), die für den Umleitungsoperator nicht geändert werden kann.

Ersetzen

... > $($OutPath)/$($DumpBaseName).gz 

entweder mit

... | Out-File "${OutPath}/${DumpBaseName}.gz" -Encoding Ascii 

oder

... | Set-Content "${OutPath}/${DumpBaseName}.gz" 

Die Set-Content cmdlet standardmäßig auf ASCII-Ausgang.

Persönlich würde ich mit bash für eine Aufgabe wie diese bleiben. Sie verwenden externe Befehle, um einen Text-Dump in eine (komprimierte) Ausgabedatei zu schreiben, damit Sie die PowerShell-Funktionen nicht überall nutzen können. Der einzige Unterschied zwischen Ihrem Bash- und PowerShell-Code besteht darin, dass der PowerShell-Code über Parameter mit Standardwerten verfügt. Sie können über den Parameter Expansion etwas ähnliches in bash tun:

outpath="${1:-'/media/backupfiles/mysql_data'}" 
dumpdate="${2:-$(date +"%Y-%m-%d")}" 

Die oben weisen den ersten und zweiten Positionsparameter (oder den angegebenen Standardwert, wenn der Parameter fehlt) auf die Variablen $outpath und $dumpdate ist. Ordnung geht hier jedoch. Wenn Sie die Parameter in der Lage sein, unabhängig voneinander zu spezifizieren (zB das Datum als Parameter übergeben, aber nicht den Pfad) benötigen Sie Code wie folgt:

while getopts ':do' opt; do 
    case "$opt" in 
    d) dumpdate="$OPTARG";; 
    o) outpath="$OPTARG";; 
    \?) echo "Invalid option: -${OPTARG}"; exit 1;; 
    esac 
done 
shift $((OPTIND-1)) 

outpath="${outpath:-'/media/backupfiles/mysql_data'}" 
dumpdate="${dumpdate:-$(date +"%Y-%m-%d")}" 
+0

Ich verstehe, dass es keinen Vorteil in meinem Powershell -"Implementierung"; es ist nur dafür zu lernen, wie die Dinge funktionieren. Vielen Dank für die Erläuterung der Parameter in Bash und die Erläuterung von '>' in PowerShell; jedoch schlagen beide Vorschläge zum Ersetzen von '>' fehl. 'Out-File .. -Encoding ascii' gibt eine Datei von anständiger Größe zurück, ist aber immer noch nicht lesbar ('gzip -d'/7zip GUI). 'Set-Content' erzeugt ein .gz, das wiederum doppelt so groß ist wie das funktionierende Bash-Skript (allerdings nicht die gleiche Größe wie bei Verwendung von'> '), aber immer noch nicht lesbar. – flolilolilo

+0

Ich habe keine Ahnung, was dort passiert, aber es sieht wie ein Fehler für mich aus. –