como mysqldump remote db da máquina local

177

Eu preciso fazer um mysqldump de um banco de dados em um servidor remoto, mas o servidor não possui o mysqldump instalado. Gostaria de usar o mysqldump na minha máquina para conectar ao banco de dados remoto e fazer o despejo na minha máquina.

Eu tentei criar um túnel ssh e depois fazer o despejo, mas isso não parece funcionar. Eu tentei:

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

O túnel é criado com sucesso. Se eu fizer

telnet localhost 3310

Eu recebo alguma sinopse que mostra a versão correta do servidor mysql. No entanto, fazer o seguinte parece tentar conectar-se localmente

mysqldump -P 3310 -h localhost -u mysql_user -p database_name table_name
Mauritz Hansen
fonte
9
Como esta questão está mais relacionada à administração do que à programação, eu diria que o pessoal do serverfault.com pode ajudá-lo melhor.
Piskvor saiu do prédio
Dê uma olhada no MSQL WorkBench 5.2.22. Facilmente permitirá que você faça isso.
Gary
1
NOTA: para descarregar um servidor mysql remoto, inclua --host = sqlserver.host.name --port = 3306
ro0ter
Eu estou votando para fechar esta questão como off-topic, porque ele pertence a DBA,
Marquês de Lorne

Respostas:

244

Como ainda não o vi na serverfault, a resposta é bem simples:

Mudança:

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

Para:

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

E mudar:

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

Para:

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

(não use localhost, é um desses absurdos de 'significado especial' que provavelmente se conecta por soquete e não por porta)

edit : bem, para elaborar: se o host estiver definido como localhost, uma opção configurada (ou padrão) --socketserá assumida. Consulte o manual para saber quais arquivos de opções são procurados / usados. No Windows, esse pode ser um pipe nomeado.

Wrikken
fonte
3
Cuidado: localhostmuitas vezes o padrão é ::1IPv6, não 127.0.0.1.
polkovnikov.ph
112

Pode-se chamar o mysqldump localmente em um servidor remoto.

Exemplo que funcionou para mim:

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

Eu segui a documentação do mysqldump sobre opções de conexão.

Ondrej Burkert
fonte
9
Não há mais necessidade de abrir o túnel ssh antes. +1
Aluno
1
abordagem mais simples, não há necessidade de conectar via ssh e trazer o arquivo de volta para a sua máquina local! Basta trazer o despejo diretamente!
Julio
3
isso é perigoso, muito perigoso. requer que a porta do mysql seja aberta ao público. que pode ser facilmente bruto forçado por bots.
volkovmqx
5
Que tal estar em uma VPN? Ou fazer um despejo de uma máquina na qual você SSHed que tenha acesso à máquina de banco de dados? A porta não precisa ser pública.
Ondrej Burkert
3
É importante lembrar aqui que -pé o argumento da senha - não o nome do banco de dados. Mas não é seguro armazená-lo em texto sem formatação, portanto, adicionar -psignifica que você será solicitado a senha no login. Talvez seja só eu, mas a sintaxe mysqle, portanto, a mysqldespejo nunca foram tão simples quanto aos argumentos da linha de comando.
precisa saber é o seguinte
0

Bassed nesta página aqui:

Compare dois bancos de dados MySQL

Eu o modifiquei para que você possa usar o ddbb em diferentes hosts.

#! / bin / sh

echo "Uso: dbdiff [usuário1: pass1 @ dbname1: host] [usuário2: pass2 @ dbname2: host] [ignore_table1: ignore_table2 ...]"

dump () {
  up = $ {1 %% @ *}; down = $ {1 ## * @}; usuário = $ {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
up = $ {1 %% @ *}; down = $ {1 ## * @}; usuário = $ {up %%: *}; pass = $ {up ## *:}; dbname = $ {down %%: *}; host = $ {down ## *:};
para a tabela no `mysql -u $ user -p $ pass $ dbname -h $ host -N -e" show tables "--batch`; Faz
  if ["` echo $ 3 | grep $ table` "=" "]; então
    echo "Comparando '$ table' ..."
    despejar $ 1 /tmp/file1.sql
    dump $ 2 /tmp/file2.sql
    diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff
  outro
    echo "Ignorado '$ table' ..."
  fi
feito
less /tmp/db.diff
rm -f /tmp/file1.sql /tmp/file2.sql
Eduard Pertíñez
fonte
0

mysqldump do servidor remoto usa SSL

1- Segurança com SSL

192.168.0.101 - servidor remoto

192.168.0.102 - servidor local

Remore o 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 - Segurança com SSL (REQUIRE X509)

192.168.0.101 - servidor remoto

192.168.0.102 - servidor local

Remore o 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]

No 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 esses arquivos do servidor remoto para (REQUIRE X509) ou se o SSL sem (REQUIRE X509) não copie


No 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 a segurança da senha

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

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