jak mysqldump zdalną bazę danych z lokalnego komputera

177

Muszę zrobić mysqldump bazy danych na zdalnym serwerze, ale serwer nie ma zainstalowanego mysqldump. Chciałbym użyć mysqldump na moim komputerze, aby połączyć się ze zdalną bazą danych i wykonać zrzut na moim komputerze.

Próbowałem utworzyć tunel ssh, a następnie wykonać zrzut, ale to nie działa. Próbowałem:

ssh -f -L3310:remote.server:3306 user@remote.server -N

Tunel powstaje z sukcesem. Jeśli zrobię

telnet localhost 3310

Otrzymuję notkę, która pokazuje poprawną wersję mysql serwera. Jednak wykonanie następujących czynności wydaje się próbować połączyć się lokalnie

mysqldump -P 3310 -h localhost -u mysql_user -p database_name table_name
Mauritz Hansen
źródło
9
Ponieważ to pytanie jest bardziej związane z administracją niż z programowaniem, powiedziałbym, że mili ludzie z serverfault.com mogliby ci lepiej pomóc.
Piskvor opuścił budynek
Spójrz na MSQL WorkBench 5.2.22. Z łatwością pozwoli ci to zrobić.
Gary,
1
UWAGA: aby zrzucić zdalny serwer mysql, dołącz --host = sqlserver.host.name --port = 3306
ro0ter
Głosuję za zamknięciem tego pytania jako niezwiązanego z tematem, ponieważ należy do DBA,
Marquis of Lorne

Odpowiedzi:

244

Ponieważ nie widziałem tego jeszcze w przypadku awarii serwera, a odpowiedź jest dość prosta:

Zmiana:

ssh -f -L3310:remote.server:3306 user@remote.server -N

Do:

ssh -f -L3310:localhost:3306 user@remote.server -N

I zmień:

mysqldump -P 3310 -h localhost -u mysql_user -p database_name table_name

Do:

mysqldump -P 3310 -h 127.0.0.1 -u mysql_user -p database_name table_name

(nie używaj localhost, jest to jeden z tych bzdur o „specjalnym znaczeniu”, który prawdopodobnie łączy się przez gniazdo, a nie przez port)

edit : no cóż, rozwinąć: jeśli host jest ustawiony na localhost, zakładana jest skonfigurowana (lub domyślna) --socketopcja. Zapoznaj się z instrukcją dotyczącą poszukiwanych / używanych plików opcji. W systemie Windows może to być nazwany potok.

Wrikken
źródło
3
Uwaga: localhostczęsto domyślnie ::1IPv6, nie 127.0.0.1.
polkovnikov.ph
112

Można wywołać mysqldump lokalnie na zdalnym serwerze.

Przykład, który zadziałał dla mnie:

mysqldump -h hostname-of-the-server -u mysql_user -p database_name > file.sql

Postępowałem zgodnie z dokumentacją mysqldump dotyczącą opcji połączenia.

Ondrej Burkert
źródło
9
Nie ma już potrzeby wcześniejszego otwierania tunelu SSH. +1
Learner
1
najprostsze podejście, nie ma potrzeby łączenia się przez ssh i przenoszenia pliku z powrotem na komputer lokalny! Po prostu przynieś zrzut bezpośrednio!
theGabyRod
3
to jest niebezpieczne, bardzo niebezpieczne. wymaga, aby port mysql był publicznie dostępny. które mogą być łatwo brutalnie wymuszone przez boty.
volkovmqx
5
A co z byciem w VPN? A może wykonujesz zrzut z komputera, do którego nawiązałeś połączenie, i który ma dostęp do maszyny z bazą danych? Port nie musi być publiczny.
Ondrej Burkert,
3
Należy pamiętać, że -pdotyczy to argumentu hasła, a nie nazwy bazy danych. Jednak przechowywanie go w postaci zwykłego tekstu jest niebezpieczne, więc dodanie -poznacza, że ​​podczas logowania zostanie wyświetlony monit o podanie hasła. Może to tylko ja, ale mysqli tym samym mysqldump nigdy nie było wszystko, co proste miarę argumentów wiersza poleceń.
anon58192932
0

Bassed na tej stronie tutaj:

Porównaj dwie bazy danych MySQL

Zmodyfikowałem go, abyś mógł używać ddbb na różnych hostach.

#! / bin / sh

echo "Użycie: dbdiff [użytkownik1: przebieg1 @ dbname1: host] [użytkownik2: przebieg2 @ dbname2: host] [ignore_table1: ignore_table2 ...]"

