7

Я пытаюсь создать сценарий sync.sh который согласуется с нашим не совсем идеальным контролем версий для нашего веб-сайта. Этот скрипт перенесет живую копию базы данных в нашу среду разработки и еще пару вещей. У меня проблемы с частью миграции MySQL.

Этот скрипт запускается на компьютере разработчика. remote это живой хост.

# --------------
# database

# ssh tunnel
ssh -L 3307:remote:3306 user@remote

# mysql dump
mysqldump -u someuser -h remote -P 3307 -p"p4ssw0rd" db > localfile.sql

# somehow close ssh tunnel ???

# populate local db with sql dump file
mysql -ulocal db < localfile.sql

# -----------------
# other sync stuff
# ...

Когда я просто запускаю часть скрипта mysql, я получаю такой вывод:

Pseudo-terminal will not be allocated because stdin is not a terminal.
Enter password: 

У нас настроены ssh-ключи, и я могу правильно подключить ssh к пульту. Однако при запуске в контексте скрипта все идет не так. Я думаю, что я просто нуб. Я предполагаю, что если я просто изменю структуру моего подхода, у меня не должно быть проблем. Я просто не уверен, как это сделать ...

3 ответа3

7

Просто вытащите дамп одной командой:

ssh user @ host 'mysqldump -u -p databasename'> /path/to/local/file.sql

Вы также можете сжать их, если ваша база данных большая:

ssh user @ host 'mysqldump -u -p имя_базы данных | gzip '> /path/to/local/file.sql.gz

а затем распакуйте его после.

4

Команда ssh -L 3307:remote:3306 user@remote никогда не вернется, потому что она просто откроет оболочку и сохранит ее открытой.

SSH ведет себя следующим образом: он сохраняет соединение открытым до тех пор, пока либо выполняется команда, либо используется туннель. Итак, что вы хотите сделать, это ssh user@remote sleep 10 & . Это дает команде mysqldump достаточно времени для открытия соединения, но как только mysqldump закрывает это соединение, туннель не используется и SSH завершается.

Кстати, вам, возможно, придется использовать 3307:localhost:3306, если сервер не разрешает внешние подключения. (Это работает, потому что имя хоста разрешается на стороне сервера, а не на вашем клиенте)

0

Возможно, другой подход оправдан - два сценария. Скрипт A будет скриптом, который должен быть выполнен на удаленном хосте. Сценарий B будет управляющим сценарием, который 1) копирует Sctipt A на удаленный сервер, 2) SSH на удаленный сервер и выполняет скопированный сценарий, 3) копирует полученный файл дампа обратно и 4) загружает локальную базу данных

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .