백업을위한 임시 SSH 터널


11

원격 서버에서 여러 MySQL 스키마의 내용을 자동으로 백업하기 위해 셸 스크립트 (현재 bash를 사용)를 작성하고 싶습니다. 원격 서버는 SSH 액세스 만 허용하도록 잠겨 있으므로 mysqldump다양한 스키마에 대해 실행하기 전에 SSH 터널을 만들어야 합니다.

문제없이 터널을 만들 수 있지만 데이터베이스 덤프가 완료된 후 자동으로 터널을 닫을 수 있기를 원합니다.

현재 내 스크립트는 이것을하고 있습니다 :

/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

당신은 모든 터널링을 귀찮게 할 필요가 없습니다 :-).

SSH 연결을 사용하여 mysqldump가 데이터를 스트리밍하도록하십시오.

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

1
문제를 회피하기 위해 +1 이것은 원격 호스트에서 mysqldump를 사용할 수 있어야하며 원격 서버 프로세스 목록에 암호를 표시한다고 생각하지만 문제가 없다고 가정하면 훨씬 더 나은 솔루션처럼 들립니다.
Mark

3
원격 서버 프로세스 목록의 암호에 대한 "Mark Jul 6 '09 at 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

전송 후이 명령이 압축되지 않을 것으로 의심됩니다. 파이프가 원격으로 평가되도록 "mysql ... | gzip"비트를 인용해야 할 수도 있습니다.
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

vo!


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.