自宅サーバーのWordPressをCronで分散バックアップ

2015/03/30[公開]

 自宅のWordPress用WEBサーバーの自動バックアップを設定した備忘録です。ウチのDebian GNU/Linux Wheezy7.8の自宅PCサーバーの場合は何が一番怖いかというと、やはりマシンの故障でしょう。いつHDD(SSD)が壊れても不思議ではありません。それに備えたバックアップですが、バックアップデータも自宅保存だと自宅丸ごと消滅するような災害の場合、全データロストという可能性があります。そのため無料クラウドストレージを利用して危機分散します。Dropboxの設定と、BoxとDriveeの設定は出来ていて共有ディレクトリがマウント済みの前提です。

 もしWordPressのデータ全消滅なんてことになったら、心折れて一から全部やり直しする気力は無いでしょう。そんなことにならないためのバックアップ内容です。一般的なレンタルサーバーのデータバックアップとは少し趣向が違います。また複雑なスクリプトとか組めないなりに考えた方法ですのであしからず。

このページの目次

スポンサー リンク

基本方針

 全データロストを防ぐのが最優先です。バックアップは毎日深夜3時15分にCronで実行させます。

  1. 月、金曜日にクラウドストレージのBoxにバックアップ
  2. 火、木、土曜日にローカルのUSBメモリにバックアップ
  3. 水曜日にクラウドストレージのDriveeにバックアップ
  4. 日曜日にクラウドストレージのDropboxにバックアップ

 無料で利用できる容量を考えて、Boxに2世代、DriveeとDropboxにそれぞれ1世代、ローカルのUSBメモリに3世代バックアップを取ります。

zipコマンドでバックアップ

 バックアップといえばtar | gzip で保存するのが一般的かもしれませんが、クラウドストレージを利用するので、バックアップファイルにパスワードをかけたい、さらにBoxの無料アカウントでは一ファイルの250MB制限があるのを回避するために分割保存したい、それを簡単に利用するためにzipコマンドで圧縮します。Debianでは標準リポジトリからinfo-zipをインストールしておきましょう。

# aptitude install zip

MySQLのバックアップコマンド

 mysqldumpコマンドを使って、全データベースのDumpファイルをzipで圧縮してパスワードをかけます。

mysqldump -u root -x --password=[mysqlpassword] --all-databases --events | zip -P [zippassword] /[dir]/mysqldump.zip -
  •  mysqldumpでダンプ
  •  -u root でrootで実行
  •  -x でダンプ中ロックをかける
  •  –password=[mysqlpassword] でMySQLのパスワード指定
  •  –all-databases –events で全データベース対象
  •  zip -P [zippassword] でパスワード付きzipにして
  •  /[dir]/mysqldump.zip – でmysqldump.zipという圧縮ファイルの中身に”-“というファイル名のdumpファイル

  というのを一行で実行します。最後ファイル名が「-」のDumpファイルが出来上がりますがパイプで一行で済ますにはこれしかないようです。一行にする必要性も少ないですが、メモリ上で処理が進むのがいいですね。

WordPressディレクトリをバックアップ

 公開ディレクトリにあるWordPressディレクトリを丸ごとwpbackup.zipというファイル名でパスワード付き圧縮でバックアップするコマンドです。

zip -P [zippassword] -r /[dir]/wpbackup.zip [WP_dir1] [WP_dir2] [WP_dir3]

 さらに、boxに保存するときだけ、 -s 200M のオプションを付けて200MB毎にファイルを分割します。

曜日別スクリプトファイルを作成

 曜日別にスクリプトファイルを作りCronで実行させる計画です。

  • Dropbox共有ディレクトリ /home/user/Dropbox
  • boxマウントディレクトリ /mnt/box
  • Driveeマウントディレクトリ /mnt/drivee
  • USBメモリのマウントディレクトリ /mnt/usb1
  • WordPrssディレクトリが3サイト分 /var/www 、/var/blog1、/var/blog2

 という事にした例です。

火、木、土曜日スクリプト

 サーバーに直挿ししたままのUSBメモリにバックアップします。まずはバックアップ用ディレクトリを作成しておきます。

cd /mnt/usb1
mkdir tue_backup thu_backup sat_backup

 /usr/local/sbinにスクリプトファイルを作ります。

火曜日用ファイル /usr/local/sbin/tue_backup.sh

