Временный туннель SSH для резервного копирования

11

Я хотел бы написать скрипт оболочки (в настоящее время использующий bash) для автоматического резервного копирования содержимого нескольких схем MySQL на удаленном сервере. Удаленный сервер заблокирован, чтобы разрешить только SSH-доступ, поэтому мне нужно создать SSH-туннель, прежде чем запускать mysqldumpразличные схемы.

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

В настоящее время мой скрипт делает это:

/usr/bin/ssh -T -f -L 4444:127.0.0.1:3306 -l remoteuser 208.77.188.166 sleep 600

/usr/bin/mysqldump --compress -h 127.0.0.1 -P 4444 -u user -ppassword db1 | gzip > /root/backups/snapshot/db1.sql.gz

/usr/bin/mysqldump --compress -h 127.0.0.1 -P 4444 -u user -ppassword db2 | gzip > /root/backups/snapshot/db2.sql.gz

/usr/bin/mysqldump --compress -h 127.0.0.1 -P 4444 -u user -ppassword db3 | gzip > /root/backups/snapshot/db3.sql.gz

Если соединение остается открытым в течение 600 секунд, очевидно, однако, если один из первых дампов занимает больше времени, то соединение закрывается до завершения других дампов. Я хотел бы сохранить отдельные файлы для каждой резервной копии схемы (поэтому пока не буду использовать --databasesmysqldump).

Какие-либо предложения?

BenM
источник

Ответы:

29

Вам не нужно беспокоиться обо всем этом туннелировании :-).

Просто позвольте mysqldump передавать данные через SSH-соединение:

ssh usr@host mysqldump -u dbuser -ppasswd my-database-name >dumpfile
sleske
источник
1
+1 за обход вопроса. Для этого необходимо, чтобы mysqldump был доступен на удаленном хосте, и я считаю, что пароль отображается в списке процессов удаленного сервера, но при условии, что это не проблема, это звучит как гораздо лучшее решение.
Марк
3
В ответ на комментарий к отметке «Отметить 6 июля 2009 г. в 16:34» о пароле в списке процессов удаленного сервера (у меня недостаточно репутации, чтобы добавить комментарий): Вы можете создать файл .my.cnf в домашней странице пользователей. каталог на удаленном сервере и укажите там пароль: [client] password = "secret" Затем просто используйте mysqldump (здесь со сжатием для ускорения передачи данных):$ ssh user@host "mysqldump foobar | gzip -9" | gzip -d > foobar.sql
Thomas Schuster
5

Добавьте опцию -N, опцию -f и спящий режим 600, это откроет туннель, не запуская его в фоновом режиме. Затем вы можете запустить команду с помощью &, получить PID, а затем завершить процесс ssh после завершения задания.

/usr/bin/ssh -T -L 4444:127.0.0.1:3306 -l remoteuser 208.77.188.166 &
PID=$!
do_stuff
kill $PID

(Я проверял это с помощью bash - возможно, вам придется изменить что-то для другой оболочки)

отметка
источник
4

Небольшое изменение в предложении sleske, вы можете передать вывод mysqldump через gzip для сжатия перед передачей:

ssh SSH-USER@SERVER mysqldump -u DB-USER -pDB-PASSWORD DB-NAME | gzip -c > DB-NAME.sql.gz
eethann
источник
Я подозреваю, что эта команда не сжимается до ПОСЛЕ передачи, вам может потребоваться процитировать бит «mysql ... | gzip», чтобы канал был оценен удаленно
The Mighty Chris
3

Как сказал Слеске, зачем беспокоиться в данном конкретном случае? Однако в общем случае есть решение для управления ssh-туннелем: используйте именованный канал. Сначала создайте трубу так:

ssh -l remoteuser 208.77.188.166 mkfifo /tmp/PIPO

Затем вы пишете (блокируя канал) в своем SSH для создания туннеля:

/usr/bin/ssh -T -f -L 4444:127.0.0.1:3306 -l remoteuser 208.77.188.166 "echo T > /tmp/PIPO"

Если вы хотите закрыть туннель, просто прочитайте канал:

ssh -l remoteuser 208.77.188.166 cat /tmp/PIPO

И вуаля!

wazoox
источник
2

Вот как бы я это написал,

scp backup-db.sh remoteuser@208.77.188.166:/root/backups/
ssh remoteuser@208.77.188.166 exec /root/backups/backup-db.sh

Где сценарий,

#!/bin/sh
# backup-db.sh
DUMPARGS=--compress -h 127.0.0.1 -P 4444 -u user -ppassword
BACKUP_PATH=/root/backups/snapshot

/usr/bin/mysqldump $DUMPARGS db1 | bzip2 > $BACKUP_PATH/db1.sql.bz2
/usr/bin/mysqldump $DUMPARGS db2 | bzip2 > $BACKUP_PATH/db2.sql.bz2
/usr/bin/mysqldump $DUMPARGS db3 | bzip2 > $BACKUP_PATH/db3.sql.bz2

Наконец, архив может быть scpвозвращен другой командой.
Да я не труба или туннель.

Nik
источник