サーバーにあるMySQLデータベースをバックアップするCronjobを設定していますが、同じファイルを何度も上書きし続けたくありません。代わりに、自動的に実行される一連のバックアップから選択する必要があります。例えば:
## Cronjob, run May 21st, 2011:
mysqldump -u username -ppasword database > /path/to/file/21-03-2011.sql
## SAME Conjob, run May 28th, 2011:
mysqldump -u username -ppasword database > /path/to/file/28-03-2011.sql
等々。
私のCronjobでシステムの日付や時刻をある種の変数として使用する方法はありますか?そうでない場合、同じことを達成するための提案は何ですか?
あなたはこのようなものを試すことができます(以下のグレン・ジャックマンが注記するように、すべての%
文字をエスケープする必要があります):
15 11 * * * touch "/tmp/$(date +\%d-\%m-\%Y).sql"
特定のcronがcrontabからコマンドをスクリプトとして実行するかどうか、または日付を文字列として計算するスクリプトを作成してmysqldumpコマンドを実行する必要があるかどうかを確認します。
%
をエスケープせずに、Redhat Enterprise Linux 5.0(と思います)の「cron」で、一致する)
が見つからないというエラーが表示され続けました。これは、エスケープされていない%
の後のすべてがコマンドの標準入力に送信されるためです。
また、ISO8601の日付形式(yyyy-mm-dd、つまり%F
)を使用して、ファイル名を語彙的に並べ替えたときに日付順に並べることをお勧めします。
date
を使用できるはずです。
タイプinfo date
またはman date
詳細については。
次のようなものが適している場合があります(必要に応じて日付形式を変更してください)。
yourcommand > filepathandnameprefix$(date +"\%d-\%m-\%Y").extension
このようなコマンドを適切に実行するには、エスケープ%する必要があります。その後、期待どおりに実行されます。
参照: http://www.ducea.com/2008/11/12/using-the-character-in-crontab-entries/
これが私が使ったbashスクリプトです:
#!/bin/bash
mysqldump -u user1 -p DatabaseName | gzip > BackupFolder/backup`date +%F_%T`.sql.gz
ファイルは次のようになります。
backup2011-03-02_15:16:46.sql.gz
これをcronジョブに向けて、毎晩実行したり、好きなように実行したりします。
date
コマンドを使用してバックアップコマンドを呼び出す小さなラッパースクリプトを記述します。
#!/bin/bash
NOW=`/bin/date +"%m%d%Y-%H%M%S"`
if [[ "$?" != "0" ]]; then
NOW="UNKNOWN_DATE"
fi
mysqldump -u username -ppassword database > /path/to/file/$NOW.sql
if [[ "$?" != "0" ]]; then
echo "$0: backup failed with error code $?"
fi