バックアップの耐性を強化!自宅サーバのバックアップ世代を1から3に拡張した

1.複数バックアップの必要性

60爺は、自宅で RaspberryPi を使用して自宅サーバを運用し、ブログを開設していることは、何度かお伝えしています。

当然、サイトのバックアップも自前で実行しています。

以前アップした記事(下記)の「考察:バックアップの今後」で、「将来は、日単位でバックアップするとか、たとえば、30分おきにバックアップする必要」があると述べていました。

それから、既に3年以上が経ちましたが、今回、wordpress が壊れてしまう事故が起きました。

何とかバックアップしたデータベースから復旧することができたんですが、複数バックアップの必要性を強く感じた次第です。

何故なら、現在の1世代のバックアップでは、今回のようにデータベースが壊れると、翌日の朝3時を越えた時点でバックアップが書き換えられることで、それ以降はバックアップが使用できなくなってしまうからです。

バックアップを複数取っておけば、その分だけ、回復への猶予期間を延ばすことが出来ます。

2.バックアップを拡張

(1) 3世代の実施方法

バックアップを複数世代にするのはいいとしても、世代数を単純に大きくするだけでは、エリアを食うだけになってしまいます。

そこで、手始めとして、現在1世代であるバックアップを3世代に広げようと思います。

バックアップを3世代にする方法ですが、余り難しくしても仕方ありません。

当初は、日を3で割って出た余りの数を、バックアップファイルに追加することで対応しました。

しかし、月を跨ぐ際、3世代を維持することができない場合が出てきます。

日で行うと、31日がある月の場合、31日と翌月1日が3で割るとそれぞれ余りが1となり、3世代とはならなくなります。

そこで、バックアップを実施する日付から基準日を引いた日数を3で割った余りの数を、バックアップファイル名に追加するように変更しました。

(2) バックアップファイル名

3世代にする場合のファイル名ですが、現在、データベースと3つの wordpress のバックアップファイルがありますので、その名称の後ろに数字を1桁(下記 +X)追加します。

こうすれば、0⇒1⇒2⇒0⇒・・・というように3世代バックアップを実現できます。

【データベース用】

  • dump+X.sql

【wordpress用】

  • wordpress+X.tar.gz
  • wordpress_book+X.tar.gz
  • wordpress_okusama+X.tar.gz

3.実際の設定方法

シェルの頭で本日の日付を取得し、基準日(2021年1月1日にしました)との差額の日数を3で割った余りを変数に入れることで実現します。

その部分のコードをシェルで実現するには次のようにします。

# Get unix timestamp--->now
nowD=`date "+%s"`

# kijunbi = 20210101
firstD=`date -d "20210101" '+%s'`

# sagaku -> ret
ret=`expr "$nowD" - "$firstD"`
ret=`expr $ret / 86400 + 1`

am=$(( ret % 3 ))
# amari wo motomeru

これを現在のバックアップシェルに追加し、バックアップファイルのファイル名に変数 am を追加して終了です。

出来上がった「3世代バックアップ用シェル」です。

#!/bin/bash

# Get unix timestamp--->now
nowD=`date "+%s"`

# kijunbi = 20210101
firstD=`date -d "20210101" '+%s'`

# sagaku -> ret
ret=`expr "$nowD" - "$firstD"`
ret=`expr $ret / 86400 + 1`

am=$(( ret % 3 ))
# amari wo motomeru

mysqldump -u root -p(PSW) -x --all-databases > /tmp/dump$am.sql
cd /var/www
tar cvzf /tmp/wordpress$am.tar.gz wordpress
tar cvzf /tmp/wordpress_book$am.tar.gz wordpress_book
tar cvzf /tmp/wordpress_okusama$am.tar.gz wordpress_okusama

cp /tmp/dump$am.sql /root/Raspi_114
cp /tmp/wordpress$am.tar.gz /root/Raspi_114
cp /tmp/wordpress_book$am.tar.gz /root/Raspi_114
cp /tmp/wordpress_okusama$am.tar.gz /root/Raspi_114

chown root.root /tmp/dump$am.sql
chown root.root /tmp/wordpress$am.tar.gz
chown root.root /tmp/wordpress_book$am.tar.gz
chown root.root /tmp/wordpress_okusama$am.tar.gz

chmod 700 /tmp/dump$am.sql
chmod 700 /tmp/wordpress$am.tar.gz
chmod 700 /tmp/wordpress_book$am.tar.gz
chmod 700 /tmp/wordpress_okusama$am.tar.gz

(PSW)には、mySQLのパスワードが入ります。

見ていただくとわかると思いますが、バックアップファイルは、/tmp/に保存するとともに、/root/Raspi_114 にもコピーしています。

この /root/Raspi_114 は、別の RaspberryPi をマウントしており、現在、バックアップファイルをふたつの媒体で保存して、まさかの事態に備えています。

4.障害時体制強化

出来上がったシェルを crontab に入れて定時起動させます。時間は、朝の3時15分としました。

15 3 * * * /root/blog_backup/blog_backup_no.sh

そして、月末月初を含めた3日間のバックアップ結果を次に示します。

pi@raspberrypi:~ $ ls -l dump*
-rw-r--r-- 1 pi pi 39263855  2月  2 03:17 dump0.sql
-rw-r--r-- 1 pi pi 38981904  1月 31 03:17 dump1.sql
-rw-r--r-- 1 pi pi 39133698  2月  1 03:17 dump2.sql
pi@raspberrypi:~ $ ls -l wordpress*
-rw-r--r-- 1 pi pi 199969257  2月  2 03:18 wordpress0.tar.gz
-rw-r--r-- 1 pi pi 198240556  1月 31 03:18 wordpress1.tar.gz
-rw-r--r-- 1 pi pi 198259987  2月  1 03:17 wordpress2.tar.gz
-rw-r--r-- 1 pi pi  46184732  2月  2 03:18 wordpress_book0.tar.gz
-rw-r--r-- 1 pi pi  46036709  1月 31 03:18 wordpress_book1.tar.gz
-rw-r--r-- 1 pi pi  46182332  2月  1 03:18 wordpress_book2.tar.gz
-rw-r--r-- 1 pi pi  26001181  2月  2 03:18 wordpress_okusama0.tar.gz
-rw-r--r-- 1 pi pi  26001245  1月 31 03:18 wordpress_okusama1.tar.gz
-rw-r--r-- 1 pi pi  26001186  2月  1 03:18 wordpress_okusama2.tar.gz

月末(1/31)と月初(2/1)のバックアップをみると、それぞれ、1と2に分かれていることがわかります。

今回の目論見通り、データベースと wordpress のバックアップを問題なく3世代取得できました。

これで、1世代のバックアップより、障害時の耐性を多少強くすることが出来たと思います。

参考
誕生日までの残日数計算をシェルスクリプトで