как mysqldump удаленный db с локального компьютера

Мне нужно выполнить mysqldump базы данных на удаленном сервере, но на сервере не установлен mysqldump. Я хотел бы использовать mysqldump на своем компьютере для подключения к удаленной базе данных и сделать дамп на моем компьютере.

Я попытался создать туннель ssh, а затем выполнить дамп, но, похоже, это не сработало. Я пытался:

ssh -f -L3310:remote.server:3306 [email protected] -N

Туннель создан успешно. Если я сделаю

telnet localhost 3310

Я получаю рекламное объявление, в котором показана правильная версия сервера mysql. Однако выполнение следующих действий, похоже, пытается подключиться локально

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

person Mauritz Hansen    schedule 07.06.2010    source источник
comment
Поскольку этот вопрос больше относится к администрированию, чем к программированию, я бы сказал, что добрые люди на serverfault.com могут помочь вам лучше.   -  person Piskvor left the building    schedule 07.06.2010
comment
Взгляните на MSQL WorkBench 5.2.22. Это легко позволит вам это сделать.   -  person Gary    schedule 07.06.2010
comment
ПРИМЕЧАНИЕ: для сброса удаленного сервера mysql включите --host = sqlserver.host.name --port = 3306   -  person ro0ter    schedule 13.02.2017
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что он принадлежит администратору баз данных,   -  person user207421    schedule 05.08.2019


Ответы (4)


Поскольку я еще не видел этого на serverfault, и ответ довольно прост:

Изменять:

ssh -f -L3310:remote.server:3306 [email protected] -N

To:

ssh -f -L3310:localhost:3306 [email protected] -N

И поменяйте:

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

To:

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

(не используйте localhost, это одна из этих бессмыслиц со "особым смыслом", которая, вероятно, подключается через сокет, а не через порт)

edit: ну, чтобы уточнить: если host установлен на localhost, предполагается настроенная (или по умолчанию) опция --socket. См. руководство, в котором ищутся / используются файлы параметров. . В Windows это может быть именованный канал.

person Wrikken    schedule 07.06.2010
comment
Осторожно: localhost часто по умолчанию ::1 IPv6, а не 127.0.0.1. - person polkovnikov.ph; 18.10.2016
comment
Что делает -P? -P - для порта, а -p - для запроса пароля. - person Jeshizaemon; 01.04.2021
comment
-P действительно, как вы говорите, для порта. Как указано в вопросе, так и сделано в ответе. Не стесняйтесь отказаться от этого и заменить 3310 в туннеле SSH на 3306 - person Wrikken; 13.04.2021

Можно вызвать mysqldump локально на удаленном сервере.

Пример, который сработал для меня:

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

Я выполнил документацию по подключению mysqldump. опции.

person Ondrej Burkert    schedule 15.02.2018
comment
Больше не нужно открывать туннель ssh раньше. +1 - person Learner; 30.04.2018
comment
Самый простой подход, нет необходимости подключаться через ssh и возвращать файл на локальный компьютер! Просто принеси дамп прямо! - person theGabyRod; 13.07.2018
comment
это опасно, очень опасно. для этого требуется, чтобы порт mysql был открыт для всех. что может быть легко взломано ботами. - person volkovmqx; 03.09.2018
comment
Как насчет использования VPN? Или делать дамп с машины, к которой вы подключили SSH, которая имеет доступ к машине базы данных? Порт не обязательно должен быть публичным. - person Ondrej Burkert; 05.09.2018
comment
Здесь важно помнить, что -p используется для аргумента пароля, а не для имени базы данных. Но хранить его в виде обычного текста небезопасно, поэтому добавление -p означает, что вам будет предложено ввести пароль при входе в систему. Может быть, это только я, но mysql и, следовательно, mysql синтаксис дампа никогда не был настолько прямолинейным, что и аргументы командной строки. - person anon58192932; 26.09.2018
comment
Бывают ситуации, когда это безопасно, это полезно для пользователей докеров, когда порты доступны только для других контейнеров в их сети, но не для внешнего мира. Так что это не совсем опасно, это зависит от ситуации. - person Jens; 05.08.2019
comment
Этот ответ должен быть отмечен как правильный. Нет необходимости иметь учетные данные ssh + учетные данные базы данных. Вам нужно только взаимодействие с УДАЛЕННОЙ базой данных, поэтому вам нужно будет общаться только с использованием учетных данных базы данных Mysql. Эта команда работает правильно, если у вас, конечно, есть подключение к удаленному серверу (вы можете просто попробовать его с помощью ping). - person eduardosufan; 08.08.2019
comment
Что делать, если сервер БД отличается от сервера приложений, это не сработает - person Ameya; 25.05.2020
comment
Я не понимаю, что вы имеете в виду @Ameya. Есть сервер базы данных и мы выгружаем с него данные. Я не знаю, что вы имеете в виду под сервером приложений. - person Ondrej Burkert; 26.05.2020
comment
В облачной или производственной среде сервер БД отличается от сервера приложений и сервера Bastian / Jump / Terminal. В любом случае игнорируйте мой комментарий, ища решение, с которым я сталкиваюсь в этой типичной настройке. Хотите автоматизировать резервное копирование БД перед установкой нового двоичного файла. - person Ameya; 26.05.2020
comment
Правильно. Но тогда все еще можно связаться с сервером БД (если он действительно доступен с сервера bastion / jump / ..), но намерением моего ответа были простые случаи :) - person Ondrej Burkert; 27.05.2020
comment
@volkovmqx Почему это может быть опасно? Очевидно, база данных должна быть защищена паролем, использование номера порта в качестве единственного контроля доступа было бы явно плохой идеей, я согласен. - person reducing activity; 29.06.2020
comment
Потребуется ли этому решению дополнительное свободное пространство на удаленном хосте для создания дампа в первую очередь? - person Enrique; 19.08.2020
comment
@volkovmqx Быть опасным действительно зависит от обстоятельств. Вы можете подбирать мой сервер в течение всего дня, но даже если вы правильно угадали пароль, вы не войдете, потому что я предоставил привилегии только 'myuser' @ '[my IP]'. Теперь, если вы предоставили 'user' @ '%', вы были бы правы, но это совсем другое обсуждение. - person user1119648; 15.10.2020
comment
На мой взгляд, это лучший ответ ... Если вы добавите --single-transaction к параметрам, вы тоже не получите блокировок, что может быть неплохо для дампа живой производственной базы данных :) - person MrG; 27.01.2021

mysqldump с удаленного сервера использует SSL

1- Безопасность с SSL

192.168.0.101 - удаленный сервер

192.168.0.102 - локальный сервер

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;

-

Локальный сервер

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 - Безопасность с SSL (ТРЕБУЕТСЯ X509)

192.168.0.101 - удаленный сервер

192.168.0.102 - локальный сервер

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;

-

Локальный сервер

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

[Примечание]

На локальном сервере

/ USR / локальные / MySQL / данные / 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

Скопируйте эти файлы с удаленного сервера для (ТРЕБУЕТСЯ X509) или, если SSL без (ТРЕБУЕТСЯ X509), не копируйте


На удаленном сервере

/ USR / местные / MySQL / данные /

-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

Повышение безопасности паролей

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

person Юрий Светлов    schedule 16.04.2020

На основе этой страницы здесь:

Сравните две базы данных MySQL

Я изменил его, чтобы вы могли использовать ddbb на разных хостах.


#!/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
person Eduard Pertíñez    schedule 30.01.2020