219 votes

comment faire pour mysqldump une base de données distante à partir de la machine locale ?

J'ai besoin de faire un mysqldump d'une base de données sur un serveur distant, mais le serveur n'a pas mysqldump installé. Je voudrais utiliser mysqldump sur mon ordinateur pour me connecter à la base de données distante et effectuer le vidage sur mon ordinateur.

J'ai essayé de créer un tunnel ssh puis de faire le dump, mais cela ne semble pas fonctionner. J'ai essayé :

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

Le tunnel est créé avec succès. Si je fais

telnet localhost 3310

Je reçois un message qui indique la version correcte du serveur mysql. Cependant, en faisant ce qui suit, on semble essayer de se connecter en local

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

9 votes

Comme cette question est plus liée à l'administration qu'à la programmation, je dirais que les gentils employés de serverfault.com pourrait mieux vous aider.

0 votes

Jetez un coup d'œil à Banc d'essai MSQL 5.2.22. Il vous permettra facilement de le faire.

1 votes

NOTE : pour vider un serveur mysql distant, veuillez inclure --host=sqlserver.host.name --port=3306

284voto

Wrikken Points 37727

Je ne l'ai pas encore vu sur serverfault, et la réponse est assez simple :

Changez :

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

A :

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

Et le changement :

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

(n'utilisez pas localhost, c'est un de ces non-sens 'à signification spéciale' qui se connecte probablement par socket plutôt que par port)

modifier En fait, si l'hôte est configuré en tant que localhost une configuration (ou un défaut) --socket est supposée. Voir le manuel pour lesquels les fichiers d'options sont recherchés / utilisés. Sous Windows, il peut s'agir d'un tuyau nommé.

3 votes

Attention : localhost La valeur par défaut est souvent ::1 IPv6, pas 127.0.0.1 .

0 votes

Que fait -P ? -P est pour port et -p est pour demander le mot de passe.

0 votes

-P est en effet, comme vous le dites, pour port. Comme indiqué dans la question, et fait dans la réponse. N'hésitez pas à laisser tomber cela, et à remplacer 3310 par 3306 dans le tunnel SSH.

184voto

Ondrej Burkert Points 116

On peut invoquer mysqldump localement contre un serveur distant.

Exemple qui a fonctionné pour moi :

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

J'ai suivi le mysqldump documentation sur les options de connexion.

15 votes

Plus besoin d'ouvrir un tunnel ssh avant. +1

1 votes

L'approche la plus simple, il n'y a pas besoin de se connecter via ssh et de ramener le fichier sur votre machine locale ! Il suffit de ramener le dump directement !

6 votes

C'est dangereux, très dangereux. cela nécessite que le port de mysql soit ouvert au public, ce qui peut être facilement forcé par des robots.

18voto

Gary Points 1410

Jetez un coup d'œil à Banc d'essai MSQL 5.2.22. Il vous permettra facilement de le faire.

4voto

Mysqldump depuis un serveur distant utilise SSL

1- Sécurité avec SSL

192.168.0.101 - serveur distant

192.168.0.102 - serveur local

Serveur 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;

-

Serveur 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 - Sécurité avec SSL (EXIGEZ X509)

192.168.0.101 - serveur distant

192.168.0.102 - serveur local

Serveur 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;

-

Serveur 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

[Note]

Sur le serveur 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

Copier ces fichiers du serveur distant pour (REQUIRE X509) ou si SSL sans (REQUIRE X509) ne pas copier.


Sur le serveur distant

/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

mon.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

Renforcer la sécurité des mots de passe

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

0voto

Bassé sur cette page ici :

Comparer deux bases de données MySQL

Je l'ai modifié pour que vous puissiez utiliser ddbb sur différents hôtes.

#!/bin/sh

echo "Usage: dbdiff \[user1:pass1@dbname1:host\] \[user2:pass2@dbname2:host\] \[ignore\_table1:ignore\_table2...\]"

dump () {
  up=${1%%@\*}; down=${1##\*@}; user=${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

# Compare
up=${1%%@\*}; down=${1##\*@}; user=${up%%:\*}; pass=${up##\*:}; dbname=${down%%:\*}; host=${down##\*:};
for table in \`mysql -u $user -p$pass $dbname -h $host -N -e "show tables" --batch\`; do
  if \[ "\`echo $3 | grep $table\`" = "" \]; then
    echo "Comparing '$table'..."
    dump $1 /tmp/file1.sql
    dump $2 /tmp/file2.sql
    diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff
  else
    echo "Ignored '$table'..."
  fi
done
less /tmp/db.diff
rm -f /tmp/file1.sql /tmp/file2.sql

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X