Jak skryptować migrację bazy danych za pomocą tunelu SSH?

7

Próbuję utworzyć sync.sh skrypt, który współdziała z naszą mniej niż idealną kontrolą wersji dla naszej strony. Ten skrypt przeniesie kopię bazy danych na żywo do naszego środowiska programistycznego i kilku innych rzeczy. Mam problem z częścią migracji mysql.

Ten skrypt jest uruchamiany na komputerze programistycznym. remote jest żywym gospodarzem.

# --------------
# database

# ssh tunnel
ssh -L 3307:remote:3306 user@remote

# mysql dump
mysqldump -u someuser -h remote -P 3307 -p"p4ssw0rd" db > localfile.sql

# somehow close ssh tunnel ???

# populate local db with sql dump file
mysql -ulocal db < localfile.sql

# -----------------
# other sync stuff
# ...

Po uruchomieniu części skryptu mysql otrzymuję następujące dane wyjściowe:

Pseudo-terminal will not be allocated because stdin is not a terminal.
Enter password: 

Mamy konfigurację kluczy ssh i mogę poprawnie ssh do pilota. Jednak gdy działa w kontekście skryptu, wszystko idzie nie tak. Myślę, że jestem po prostu całkowitym noobem. Zgaduję, że jeśli po prostu zmienię strukturę mojego podejścia, nie powinienem mieć problemu. Po prostu nie wiem, jak to zrobić ...

user633183
źródło

Odpowiedzi:

7

Wystarczy przeciągnąć zrzut za pomocą jednego polecenia:

ssh użytkownik @ host 'mysqldump -u -p nazwa_bazy_danych' & gt; /path/to/local/file.sql

Możesz je również skompresować, jeśli twoja baza danych jest duża:

ssh user @ host 'mysqldump -u -p databasename | gzip '& gt; /path/to/local/file.sql.gz

a potem strzelaj.

InChargeOfIT
źródło
O cholera, wydaje mi się, że nie widziałem lasu dla drzew ;-)
Marian
1
To wymaga tego mysqldump jest zainstalowany na zdalnym komputerze i jest żądaną wersją itp.
AndreKR
4

The ssh -L 3307:remote:3306 user@remote polecenie nigdy nie powróci, ponieważ po prostu otworzy powłokę i pozostawi ją otwartą.

SSH zachowuje się w następujący sposób: utrzymuje połączenie otwarte, dopóki wykonywane jest polecenie lub używany jest tunel. Więc chcesz to zrobić ssh user@remote sleep 10 &. Daje to poleceniu mysqldump wystarczająco dużo czasu na otwarcie połączenia, ale gdy tylko mysqldump zamknie to połączenie, tunel jest nieużywany i SSH kończy działanie.

btw, być może trzeba będzie użyć 3307: localhost: 3306, jeśli serwer nie zezwala na połączenia zewnętrzne. (Działa to, ponieważ nazwa hosta jest rozwiązana po stronie serwera, a nie po stronie klienta)

Marian
źródło
1
Za pomocą -f zamiast & pozwala najpierw wprowadzić hasło
AndreKR
0

Być może uzasadnione jest inne podejście - dwa skrypty. Skrypt A byłby skryptem, który należy wykonać na zdalnym hoście. Skrypt B byłby skryptem kontrolnym, który 1) kopiuje Sctipt A do zdalnego serwera, 2) SSH do zdalnego serwera i wykonuje skopiowany skrypt, 3) kopiuje wynikowy plik zrzutu i 4) ładuje lokalną bazę danych

uSlackr
źródło