Ich möchte ein Shell-Skript schreiben (derzeit mit Bash), um den Inhalt mehrerer MySQL-Schemas auf einem Remote-Server automatisch zu sichern. Der Remote-Server ist gesperrt, um nur den SSH-Zugriff zuzulassen. Daher muss ich einen SSH-Tunnel erstellen, bevor ich mit mysqldump
den verschiedenen Schemas arbeiten kann.
Ich kann einen Tunnel ohne Probleme erstellen, möchte ihn jedoch nach Abschluss des Datenbank-Dumps automatisch schließen können.
Derzeit macht mein Skript Folgendes:
/usr/bin/ssh -T -f -L 4444:127.0.0.1:3306 -l remoteuser 208.77.188.166 sleep 600
/usr/bin/mysqldump --compress -h 127.0.0.1 -P 4444 -u user -ppassword db1 | gzip > /root/backups/snapshot/db1.sql.gz
/usr/bin/mysqldump --compress -h 127.0.0.1 -P 4444 -u user -ppassword db2 | gzip > /root/backups/snapshot/db2.sql.gz
/usr/bin/mysqldump --compress -h 127.0.0.1 -P 4444 -u user -ppassword db3 | gzip > /root/backups/snapshot/db3.sql.gz
Wenn die Verbindung 600 Sekunden lang offen gehalten wird. Wenn jedoch einer der ersten Speicherauszüge länger dauert, wird die Verbindung geschlossen, bevor die anderen Speicherauszüge abgeschlossen sind. Ich möchte für jede Schemasicherung separate Dateien behalten (daher wird --databases
mysqldump vorerst vermieden).
Irgendwelche Vorschläge?
quelle
$ ssh user@host "mysqldump foobar | gzip -9" | gzip -d > foobar.sql
Fügen Sie die Option -N, die Option -f und den Schlafmodus 600 hinzu. Dadurch wird der Tunnel geöffnet, ohne ihn im Hintergrund auszuführen. Anschließend können Sie den Befehl mit & ausführen, die PID abrufen und den SSH-Prozess beenden, sobald die Jobs abgeschlossen sind.
(Ich habe dies mit Bash getestet - möglicherweise müssen Sie die Dinge für eine andere Shell ändern.)
quelle
Als geringfügige Abweichung von Sleskes Vorschlag können Sie die mysqldump-Ausgabe vor der Übertragung durch gzip leiten, um sie zu komprimieren:
quelle
Wie Sleske sagte, warum sollte man sich in diesem speziellen Fall die Mühe machen? Es gibt jedoch eine Lösung zur Steuerung eines SSH-Tunnels im allgemeinen Fall: Verwenden Sie eine Named Pipe. Erstellen Sie zuerst das Rohr wie folgt:
Dann schreiben Sie (Blockieren in die Pipe) in Ihr SSH, um den Tunnel zu erstellen:
Wenn Sie den Tunnel schließen möchten, lesen Sie einfach die Leitung:
Et voilà!
quelle
So würde ich es schreiben,
Wo das Skript ist,
Schließlich kann das Archiv
scp
mit einem anderen Befehl zurückgesetzt werden.Ja, ich habe weder Rohr noch Tunnel.
quelle