dump () {
  up = {1 %% @ *} USD; dół = {1 ## * @} $; user = $ {up %%: *}; pass = $ {up ## *:}; dbname = $ {w dół %%: *}; host = $ {down ## *:};
  mysqldump --opt --compact --skip-extended-insert -u $ user -p $ pass $ dbname -h $ host $ table> $ 2
}

rm -f /tmp/db.diff

# Porównaj
up = {1 %% @ *} USD; dół = {1 ## * @} $; user = $ {up %%: *}; pass = $ {up ## *:}; dbname = $ {w dół %%: *}; host = $ {down ## *:};
dla tabeli w `mysql -u $ user -p $ pass $ dbname -h $ host -N -e" pokaż tabele "--batch`; robić
  if ["` echo $ 3 | grep $ table` "=" "]; następnie
    echo "Porównywanie '$ table' ..."
    dump $ 1 /tmp/file1.sql
    dump $ 2 /tmp/file2.sql
    diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff
  jeszcze
    echo "Zignorowano '$ table' ..."
  fi
Gotowe
mniej /tmp/db.diff
rm -f /tmp/file1.sql /tmp/file2.sql
Eduard Pertíñez
źródło
0

mysqldump ze zdalnego serwera używa SSL

1- Bezpieczeństwo z SSL

192.168.0.101 - zdalny serwer

192.168.0.102 - serwer lokalny

Serwer Remore

CREATE USER 'backup_remote_2'@'192.168.0.102' IDENTIFIED WITH caching_sha2_password BY '3333333' REQUIRE SSL;

GRANT ALL PRIVILEGES ON *.* TO 'backup_remote_2'@'192.168.0.102';

FLUSH PRIVILEGES;

-

Serwer lokalny

sudo /usr/local/mysql/bin/mysqldump \
 --databases test_1 \
 --host=192.168.0.101 \
 --user=backup_remote_2 \
 --password=3333333 \
 --master-data \
 --set-gtid-purged \
 --events \
 --triggers \
 --routines \
 --verbose \
 --ssl-mode=REQUIRED \
 --result-file=/home/db_1.sql

====================================

2 - Bezpieczeństwo z SSL (WYMAGANE X509)

192.168.0.101 - zdalny serwer

192.168.0.102 - serwer lokalny

Serwer Remore

CREATE USER 'backup_remote'@'192.168.0.102' IDENTIFIED WITH caching_sha2_password BY '1111111' REQUIRE X509;

GRANT ALL PRIVILEGES ON *.* TO 'backup_remote'@'192.168.0.102';

FLUSH PRIVILEGES;

-

Serwer lokalny

sudo /usr/local/mysql/bin/mysqldump \
 --databases test_1 \
 --host=192.168.0.101 \
 --user=backup_remote \
 --password=1111111 \
 --events \
 --triggers \
 --routines \
 --verbose \
 --ssl-mode=VERIFY_CA \
 --ssl-ca=/usr/local/mysql/data/ssl/ca.pem \
 --ssl-cert=/usr/local/mysql/data/ssl/client-cert.pem \
 --ssl-key=/usr/local/mysql/data/ssl/client-key.pem \
 --result-file=/home/db_name.sql

[Uwaga]

Na serwerze lokalnym

/ usr / local / mysql / data / ssl /

-rw------- 1 mysql mysql 1.7K Apr 16 22:28 ca-key.pem
-rw-r--r-- 1 mysql mysql 1.1K Apr 16 22:28 ca.pem
-rw-r--r-- 1 mysql mysql 1.1K Apr 16 22:28 client-cert.pem
-rw------- 1 mysql mysql 1.7K Apr 16 22:28 client-key.pem

Skopiuj te pliki ze zdalnego serwera dla (REQUIRE X509) lub jeśli SSL bez (REQUIRE X509) nie kopiuj


Na serwerze zdalnym

/ usr / local / mysql / data /

-rw------- 1 mysql mysql 1.7K Apr 16 22:28  ca-key.pem
-rw-r--r-- 1 mysql mysql 1.1K Apr 16 22:28  ca.pem
-rw-r--r-- 1 mysql mysql 1.1K Apr 16 22:28  client-cert.pem
-rw------- 1 mysql mysql 1.7K Apr 16 22:28  client-key.pem
-rw------- 1 mysql mysql 1.7K Apr 16 22:28  private_key.pem
-rw-r--r-- 1 mysql mysql  451 Apr 16 22:28  public_key.pem
-rw-r--r-- 1 mysql mysql 1.1K Apr 16 22:28  server-cert.pem
-rw------- 1 mysql mysql 1.7K Apr 16 22:28  server-key.pem

my.cnf

[mysqld]
# SSL
ssl_ca=/usr/local/mysql/data/ca.pem
ssl_cert=/usr/local/mysql/data/server-cert.pem
ssl_key=/usr/local/mysql/data/server-key.pem

Zwiększ bezpieczeństwo hasła

https://dev.mysql.com/doc/refman/8.0/en/password-security-user.html

Юрий Светлов
źródło