Тимчасовий тунель 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).

Будь-які пропозиції?

Відповіді:


29

Вам не потрібно турбуватися з усім цим тунелюванням :-).

Просто дозвольте mysqldump передавати свої дані за допомогою SSH-з'єднання:

ssh usr@host mysqldump -u dbuser -ppasswd my-database-name >dumpfile

1
+1 для усунення проблеми. Для цього потрібно, щоб mysqldump був доступний на віддаленому хості, і я вважаю, що він показує пароль у списку процесів віддаленого сервера, але якщо припустити, що це не є проблемою, це звучить як набагато краще рішення.
Марк

3
У відповідь на коментар відзначає "Позначити 6 липня '09 о 16:34" про пароль у списку процесів віддаленого сервера (у мене недостатньо репутації, щоб додати коментар): Ви можете створити .my.cnf файл у домашньому користувачі каталог на віддаленому сервері та вкажіть пароль там: [client] password = "секрет" Тоді просто використовуйте 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

Я підозрюю, що ця команда не стискається, поки ПІСЛЯ передачі вам може знадобитися цитувати біт "mysql ... | gzip", щоб труба віддалено оцінювалася
The Moighty Chris

3

Як сказав Sleske, навіщо турбуватися саме в цьому випадку? Однак у загальному випадку є рішення управління тунелем 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

Et voilà!


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повернути за допомогою іншої команди.
Так, я не трубив і не тунелював.

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