バックアップ用の一時的な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秒間開いたままになっている場合、明らかに、最初のダンプの1つがそれより長くかかる場合、他のダンプが完了する前に接続が閉じられます。スキーマバックアップごとに個別のファイルを保持したいので(--databases今のところmysqldumpを回避します)。

助言がありますか?

回答:


29

すべてのトンネリングに煩わ​​される必要はありません:-)。

mysqldumpにSSH接続を使用してデータをストリーミングさせるだけです。

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

1
問題を回避するための+1。これにはmysqldumpがリモートホストで使用可能である必要があります。リモートサーバーのプロセスリストにパスワードが表示されていると思いますが、それらが問題ではないと想定すると、はるかに優れたソリューションのように思えます。
マーク・

3
マークへの返信で、リモートサーバープロセスリストのパスワードについて「Mark Jul 6 '09 at 16:34」とコメントします(コメントを追加するのに十分な評判がありません)。ユーザーのホームに.my.cnfファイルを作成できます。リモートサーバ上のディレクトリとそこにパスワードを指定します:[クライアント]パスワード=「秘密」それからちょうど(データ転送スピードアップするために圧縮して、ここ)のmysqldumpを使用:$ ssh user@host "mysqldump foobar | gzip -9" | gzip -d > foobar.sql
トーマス・シュスター

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.