web-dev-qa-db-ja.com

セッションがタイムアウトになった後もMySQLDumpをバックグラウンドで実行し続けるように設定する

別のスレーブDBをコピーして、新しいスレーブDBをセットアップしようとしています。通常、私は単にMySQLDumpを使用してスレーブをダンプし、.sqlファイルを作成してから、それを新しいデータベースにインポートします。

しかし、私たちの新しいサーバーはLinux(Debian 7)サーバー(コピーしているスレーブはWindowsサーバー上にある)なので、新しいデータベースに直接ダンプをパイプしようとするだろうと考えました。私のPuTTYセッションが期限切れになり、すべてが停止するまで、これはうまくいったようです。

今回はNohup .... &を使用してもう一度試しました。しかし、セッションが期限切れになるとすぐにダンプは停止しました。

これを機能させる方法はありますか?私の完全なダンプコマンドは:

Nohup mysqldump -hxxx -P3306 -uxxx -pxxx --dump-slave --databases a b c d --ignore-table=a.xxx -F | mysql -h127.0.0.1 -P3306 -uxxx -pxxx &

すべてのDBはMySQL 5.5です。

7
IGGt

問題を見つけたと思います。どうやらNohupコマンドは|シンボルで終了したため、セッションが期限切れになると、コマンドの2番目の部分がセッションで停止しました。

これを回避するために私は走った:

Nohup sh -c 'mysqldump -hxxx -P3306 -uxxx -pxxx --dump-slave --databases a b c d --ignore-table=a.xxx -F | mysql -h127.0.0.1 -P3306 -uxxx -pxxx' &

動作していることを確認し、シェルをEXITedしたところ、今のところまだ動作しています。

3
IGGt

これに対するもう1つのジャジーなアプローチは、アンパサンドなしでそのコマンドをシェルスクリプトに配置することです。次に、スクリプトを名前でバックグラウンドで実行します。たとえば、transfer_mysql_data.shフォルダ内のシェルスクリプト/path/to/scriptを呼び出します。

これがこの提案されたスクリプトの内容です

SCRIPT_TO_RUN=/path/to/script/transfer_mysql_data.sh
RUNLOG=/path/to/script/transfer_mysql_data.log
date > ${RUNLOG}
mysqldump -hxxx -P3306 -uxxx -pxxx --dump-slave --databases a b c d --ignore-table=a.xxx -F | mysql -h127.0.0.1 -P3306 -uxxx -pxxx
date >> ${RUNLOG}
chmod -x ${SCRIPT_TO_RUN}

以下を実行します

cd /path/to/script
chmod +x transfer_mysql_data.sh
Nohup ./transfer_mysql_data.sh &

すぐにログアウトして後で戻ることができます。

次に、実行ログファイル/path/to/script/transfer_mysql_data.logをポーリングして、mysqldump転送がいつ終了したかを確認できます。開始日時と終了日時の2行があると終了します。

3
RolandoMySQLDBA