シェルスクリプトでMySQLの mysqldumpバックアップ

を cronに登録しましたが、ダンプに失敗しています。
OS:FreeBSD 8.3

シェルスクリプトの場所
/usr/home/www/scripts/bk_mysql.sh
所有者:権限
-rwxr-xr-- 1 user1 wheel 398 Jun 10 19:45 bk_mysql.sh

内容
#!/bin/sh

BACK_DIR=/usr/home/www/www.example.com/backup
MYSQL_ROOT_PW=aaaaaaa

# mysqldump
cd $BACK_DIR
mysqldump -u root --password=$MYSQL_ROOT_PW --all-databases > mysql_`date +%y%m%d%H%M`.sql

cron は1分毎にテスト実行しています
*/1 * * * * root /usr/home/www/scripts/bk_mysql.sh
しかし、ダンプファイルが作られません。

なお、同スクリプト内で、以下のアーカイブのパターンではアーカイブ生成に成功していますので、パーミッションなどには問題ないのかな?
DATA_DIR=/var/db

cd $DATA_DIR
tar cvzf $BACK_DIR/mysql_`date +%y%m%d-%H%M` mysql
と思っています。

mysqldump 特有の問題なのでしょうか?
ご教示お願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/06/14 07:47:30
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:haruo-31 No.2

回答回数80ベストアンサー獲得回数10

ポイント50pt

$ which mysqldump
と入力して、表示されるパス (/sbin/mysqldump) といったパスで、
mysqldumpコマンドを置換すると良いと思いますよ。

*/1 * * * * root /usr/home/www/scripts/bk_mysql.sh
/etc/crontab に直書きしてるんでしょうか。
とりあえずrootがコマンドラインとして認識されている可能性を考えて、
shに置換してみてはいかがでしょう。

余談ですがrootでコマンドを実行するのは、あまりよくありません。
上記例では、mysqldumpによってディスクが本当にfullになってダウンするとか、
そういうことも起り得ます。 一般ユーザなら、95%で止めてくれたりします。(そういう設定がされている前提ですが)

他2件のコメントを見る
id:a-kuma3

# 質問者さん向け

実行される親プロセスが違うことによるのですが、説明が長くなるので割愛します。

ログインシェルによりますけど、例えば bash だと、ログインプロンプトが出る前に、.bash_profile とか .bashrc が読み込まれて実行されます。
PATH などの環境変数の設定は、ここでやっているはず。
ログインプロンプトから実行されるシェルスクリプトは、ログインシェルの子プロセスとして起動されます。
スクリプトを動かすシェルは、親のログインシェル (例えば、bash) の環境変数を引き継ぎます。

cron の場合には、これが働かない (/usr/bin/cron の子プロセスとして実行されるだけ) ので、プロンプトで動いてたスクリプトが cron で動かないのは何故、みたいなことになります。

2013/06/12 13:31:16
id:gdwtseq

そうだったのかー!

すみません。何度もご回答いただき、理解できました。

ありがとうございました。

2013/06/14 07:47:08

その他の回答1件)

id:dawakaki No.1

回答回数797ベストアンサー獲得回数122

ポイント50pt

mysqldumpにパスは通っていますか?
確認して下さい。

それから、mysqldumpは重たい処理なので、cronで1分おきというのは現実的ではありません。1時間おきにしてみて下さい。

id:gdwtseq

アドバイスありがとうございます。
rootユーザーで、
# which mysqldump
とやると、
/usr/local/bin/mysqldump
と返ってくるので、パスは通っているという理解でしたが、
違うのでしょうか?

2013/06/11 10:02:17
id:dawakaki

cronはrootユーザーで実行されるわけではないので、mysqldumpをフルパスで記述してください。

2013/06/11 20:06:37
id:haruo-31 No.2

回答回数80ベストアンサー獲得回数10ここでベストアンサー

ポイント50pt

$ which mysqldump
と入力して、表示されるパス (/sbin/mysqldump) といったパスで、
mysqldumpコマンドを置換すると良いと思いますよ。

*/1 * * * * root /usr/home/www/scripts/bk_mysql.sh
/etc/crontab に直書きしてるんでしょうか。
とりあえずrootがコマンドラインとして認識されている可能性を考えて、
shに置換してみてはいかがでしょう。

余談ですがrootでコマンドを実行するのは、あまりよくありません。
上記例では、mysqldumpによってディスクが本当にfullになってダウンするとか、
そういうことも起り得ます。 一般ユーザなら、95%で止めてくれたりします。(そういう設定がされている前提ですが)

他2件のコメントを見る
id:a-kuma3

# 質問者さん向け

実行される親プロセスが違うことによるのですが、説明が長くなるので割愛します。

ログインシェルによりますけど、例えば bash だと、ログインプロンプトが出る前に、.bash_profile とか .bashrc が読み込まれて実行されます。
PATH などの環境変数の設定は、ここでやっているはず。
ログインプロンプトから実行されるシェルスクリプトは、ログインシェルの子プロセスとして起動されます。
スクリプトを動かすシェルは、親のログインシェル (例えば、bash) の環境変数を引き継ぎます。

cron の場合には、これが働かない (/usr/bin/cron の子プロセスとして実行されるだけ) ので、プロンプトで動いてたスクリプトが cron で動かないのは何故、みたいなことになります。

2013/06/12 13:31:16
id:gdwtseq

そうだったのかー!

すみません。何度もご回答いただき、理解できました。

ありがとうございました。

2013/06/14 07:47:08

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません