各ディレクトリごと、各データベースごとにバックアップをとるシェルスクリプト

バックアップ

以前、「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
  • ブックマーク
  • Feedly

この記事を書いた人

キタジマタカシ

長崎在住、フリーランスのWordPress テーマ / プラグインデベロッパー。 多数のプロダクトをオープンソースで開発・公開しています。現在は WordPress 有料テーマ Snow Monkey を開発・販売しています。