以前、「MySQLとWebディレクトリのバックアップをとるシェルスクリプト」という記事でMySQLとWebディレクトリのバックアップをとるシェルスクリプトを紹介したが、これは全てのデータベース、Webディレクトリをそれぞれまるっと一つの圧縮ファイルにまとめるものだった。
複数のサイトを一つのサーバーで運営しているが、容量が増えるに連れ、単一ファイルに圧縮してしまうと特定のサイトだけリストアしたいときや、バックアップの一部を別ホストに移動したいときなどに不都合がでてくるようになった。
そこで、MySQLサーバーのデータベース一覧を取得して各データベースごとに圧縮、指定したディレクトリ以下のディレクトリ(もしくはファイル)ごとに圧縮するようにシェルスクリプトを改良してみた。
#!/bin/sh # 何日分保存するか period=3 # バックアップしたいディレクトリ wwwdir=/var/www # バックアップ保存先ディレクトリ dirpath=/home/backup # 今日のバックアップを保存するディレクトリ todaydir=`date '+%Y%m%d'` # DBユーザー dbuser=hoge # DBパスワード dbpassword=xxxxx # 今日のバックアップを保存するディレクトリを作成 mkdir $dirpath/$todaydir # MySQLバックアップ for i in `mysql -u$dbuser -p$dbpassword -e "show databases"` do if [ $i == "Database" ]; then continue fi; mysqldump $i -u$dbuser -p$dbpassword --opt | gzip > $dirpath/$todaydir/mysql.$i.sql.tar.gz done; # ディレクトリバックアップ for i in `ls $wwwdir` do tar cvfz $dirpath/$todaydir/www.$i.tar.gz $wwwdir/$i done chown -R all:all $dirpath/$todaydir olddir=`date -d "$period days ago" '+%Y%m%d'` rm -rf $dirpath/$olddir
実行すると、下記のようなファイルが生成される。あとはこれを別ファイルに転送するようにcronに設定すれば良い。その際は「さくらのレンタルサーバーで、WebディレクトリとMySQLを圧縮し、自動的に外部にバックアップする方法」を参考にされると良いかも…。
/home/backup ┗ /20130129/ ┣ mysql.site-a.sql.tar.gz ┣ www.site-a.tar.gz ┣ mysql.site-b.sql.tar.gz ┗ www.site-b.tar.gz