Cómo mysqldump db remoto desde la máquina local

177

Necesito hacer un mysqldump de una base de datos en un servidor remoto, pero el servidor no tiene mysqldump instalado. Me gustaría usar mysqldump en mi máquina para conectarme a la base de datos remota y hacer el volcado en mi máquina.

He intentado crear un túnel ssh y luego hacer el volcado, pero esto no parece funcionar. Lo intenté:

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

El túnel se crea con éxito. Si lo hago

telnet localhost 3310

Me sale un mensaje publicitario que muestra la versión correcta del servidor mysql. Sin embargo, hacer lo siguiente parece intentar conectarse localmente

mysqldump -P 3310 -h localhost -u mysql_user -p database_name table_name
Mauritz Hansen
fuente
9
Como esta pregunta está más relacionada con la administración que con la programación, diría que la gente amable de serverfault.com podría ayudarlo mejor.
Piskvor salió del edificio el
Eche un vistazo a MSQL WorkBench 5.2.22. Fácilmente te permitirá hacer esto.
Gary
1
NOTA: para descargar un servidor mysql remoto, incluya --host = sqlserver.host.name --port = 3306
ro0ter
Estoy votando para cerrar esta pregunta como fuera de tema porque pertenece al DBA,
Marqués de Lorne

Respuestas:

244

Como aún no lo he visto en serverfault, y la respuesta es bastante simple:

Cambio:

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

A:

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

Y cambio:

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

A:

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

(no use localhost, es una de estas tonterías de 'significado especial' que probablemente se conecta por socket en lugar de por puerto)

edit : bueno, para elaborar: si el host está configurado en localhost, --socketse supone una opción configurada (o predeterminada) . Consulte el manual para el que se buscan / usan los archivos de opciones. En Windows, esto puede ser una canalización con nombre.

Wrikken
fuente
3
Cuidado: por lo localhostgeneral, el valor predeterminado es ::1IPv6, no 127.0.0.1.
polkovnikov.ph
112

Uno puede invocar mysqldump localmente contra un servidor remoto.

Ejemplo que funcionó para mí:

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

Seguí la documentación de mysqldump sobre las opciones de conexión.

Ondrej Burkert
fuente
9
Ya no es necesario abrir el túnel ssh antes. +1
Estudiante
1
Enfoque más simple, no hay necesidad de conectarse a través de ssh y devolver el archivo a su máquina local. ¡Solo traiga el basurero directamente!
theGabyRod
3
Esto es peligroso, muy peligroso. requiere que el puerto de mysql esté abierto al público. que puede ser fácilmente forzado por los robots.
volkovmqx
55
¿Qué tal estar en una VPN? ¿O hacer un volcado desde una máquina en la que ingresó SSH que tiene acceso a la máquina de la base de datos? El puerto no necesita ser público.
Ondrej Burkert
3
Es importante recordar aquí que se -ptrata del argumento de la contraseña, no del nombre de la base de datos. Pero no es seguro almacenarlo en texto plano, por lo que agregar -psignifica que se le pedirá la contraseña al iniciar sesión. Tal vez sea sólo yo, pero el mysqly por lo tanto la mysqlsintaxis de volcado nunca fue todo lo recta hacia delante tanto como argumentos de línea de comandos.
anon58192932
0

Basado en esta página aquí:

Compare dos bases de datos MySQL

Lo modifiqué para que pueda usar ddbb en diferentes hosts.

#! / bin / sh

echo "Uso: dbdiff [usuario1: contraseña1 @ nombrebd1: host] [usuario2: contraseña2 @ nombrebd2: host] [ignore_table1: ignore_table2 ...]"

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

rm -f /tmp/db.diff

# Comparar
arriba = $ {1 %% @ *}; abajo = $ {1 ## * @}; usuario = $ {up %%: *}; pass = $ {up ## *:}; dbname = $ {down %%: *}; host = $ {down ## *:};
para la tabla en `mysql -u $ user -p $ pass $ dbname -h $ host -N -e" show tables "--batch`; hacer
  if ["` echo $ 3 | grep $ table` "=" "]; luego
    echo "Comparando '$ table' ..."
    volcado $ 1 /tmp/file1.sql
    volcado $ 2 /tmp/file2.sql
    diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff
  más
    echo "Ignorado '$ tabla' ..."
  fi
hecho
menos /tmp/db.diff
rm -f /tmp/file1.sql /tmp/file2.sql
Eduard Pertíñez
fuente
0

mysqldump del servidor remoto usa SSL

1- Seguridad con SSL

192.168.0.101 - servidor remoto

192.168.0.102 - servidor local

Eliminar servidor

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;

-

Servidor local

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 - Seguridad con SSL (REQUERIR X509)

192.168.0.101 - servidor remoto

192.168.0.102 - servidor local

Eliminar servidor

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;

-

Servidor local

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

[Nota]

En el servidor local

/ 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

Copie estos archivos del servidor remoto para (REQUIRE X509) o si SSL sin (REQUIRE X509) no copie


En el servidor remoto

/ 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

Aumentar la seguridad de la contraseña

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

Юрий Светлов
fuente