SSH Tunnel ชั่วคราวเพื่อการสำรองข้อมูล


11

ฉันต้องการเขียนเชลล์สคริปต์ (ปัจจุบันใช้ bash) เพื่อสำรองเนื้อหาของ MySQL schemas หลายตัวบนเซิร์ฟเวอร์ระยะไกลโดยอัตโนมัติ รีโมตเซิร์ฟเวอร์ถูกล็อคลงเพื่ออนุญาตการเข้าถึง 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 วินาทีอย่างไรก็ตามหากการทิ้งครั้งแรกใช้เวลานานกว่านั้นการเชื่อมต่อจะถูกปิดก่อนที่การถ่ายโอนข้อมูลอื่นจะเสร็จสมบูรณ์ ฉันต้องการเก็บไฟล์แยกต่างหากสำหรับการสำรอง schema แต่ละรายการ (ดังนั้นจะหลีกเลี่ยงการ--databasesmysqldump ในตอนนี้)

ข้อเสนอแนะใด ๆ

คำตอบ:


29

คุณไม่จำเป็นต้องกังวลกับ :-) อุโมงค์ทั้งหมด

เพียงให้ mysqldump สตรีมข้อมูลโดยใช้การเชื่อมต่อ SSH:

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

1
+1 สำหรับการเลี่ยงปัญหา สิ่งนี้ต้องการให้ mysqldump พร้อมใช้งานในรีโมตโฮสต์และฉันเชื่อว่าจะแสดงรหัสผ่านในรายการกระบวนการเซิร์ฟเวอร์ระยะไกล แต่สมมติว่าสิ่งเหล่านั้นไม่ใช่ปัญหา
Mark

3
ในการตอบกลับถึงเครื่องหมายความคิดเห็น "Mark Jul 6 '09 เวลา 16:34" เกี่ยวกับรหัสผ่านในรายการกระบวนการเซิร์ฟเวอร์ระยะไกล (ฉันมีชื่อเสียงไม่เพียงพอที่จะเพิ่มความคิดเห็น): คุณสามารถสร้างไฟล์. my.cnf ในหน้าแรกของผู้ใช้ ไดเรกทอรีบนเซิร์ฟเวอร์ระยะไกลและระบุรหัสผ่านที่นั่น: [ลูกค้า] รหัสผ่าน = "ความลับ" จากนั้นเพียงใช้ mysqldump (ที่นี่ด้วยการบีบอัดเพื่อเพิ่มความเร็วในการถ่ายโอนข้อมูล):$ ssh user@host "mysqldump foobar | gzip -9" | gzip -d > foobar.sql
Thomas Schuster

5

เพิ่มตัวเลือก -N ตัวเลือก -f และ sleep 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 Mighty 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

และอื่น ๆ !


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ด้วยคำสั่งอื่น
ใช่ฉันไม่ได้ท่อหรืออุโมงค์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.