Terowongan SSH Sementara untuk keperluan pencadangan

11

Saya ingin menulis skrip shell (saat ini menggunakan bash) untuk secara otomatis membuat cadangan konten beberapa skema MySQL di server jauh. Server jarak jauh dikunci untuk hanya mengizinkan akses SSH jadi saya harus membuat terowongan SSH sebelum berjalan mysqldumpmelawan berbagai skema.

Saya dapat membuat terowongan tanpa masalah, namun saya ingin dapat menutupnya secara otomatis setelah dump database selesai.

Saat ini skrip saya sedang melakukan ini:

/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

Jika koneksi tetap terbuka selama 600 detik, namun jelas jika salah satu dump pertama membutuhkan waktu lebih lama dari itu maka koneksi ditutup sebelum dump lainnya selesai. Saya ingin menyimpan file terpisah untuk setiap skema cadangan (jadi akan menghindari --databasesmysqldump untuk saat ini).

Ada saran?

BenM
sumber

Jawaban:

29

Anda tidak perlu repot dengan semua tunneling itu :-).

Biarkan mysqldump mengalirkan datanya menggunakan koneksi SSH:

ssh usr@host mysqldump -u dbuser -ppasswd my-database-name >dumpfile
sleske
sumber
1
+1 untuk menghindari masalah. Ini memang mengharuskan mysqldump tersedia di host jarak jauh, dan saya percaya menunjukkan kata sandi pada daftar proses server jarak jauh, tetapi dengan asumsi hal-hal itu bukan masalah, itu terdengar seperti solusi yang jauh lebih baik.
Markus
3
Sebagai balasan untuk menandai komentar "Tandai 6 Juli 2009 di 16:34" tentang kata sandi dalam daftar proses server jarak jauh (Saya tidak memiliki cukup reputasi untuk menambahkan komentar): Anda dapat membuat file .my.cnf di rumah pengguna direktori pada server jarak jauh dan tentukan kata sandi di sana: [klien] kata sandi = "rahasia" Kemudian gunakan mysqldump (di sini dengan kompresi untuk mempercepat transfer data):$ ssh user@host "mysqldump foobar | gzip -9" | gzip -d > foobar.sql
Thomas Schuster
5

Tambahkan opsi -N, opsi -f dan sleep 600, ini akan membuka terowongan tanpa menjalankannya di latar belakang. Kemudian Anda dapat menjalankan perintah dengan &, dapatkan PID, lalu matikan proses ssh setelah pekerjaan selesai.

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

(Saya sudah menguji ini dengan bash - Anda mungkin perlu mengubah sesuatu untuk shell yang berbeda)

Menandai
sumber
4

Sedikit variasi pada saran sleske, Anda dapat menyalurkan output mysqldump melalui gzip ke kompres sebelum transfer:

ssh SSH-USER@SERVER mysqldump -u DB-USER -pDB-PASSWORD DB-NAME | gzip -c > DB-NAME.sql.gz
Eethann
sumber
Saya menduga bahwa perintah ini tidak memampatkan SETELAH transfer, Anda mungkin perlu mengutip bit "mysql ... | gzip" agar pipa dievaluasi dari jarak jauh
The Mighty Chris
3

Seperti kata sleske, mengapa repot dalam kasus khusus ini? Namun ada solusi untuk mengontrol terowongan ssh dalam kasus umum: gunakan pipa bernama. Pertama buat pipa seperti ini:

ssh -l remoteuser 208.77.188.166 mkfifo /tmp/PIPO

Kemudian Anda menulis (memblokir ke pipa) di ssh Anda untuk membuat terowongan:

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

Saat Anda ingin menutup terowongan, baca saja pipa:

ssh -l remoteuser 208.77.188.166 cat /tmp/PIPO

Dan lagi!

wazoox
sumber
2

Ini adalah bagaimana saya akan menulisnya,

scp backup-db.sh [email protected]:/root/backups/
ssh [email protected] exec /root/backups/backup-db.sh

Di mana skrip berada,

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

Akhirnya, arsip dapat scpdiedit kembali dengan perintah lain.
Ya, saya tidak pipa atau terowongan.

nik
sumber