Đường hầm SSH tạm thời cho mục đích sao lưu


11

Tôi muốn viết một tập lệnh shell (hiện đang sử dụng bash) để tự động sao lưu nội dung của một số lược đồ MySQL trên máy chủ từ xa. Máy chủ từ xa bị khóa để chỉ cho phép truy cập SSH, vì vậy tôi phải tạo một đường hầm SSH trước khi chạy mysqldumpvới các lược đồ khác nhau.

Tôi có thể tạo một đường hầm mà không gặp vấn đề gì, tuy nhiên tôi muốn có thể tự động đóng nó sau khi kết xuất cơ sở dữ liệu hoàn tất.

Hiện tại kịch bản của tôi đang làm điều này:

/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

Trong trường hợp kết nối được giữ mở trong 600 giây, tuy nhiên rõ ràng nếu một trong những lần đầu tiên mất nhiều thời gian hơn thì kết nối sẽ bị đóng trước khi các bãi khác hoàn thành. Tôi muốn giữ lại các tệp riêng biệt cho mỗi bản sao lưu lược đồ (vì vậy sẽ tránh được --databasesmysqldump ngay bây giờ).

Bất kỳ đề xuất?

Câu trả lời:


29

Bạn không cần bận tâm với tất cả các đường hầm đó :-).

Chỉ cần để mysqldump truyền dữ liệu của nó bằng kết nối SSH:

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

1
+1 để vượt qua vấn đề. Điều này không yêu cầu mysqldump có sẵn trên máy chủ từ xa và tôi tin rằng hiển thị mật khẩu trong danh sách quy trình máy chủ từ xa, nhưng giả sử những điều đó không phải là vấn đề, nghe có vẻ là một giải pháp tốt hơn nhiều.
Đánh dấu

3
Trả lời đánh dấu nhận xét "Đánh dấu ngày 6 tháng 7 lúc 10:34" về mật khẩu trong danh sách quy trình máy chủ từ xa (Tôi không đủ danh tiếng để thêm nhận xét): Bạn có thể tạo tệp .my.cnf trong nhà của người dùng thư mục trên máy chủ từ xa và chỉ định mật khẩu tại đó: [client] password = "secret" Sau đó, chỉ cần sử dụng mysqldump (ở đây có nén để tăng tốc độ truyền dữ liệu):$ ssh user@host "mysqldump foobar | gzip -9" | gzip -d > foobar.sql
Thomas Schuster

5

Thêm tùy chọn -N, tùy chọn -f và ngủ 600, điều này sẽ mở đường hầm mà không chạy nó trong nền. Sau đó, bạn có thể chạy lệnh với &, lấy PID, sau đó hủy tiến trình ssh sau khi các công việc đã hoàn thành.

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

(Tôi đã thử nghiệm điều này với bash - bạn có thể cần thay đổi mọi thứ cho một lớp vỏ khác)


4

Một thay đổi nhỏ về đề xuất của sleske, bạn có thể chuyển đầu ra mysqldump qua gzip để nén trước khi chuyển:

ssh SSH-USER@SERVER mysqldump -u DB-USER -pDB-PASSWORD DB-NAME | gzip -c > DB-NAME.sql.gz

Tôi nghi ngờ rằng lệnh này không nén cho đến khi SAU khi chuyển, bạn có thể cần trích dẫn bit "mysql ... | gzip" để đường ống được đánh giá từ xa
Mighty Chris

3

Như sleske đã nói, tại sao phải bận tâm trong trường hợp cụ thể này? Tuy nhiên, có một giải pháp để kiểm soát đường hầm ssh trong trường hợp chung: sử dụng đường ống có tên. Đầu tiên tạo đường ống như thế này:

ssh -l remoteuser 208.77.188.166 mkfifo /tmp/PIPO

Sau đó, bạn viết (chặn vào đường ống) trong ssh của bạn để tạo đường hầm:

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

Khi bạn muốn đóng đường hầm, chỉ cần đọc đường ống:

ssh -l remoteuser 208.77.188.166 cat /tmp/PIPO

Et voilà!


2

Đây là cách tôi sẽ viết nó,

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

Kịch bản ở đâu

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

Cuối cùng, kho lưu trữ có thể được chỉnh sửa scplại bằng một lệnh khác.
Vâng, tôi đã không đường ống hoặc đường hầm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.