リモートサーバー上のいくつかの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
of mysqldump for now)。
助言がありますか?
すべてのトンネリングに煩わされる必要はありません:-)。
MysqldumpにSSH接続を使用してデータをストリーミングさせるだけです。
ssh usr@Host mysqldump -u dbuser -ppasswd my-database-name >dumpfile
-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でテストしました-別のシェルに変更する必要があるかもしれません)
Sleskeの提案のわずかなバリエーションとして、mysqldump出力をgzipにパイプして転送前に圧縮できます。
ssh SSH-USER@SERVER mysqldump -u DB-USER -pDB-PASSWORD DB-NAME | gzip -c > DB-NAME.sql.gz
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
エボラ!
これは私がそれを書く方法です、
scp backup-db.sh [email protected]:/root/backups/
ssh [email protected] 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
ededできます。
はい、パイプもトンネルもしていません。