
さくらインターネット環境でDBデータをcronで自動バックアップする
2016/12/13
さくらインターネット環境でcronを使い、データベースのデータを自動バックアップする方法を忘備録としてポストしておきます。
行いたいことは、早朝5時にDBの全データをバックアップし「バックアップ日.tar.gz 形式」で保存するってことです。
こちらで素晴らしいスクリプトが公開されていますので、それを利用させて頂きます。
シェルスクリプトとCronでデータベースを自動バックアップ&ローテーション - (DxD)∞
http://dxd8.com/archives/168/
(DxD)∞さま、ありがとうございます。
cronでバックアップする方法
shellファイル作成
ということで、さくらインターネットでも動くシェル(sh)は以下となります。
ファイル名は db_dump.sh として保存します。
[shell]
#!/bin/sh
# ----- 設定 -----
# バックアップ元のデータベース
DBNAME=databasename # ←DB名
DBLOGINID=username # ←ユーザ名
DBPASS=password # ←パスワード
DBSERVER=mysql***.db.sakura.ne.jp # ←DBが乗っているホスト名
PATH=/bin:/usr/bin:/usr/local/bin
# 保存する日数
bk_days=7 # ←7日後に削除される
# ---------- ファイル名を設定 ----------
# タイムスタンプを取得
TSNOW=date +%Y%m%d
#(2013.11.06編集)
TSOLD=date -v -"$bk_days"d +%Y%m%d
# ←さくらインターネットなど、OSがFreeBSDの場合はコチラを採用
#TSOLD=date "-d$bk_days days ago" +%Y%m%d
# ←Linux系の場合はコチラを採用
# バックアップ先のディレクトリ・ファイル
bk_dir=/home/XXXXXXXXXX/db_backup/
# ファイル名を設定
file_temp=filaname_$TSNOW.sql
file_backup=filaname_$TSNOW.tar.gz
file_remove=filaname_$TSOLD.tar.gz
# ---------- バックアップ処理 ----------
# バックアップ先のディレクトリに移動
cd $bk_dir
if [ $? != 0 ]; then
echo "Backup directory does not exist."
exit 1
fi
# データベースをダンプ
mysqldump -Q -h $DBSERVER -u $DBLOGINID -p$DBPASS $DBNAME > $file_temp
if [ $? != 0 -o ! -e $file_temp ]; then
echo "Cannot dump database."
exit 1
fi
# アーカイブを作成
tar cfz $file_backup $file_temp
if [ $? != 0 -o ! -e $file_backup ]; then
echo "Cannot archive files."
exit 1
fi
# テンポラリファイルを削除
rm -f $file_temp
# ローテーション処理
if [ -e $file_remove ]; then
rm -f $file_remove
fi
exit 0
[/shell]
(2013.11.06 編集)
1年以上前の記事ですが、修正です。
ローテーションでファイルが消えないとの指摘を受けたので調べたところ、記述したコードが間違っておりました。
上記コードは、サーバの OS がLinux系の場合となります。
さくらインターネットの OS はFreeBSD ということで、 dateコマンド の使い方が違います。
FreeBSDの場合の書き方は以下となります。
[shell mark="4"]
# ---------- ファイル名を設定 ----------
## タイムスタンプを取得
TSNOW=date +%Y%m%d
TSOLD=date -v -"$bk_days"d +%Y%m%d
[/shell]
(2013.11.06 編集ここまで)
オリジナルと変更しているのは、DBの設定部分と、ダンプしている部分です。
保存日数とバックアップ先のディレクトリ、ファイル名は任意に設定してください。
shファイルは文字コードEUC、改行コードをLFで保存し、アップロード後、パーミッションを 755 とします。
バックアップデータの保存場所についてですが(バックアップファイルへ)ブラウザからアクセス可能な階層に置きたくなかったので、ドキュメントルート「www」と同じ階層に「db_backup」ディレクトリを作成し、そちらに保存されるようにしています。
パーミッションは 777 とします。
同じ理由で、DBのパスワードなどが書かれているshファイル自体も「scripts」ディレクトリを作成して設置しました。
簡単に図にするとこんな感じ。
1 2 3 4 5 6 7 8 |
[XXXXXXXXXX] ├[・・・] ├[db_backup] ←バックアップディレクトリ(777) ├[scripts] ←shファイル設置ディレクトリ(705) ├[www] ←ドキュメントルート | ├[・・・] | └[・・・] ├[・・・] |
cron設定
さくらのコントロールパネル左メニューの「CRONの設定」をクリック。
実行コマンド欄に以下を記述
[shell]
/home/XXXXXXXXXX/scripts/db_dump.sh 1> /dev/null
[/shell]
以前ポストした「さくらインターネット環境のCakePHPでcronを使ってみる」とは違い、単に実行ファイルを指定するだけでOKです。
実行日時を設定します。
説明書きにあるとおり、毎時設定の場合は「*」を指定します。
例えば、毎時15分にcronを起動させたい場合は、
月:「*」、日:「*」、時:「*」、分:「15」とします。
1日一回、昼12時に起動させたい場合は、
月:「*」、日:「*」、時:「12」、分:「0」とします。
以上で設定は完了です。
テストする場合は、「分」を調整して、実際にcronとして起動するか確認しながら行なってみてください。
cronの設定の方法は手前味噌ですが、こちらを参照してください。
https://nodoame.net/archives/550