Tymczasowy tunel SSH do celów tworzenia kopii zapasowych

11

Chciałbym napisać skrypt powłoki (obecnie używający bash), aby automatycznie wykonać kopię zapasową zawartości kilku schematów MySQL na zdalnym serwerze. Serwer zdalny jest zablokowany, aby umożliwić dostęp tylko przez SSH, więc muszę utworzyć tunel SSH przed uruchomieniem mysqldumpw różnych schematach.

Mogę utworzyć tunel bez żadnego problemu, jednak chciałbym mieć możliwość automatycznego zamknięcia go po zakończeniu zrzutu bazy danych.

Obecnie mój skrypt robi to:

/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

Jeśli połączenie jest utrzymywane otwarte przez 600 sekund, oczywiście jeśli jedno z pierwszych zrzutów zajmie więcej czasu, wówczas połączenie zostanie zamknięte przed zakończeniem pozostałych zrzutów. Chciałbym zachować osobne pliki dla każdej kopii zapasowej schematu (więc na razie --databasesuniknę mysqldump).

Jakieś sugestie?

BenM
źródło

Odpowiedzi:

29

Nie musisz zawracać sobie głowy tunelowaniem :-).

Po prostu pozwól mysqldump przesyłać strumieniowo dane za pomocą połączenia SSH:

ssh usr@host mysqldump -u dbuser -ppasswd my-database-name >dumpfile
Śleske
źródło
1
+1 za uniknięcie problemu. Wymaga to, aby mysqldump był dostępny na zdalnym hoście i wierzę, że pokazuje hasło na liście procesów zdalnego serwera, ale zakładając, że te rzeczy nie są problemem, brzmi to o wiele lepsze rozwiązanie.
Mark
3
W odpowiedzi na znaki komentarz „Mark Jul 6 '09 o 16:34” na temat hasła na liście procesów serwera zdalnego (nie mam wystarczającej reputacji, aby dodać komentarz): Możesz utworzyć plik .my.cnf w domu użytkownika katalog na serwerze zdalnym i podaj tam hasło: [klient] hasło = "sekret" Następnie użyj mysqldump (tutaj z kompresją, aby przyspieszyć transfer danych):$ ssh user@host "mysqldump foobar | gzip -9" | gzip -d > foobar.sql
Thomas Schuster
5

Dodaj opcję -N, opcję -f i tryb uśpienia 600, spowoduje to otwarcie tunelu bez uruchamiania go w tle. Następnie możesz uruchomić polecenie za pomocą &, uzyskać PID, a następnie zabić proces ssh po zakończeniu zadań.

/usr/bin/ssh -T -L 4444:127.0.0.1:3306 -l remoteuser 208.77.188.166 &
PID=$!
do_stuff
kill $PID

(Przetestowałem to za pomocą bash - może być konieczna zmiana rzeczy dla innej powłoki)

znak
źródło
4

Niewielka różnica w sugestii sleske, możesz przesłać wyjście mysqldump przez gzip w celu skompresowania przed przesłaniem:

ssh SSH-USER@SERVER mysqldump -u DB-USER -pDB-PASSWORD DB-NAME | gzip -c > DB-NAME.sql.gz
eethann
źródło
Podejrzewam, że to polecenie nie kompresuje się do czasu PO PRZESŁANIU, być może trzeba zacytować bit „mysql ... | gzip”, aby rura została oceniona zdalnie
The Mighty Chris
3

Jak powiedział Śleske, po co zawracać sobie głowę tym szczególnym przypadkiem? Istnieje jednak rozwiązanie do sterowania tunelem ssh w ogólnym przypadku: użyj nazwanego potoku. Najpierw utwórz fajkę w ten sposób:

ssh -l remoteuser 208.77.188.166 mkfifo /tmp/PIPO

Następnie piszesz (blokowanie do potoku) w ssh, aby utworzyć tunel:

/usr/bin/ssh -T -f -L 4444:127.0.0.1:3306 -l remoteuser 208.77.188.166 "echo T > /tmp/PIPO"

Kiedy chcesz zamknąć tunel, po prostu przeczytaj potok:

ssh -l remoteuser 208.77.188.166 cat /tmp/PIPO

Zrobione!

wazoox
źródło
2

Tak bym to napisał

scp backup-db.sh [email protected]:/root/backups/
ssh [email protected] exec /root/backups/backup-db.sh

Gdzie jest skrypt

#!/bin/sh
# backup-db.sh
DUMPARGS=--compress -h 127.0.0.1 -P 4444 -u user -ppassword
BACKUP_PATH=/root/backups/snapshot

/usr/bin/mysqldump $DUMPARGS db1 | bzip2 > $BACKUP_PATH/db1.sql.bz2
/usr/bin/mysqldump $DUMPARGS db2 | bzip2 > $BACKUP_PATH/db2.sql.bz2
/usr/bin/mysqldump $DUMPARGS db3 | bzip2 > $BACKUP_PATH/db3.sql.bz2

Wreszcie archiwum można scpprzywrócić za pomocą innego polecenia.
Tak, nie prowadziłem rur ani tunelu.

nik
źródło