何故か毎回書いてしまうBackupシェル

すごく簡単なバックアップシェルです。DBとファイルを保存して、別筐体にもコピーします。コピーはrsyncの方が速いのでscpとか使うのやめました。
あと30日前のものはバックアップのタイミングで削除されます。cronで実行する前提で作っているので基本フルパスになっています。手動でも動きますよ。
ちなみにログとかそういう機能はありません。

#!/usr/bin/bash

#-----------
# backup.sh
#-----------
# file record time
record_time=`date "+%Y%m%d_%H%M"`

# file backup setting
backupdir="/home/user/backup"               # backup file store directory
backup_target_directory1="/home/user/www"       # target backup

# database
db_user="user"
db_host="localhost"
db_passwd="PASSWORD"
db_name="user_db"

# exec....
tar -pczf filebackup-$record_time.tar.gz $backup_target_directory1
mv filebackup-$record_time.tar.gz $backupdir/
echo "file back up ok.: filebackup-$record_time.tar.gz";

# mysqldump
mysqldump -u $db_user -h $db_host -p$db_passwd $db_name > $backupdir/database_$record_time.sql
echo "database back up ok.: database_$record_time.sql";

# rotate (delete 30 days ago files)
rm -f $backupdir/*`date -d '30 days ago' "+%Y%m%d"`*   # backup rotate 30days
echo "delete file with 30days ago...";

# transration
# ssh -i /home/usertest/.ssh/user_rsa_backup user@example.com
# rsync -avz --delete -e "ssh -i /home/usertest/.ssh/user_rsa_backup" /home/usertest/backup/ user@example.com:/home/user/backup

rsync -avz --delete -e "ssh -i /home/user/.ssh/user_rsa_backup" /home/user/backup/ user@example.com:/home/user/backup
echo "rsync OK!";

ローテートに関連するコマンドいろいろ

xxxxxx_20180927.zipみたいな感じで「YYYYMMDD(%Y%m%d)」の文字列が入っているファイルがあったら削除します。以下は30日前のファイルを削除しています。
ファイルの実際の更新日は見てなくてファイル名を見ています。なので、ファイルを作成するときに「YYYYMMDD(%Y%m%d)」のフォーマットでファイル名が生成されるように作成します。

rm -f /backupdir/*`date -d '30 days ago' "+%Y%m%d"`*

実際のファイルの更新日でマッチさせるなら

find /backupdir/ -name '*tar.gz' -mtime +1

とかやると昨日より以前のファイルを検索できる。ちょっと直感的に分かりづらいのですが、以下のような形式になってます。プラスとマイナスの記号が全然直感的じゃなくて嫌いです。

-mtime -n       n*24時間前よりも後で更新されたファイル   
-mtime n        n*24時間前から、さらに過去24時間以内に更新されたファイル
-mtime +n       (n+1)*24時間前よりも、以前に更新されたファイル

で削除するとなると、

find /backupdir/ -name '*tar.gz' -mtime +1 -exec rm -f {} \;

という感じになる。
おまけで、開発中に使うタイムスタンプを改ざんしたファイル作成のコマンド

touch -d "2018/9/19 11:19:00" test_20180919.txt;
touch -d "2018/9/20 11:20:00" test_20180920.txt;
touch -d "2018/9/21 11:21:00" test_20180921.txt;
touch -d "2018/9/22 11:22:00" test_20180922.txt;
touch -d "2018/9/23 11:23:00" test_20180923.txt;
touch -d "2018/9/24 11:24:00" test_20180924.txt;
touch -d "2018/9/25 11:25:00" test_20180925.txt;
touch -d "2018/9/26 11:25:00" test_20180926.txt;
touch -d "2018/9/27 11:25:00" test_20180927.txt;
touch -d "2018/9/28 11:25:00" test_20180928.txt;
touch -d "2018/9/29 11:25:00" test_20180929.txt;
touch -d "2018/9/30 11:25:00" test_20180930.txt;

こういう感じでいろいろ作って開発する。


find -mtime に指定する値の考え方

Last update: 2018.09.28 (金)