#!/bin/sh
rm -r /mnt/usb1/tue_backup/*
mysqldump -u root -x --password=[mysqlpassword] --all-databases --events | zip -P [zippassword] /mnt/usb1/tue_backup/mysqldump.zip -

cd /var
zip -P [zippassword] -r /mnt/usb1/tue_backup/wpbackup.zip www blog1 blog2

木曜日用ファイル /usr/local/sbin/thu_backup.sh

#!/bin/sh
rm -r /mnt/usb1/thu_backup/*
mysqldump -u root -x --password=[mysqlpassword] --all-databases --events | zip -P [zippassword] /mnt/usb1/thu_backup/mysqldump.zip -

cd /var
zip -P [zippassword] -r /mnt/usb1/thu_backup/wpbackup.zip www blog1 blog2

土曜日用ファイル /usr/local/sbin/sat_backup.sh

#!/bin/sh
rm -r /mnt/usb1/sat_backup/*
mysqldump -u root -x --password=[mysqlpassword] --all-databases --events | zip -P [zippassword] /mnt/usb1/sat_backup/mysqldump.zip -

cd /var
zip -P [zippassword] -r /mnt/usb1/sat_backup/wpbackup.zip www blog1 blog2

水曜日スクリプト

  Driveeにバックアップします。まずはディレクトリを作ります。

mkdir /mnt/drivee/wed_backup

水曜日用ファイル /usr/local/sbin/wed_backup.sh

#!/bin/sh
rm -r /mnt/drivee/wed_backup/*
mysqldump -u root -x --password=[mysqlpassword] --all-databases --events | zip -P [zippassword] /mnt/drivee/wed_backup/mysqldump.zip -

cd /var
zip -P [zippassword] -r /mnt/drivee/wed_backup/wpbackup.zip www blog1 blog2

日曜日スクリプト

  Dropboxにバックアップします。まずはディレクトリを作ります。

mkdir /home/user/Dropbox/sun_backup

日曜日用ファイル /usr/local/sbin/sun_backup.sh

#!/bin/sh
rm -r /home/user/Dropbox/sun_backup/*
mysqldump -u root -x --password=[mysqlpassword] --all-databases --events | zip -P [zippassword] /home/user/Dropbox/sun_backup/mysqldump.zip -

cd /var
zip -P [zippassword] -r /home/user/Dropbox/sun_backup/wpbackup.zip www blog1 blog2

月、金曜日スクリプト

 Boxへのバックアップはひと手間必要です。無料アカウントでは1ファイルのアップロードサイズの上限が250MBに制限されているため、分割されたzipファイルを任意の場所(今回は/rootに作成)に作ってからBoxにコピーします。まずはディレクトリを作成します。

mkdir /root/mon_backup /root/fri_backup /mnt/box/mon_backup /mnt/box/fri_backup

月曜日用ファイル /usr/local/sbin/mon_backup.sh

#!/bin/sh
rm -r /root/mon_backup/*
mysqldump -u root -x --password=[mysqlpassword] --all-databases --events | zip -P [zippassword] /root/mon_backup/mysqldump.zip - 

cd /var 
zip -P [zippassword] -r -s 200M /root/mon_backup/wpbackup.zip www blog1 blog2 

rm -r /mnt/box/mon_backup/*
cp -f /root/mon_backup/* /mnt/box/mon_backup

金曜日用ファイル /usr/local/sbin/fri_backup.sh

#!/bin/sh
rm -r /root/fri_backup/*
mysqldump -u root -x --password=[mysqlpassword] --all-databases --events | zip -P [zippassword] /root/fri_backup/mysqldump.zip -

cd /var
zip -P [zippassword] -r -s 200M /root/fri_backup/wpbackup.zip www blog1 blog2

rm -r /mnt/box/fri_backup/*
cp -f /root/fri_backup/* /mnt/box/fri_backup

スクリプトファイルに実行権限を与える

 スクリプトのパーミッションを変更します。パスワードが平文で記入されているので500にします。

chmod 500 /usr/local/sbin/*_backup.sh

Cronに曜日別に登録する

 Cronに週一ペースで各曜日別のスクリプトファイルを深夜3時15分に実行させるべく /etc/crontab に登録します。

# m h dom mon dow user  command

15 3    * * 0   root    /usr/local/sbin/sun_backup.sh
15 3    * * 1   root    /usr/local/sbin/mon_backup.sh
15 3    * * 2   root    /usr/local/sbin/tue_backup.sh
15 3    * * 3   root    /usr/local/sbin/wed_backup.sh
15 3    * * 4   root    /usr/local/sbin/thu_backup.sh
15 3    * * 5   root    /usr/local/sbin/fri_backup.sh
15 3    * * 6   root    /usr/local/sbin/sat_backup.sh
#

 念のためCronを再起動させておきます。

/etc/init.d/cron restart

 以上で設定完了です。しばらくは動作しているか確認が必要ですね。

 最後にひとこと

  これで扱いやすいUSBメモリにもバックアップしておき、さらに自宅消滅から日本沈没までにも対応したバックアップになったと思います。

 バックアップされたzipファイルを解凍する方法は次の記事をご覧ください。

スポンサー リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です