comment mysqldump db distant depuis une machine locale

177

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 ma machine pour me connecter à la base de données distante et faire le vidage sur ma machine.

J'ai essayé de créer un tunnel ssh puis de faire le vidage, 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 texte de présentation qui montre la version correcte du serveur mysql. Cependant, faire ce qui suit semble essayer de se connecter localement

mysqldump -P 3310 -h localhost -u mysql_user -p database_name table_name
Mauritz Hansen
la source
9
Comme cette question est plus liée à l'administration qu'à la programmation, je dirais que les aimables personnes de serverfault.com pourraient mieux vous aider.
Piskvor a quitté le bâtiment le
Jetez un œil à MSQL WorkBench 5.2.22. Cela vous permettra facilement de le faire.
Gary
1
REMARQUE: pour vider un serveur mysql distant, veuillez inclure --host = sqlserver.host.name --port = 3306
ro0ter
Je vote pour fermer cette question comme hors-sujet car elle appartient à DBA,
Marquis of Lorne

Réponses:

244

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

Changement:

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

À:

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

Et changer:

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

À:

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

(n'utilisez pas localhost, c'est une de ces absurdités de 'signification spéciale' qui se connecte probablement par socket plutôt que par port)

edit : eh bien, pour élaborer: si l'hôte est défini sur localhost, une --socketoption configurée (ou par défaut) est supposée. Consultez le manuel pour savoir quels fichiers d'options sont recherchés / utilisés. Sous Windows, cela peut être un tube nommé.

Wrikken
la source
3
Attention: la valeur par localhostdéfaut est souvent ::1IPv6, non 127.0.0.1.
polkovnikov.ph
113

On peut invoquer mysqldump localement sur 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 la documentation mysqldump sur les options de connexion.

Ondrej Burkert
la source
9
Plus besoin d'ouvrir le tunnel ssh avant. +1
Apprenant
1
approche la plus simple, il n'est pas nécessaire de se connecter via ssh et de ramener le fichier sur votre machine locale! Apportez simplement la décharge directement!
theGabyRod
3
c'est dangereux, très dangereux. cela nécessite que le port de mysql soit ouvert au public. qui peut être facilement forcé brutalement par les bots.
volkovmqx
5
Que diriez-vous d'être dans un VPN? Ou faire un vidage à partir d'une machine sur laquelle vous vous êtes connecté en SSH et qui a accès à la machine de base de données? Le port n'a pas besoin d'être public.
Ondrej Burkert
3
Il est important de se rappeler ici que -pc'est pour l'argument mot de passe - pas le nom de la base de données. Mais il n'est pas sûr de le stocker en texte brut, donc l'ajout -psignifie que vous serez invité à entrer le mot de passe lors de la connexion. Peut - être juste moi , mais la mysqlet donc la mysqlsyntaxe de vidage n'a jamais été tout ce que tout droit dans la mesure où les arguments de ligne de commande.
anon58192932
0

Bassé sur cette page ici:

Comparez deux bases de données MySQL

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

#! / bin / sh

echo "Utilisation: dbdiff [user1: pass1 @ dbname1: host] [user2: pass2 @ dbname2: host] [ignore_table1: ignore_table2 ...]"

dump () {
  up = $ {1 %% @ *}; bas = $ {1 ## * @}; utilisateur = $ {jusqu'à %%: *}; pass = $ {up ## *:}; dbname = $ {down %%: *}; hôte = $ {down ## *:};
  mysqldump --opt --compact --skip-extended-insert -u $ utilisateur -p $ pass $ dbname -h $ hôte $ table> $ 2
}

rm -f /tmp/db.diff

# Comparer
up = $ {1 %% @ *}; bas = $ {1 ## * @}; utilisateur = $ {jusqu'à %%: *}; pass = $ {up ## *:}; dbname = $ {down %%: *}; hôte = $ {down ## *:};
pour la table dans `mysql -u $ user -p $ pass $ dbname -h $ host -N -e" show tables "--batch`; faire
  if ["` echo $ 3 | grep $ table` "=" "]; puis
    echo "Comparaison de '$ table' ..."
    vidage $ 1 /tmp/file1.sql
    vidage $ 2 /tmp/file2.sql
    diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff
  autre
    echo "'$ table' ignoré ..."
  Fi
terminé
moins /tmp/db.diff
rm -f /tmp/file1.sql /tmp/file2.sql
Eduard Pertíñez
la source
0

mysqldump du serveur distant utilise SSL

1- Sécurité avec SSL

192.168.0.101 - serveur distant

192.168.0.102 - serveur local

Remore serveur

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 (REQUIRE X509)

192.168.0.101 - serveur distant

192.168.0.102 - serveur local

Remore serveur

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

[Remarque]

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

Copiez ces fichiers du serveur distant pour (REQUIRE X509) ou si SSL sans (REQUIRE X509) ne copiez pas


Sur un 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

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

Augmenter la sécurité des mots de passe

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

Юрий Светлов
la source