як з mysqldump віддалений db з локальної машини


177

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

Я спробував створити ssh тунель, а потім зробити дамп, але це, здається, не працює. Я намагався:

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

Тунель створений з успіхом. Якщо я це роблю

telnet localhost 3310

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

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

9
Оскільки це питання більше стосується адміністрування, ніж програмування, я б сказав, що добрі люди на serverfault.com могли б вам краще допомогти.
Пісквор вийшов із будівлі

Погляньте на MSQL WorkBench 5.2.22. Це легко дозволить вам це зробити.
Гері

1
ПРИМІТКА. Для скидання віддаленого сервера mysql, будь ласка, включіть --host = sqlserver.host.name --port = 3306
ro0ter

Я голосую, щоб закрити це питання поза темою, оскільки воно належить до DBA,
маркіз Лорн

Відповіді:


244

Оскільки я цього ще не бачив на сервері за замовчуванням, і відповідь досить проста:

Змінити:

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

До:

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

І зміни:

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

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

edit : добре, щоб уточнити: якщо встановлено хост localhost, передбачається налаштований (або за замовчуванням) --socketваріант. Дивіться посібник, які файли опцій шукаються / використовуються. У Windows це може бути названа труба.


3
Остерігайтеся: localhostчасто за замовчуванням ::1IPv6, ні 127.0.0.1.
polkovnikov.ph

112

Можна викликати mysqldump локально проти віддаленого сервера.

Приклад, який працював на мене:

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

Я дотримувався документації на mysqldump щодо параметрів з'єднання.


9
Більше не потрібно відкривати ssh тунель. +1
Учень

1
найпростіший підхід, не потрібно підключатися через ssh і повертати файл на локальну машину! Просто принесіть смітник прямо!
theGabyRod

3
це небезпечно, дуже небезпечно. він вимагає, щоб порт mysql був відкритим для публіки. що боти можуть бути легко вимушеними.
volkovmqx

5
Як щодо перебування в VPN? Або робити дамп із машини, в яку ви SSHed, має доступ до машини бази даних? Порт не повинен бути загальнодоступним.
Ондрей Беркерт

3
Тут важливо пам’ятати, що -pце аргумент пароля, а не ім’я бази даних. Але зберігати його в простому тексті небезпечно, тому додавання -pозначає, що вам буде запропоновано ввести пароль при вході. Може бути , це тільки мені , але mysqlі , таким чином, mysqlсинтаксис звалище ніколи не було все , що прямо вперед, наскільки аргументи командного рядка.
anon58192932

0

Тут базується на цій сторінці:

Порівняйте дві бази даних MySQL

Я змінив його, щоб ви могли використовувати ddbb в різних хостах.

#! / бін / ш

ехо "Використання: dbdiff [user1: pass1 @ dbname1: host] [user2: pass2 @ dbname2: host] [ignore_table1: ignore_table2 ...]"

dump () {
  вгору = $ {1 %% @ *}; вниз = $ {1 ## * @}; user = $ {up %%: *}; pass = $ {up ## *:}; dbname = $ {down %%: *}; хост = $ {вниз ## *:};
  mysqldump --opt --compact --skip-Extended-insert -u $ user -p $ pass $ dbname -h $ host $ table> $ 2
}

rm -f /tmp/db.diff

# Порівняйте
вгору = $ {1 %% @ *}; вниз = $ {1 ## * @}; user = $ {up %%: *}; pass = $ {up ## *:}; dbname = $ {down %%: *}; хост = $ {вниз ## *:};
для таблиці в `mysql -u $ user -p $ pass $ dbname -h $ host -N -e" Показати таблиці "--batch`; робити
  if ["` echo $ 3 | grep $ table` "=" "]; тоді
    echo "Порівняння" $ table "..."
    дамп $ 1 /tmp/file1.sql
    дамп $ 2 /tmp/file2.sql
    diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff
  ще
    echo "Проігноровано" $ table "..."
  фі
зроблено
менше /tmp/db.diff
rm -f /tmp/file1.sql /tmp/file2.sql

0

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

1- Безпека за допомогою SSL

192.168.0.101 - віддалений сервер

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

Пам'ятати сервер

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 - локальний сервер

Пам'ятати сервер

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 / 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

Скопіюйте ці файли з віддаленого сервера для (ЗАПОВНІТЬ X509) або якщо SSL без (ЗАПИТАТИ X509) не копіюйте


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

/ usr / local / 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

мій.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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.