データベースのダンプを作成し、ファイル名の一部に現在の日付を含むファイルに保存するバッチ ファイルを作成しました。バッチ ファイルは見事に動作し、すべてのデータが正しく保存されます。
これを毎週実行するようにスケジュールされたタスクを設定しようとしましたが、問題が発生しました。タスクは実行されているものの、リモート データベースからデータを取得していないかのように、作成されるファイルは空です。かなり漠然としていますが、原因/解決策をどこから探し始めればよいか、誰か教えていただけますか?
** 編集 **
はい、さらに進展がありました。パスの問題のようです。バッチ ファイルに一時停止を入れましたが、タスク スケジューラで実行すると、「mysqldump は認識されたプログラムではありません」と表示されます。ただし、自分のユーザー アカウントでコマンド ラインから実行すると正常に動作します。念のため、テストに使用しているのと同じユーザー アカウントで実行するように設定しました。
** 編集 2 **
ある種の解決策を見つけました。mysqldump アプリケーションを絶対パスで参照する必要がありました。しかし、コマンド ラインから直接実行するとパスから mysqldump を見つけることができるのに、タスク スケジューラで自動化すると見つけられないのはなぜか、まだ理解できません。
答え1
ネットワークが利用できなかったのかもしれませんか? 5/10 分ごとに実行するようにスケジュールを設定して、コマンド/変数が正しく実行されるかどうかを確認してください。スクリプトは、一度に 1 つのコマンドではなく、全体として実行したときに正しく実行されることを確認していますか?
編集 2:PATH
環境変数に mysqldump が存在しないようです。それを追加して、もう一度試してください。
答え2
スケジュールされたタスクで mysqldump を詳細モードで実行してみましたか? (--verbose)
また、タスクを実行しているユーザーを確認し、そのユーザーが mysqldump を実行してターゲット ディレクトリにファイルを作成する権限を持っていることを確認してください。
答え3
絶対パスを指定することで問題が解決した場合、空のファイルを作成することはできません。代わりに、Windows スケジューラ ログで作成されたファイルにはジョブが成功したことが示されます。
パス変数に mysqldump.exe へのパス情報が含まれている場合、スクリプトはコマンド ラインで動作する可能性があります。コマンド ラインに「path」コマンドを指定して確認してください。
参考までに、mysql バックアップに使用したサンプル バッチ ファイルをここに示します。
@エコーオフ DB_USER_ID=[id]を設定します SET DB_USER_PASS=[パスワード] SET DATABASE=[データベース名] SET EXP_PATH=[バックアップパス] SET EXP_TMP_PATH=[一時パス] SET FILE_NAME=[バックアップファイル名] /f "tokens=1-3 delims=- " %%a in ('date /t') の場合、(set today=%%a-%%b-%%c) を実行します。 del /S /Q %EXP_PATH% md %EXP_PATH% md %EXP_TMP_PATH% C:\Bitnami\redmine-2.5.2-0\mysql\bin\mysqldump.exe -u%DB_USER_ID% -p%DB_USER_PASS% %DATABASE% > %EXP_TMP_PATH%\%FILE_NAME%_%today%.sql %EXP_TMP_PATH%\%FILE_NAME%_%today%.sql を %EXP_PATH%\%FILE_NAME%_%today%.sql に移動します