【WordPressにも使える】サーバーのファイルとmysqlデータベースを自動バックアップして、Bitbucket(Git)を使って外部サーバに保管

Webサイトのデータを自動バックアップする方法で、一発でわかるような記事って案外少ないですよね。うっかりデータベースを壊したり重要なファイルを削除して泣かないように、普段からバックアップは自動で行ったほうが良いんですが…。(特に受託案件)

有料のレンタルサーバーなんかでは、最初から自動バックアップ機能が備わっていたりして、あえて意識する必要が少ないのかも知れません。とはいえVPSや安いレンタルサーバーを利用している場合は自前でどうにかする必要があるかと思います。今回は、ssh が許可されているサーバなら無料で自動バックアップが可能な方法をご紹介。

もしデータベースの容量が大きい場合、容量無制限のVSTSもご検討下さい。

【事前準備】Bitbucket アカウント作成 〜 サーバに Git インストール

Git といえば GitHub が有名ですが、GitHub はオープンソースが前提のため重要ファイルのバックアップに不向きです。ということで、ここでは Bitbucket を利用します。まずはアカウントを作成してサーバから git push ができるようにして下さい。

Bitbucketに公開鍵の登録まで完了したら、 Bitbucket 管理画面より「リポジトリの作成」を選びます。今回はHTMLやCSSといった「ファイル用」と、mysql等「データベース用」の2つ作成して下さい。注意点として、必ず「非公開(Private)」を選ぶこと。 公開にしてしまうと、誰でもアクセス可能な状態になるので最悪死にます…。

「ファイル用」「データベース用」のリポジトリの作成が完了したら、各リポジトリの「概要」→画面右側のSSH付近に書いてある「git@bitbucket.org:******.git」みたいなのを、メモ帳あたりに一旦コピーしておきます。

次に、データが保存されているサーバへ ssh でログインして、もし Git がサーバにインストールされていなければインストールして下さい。次から自動バックアップの設定です。

【ファイルバックアップ】HTML/CSS/JS、PHPや画像といったファイルをバックアップ

WordPressやCMS等でサイトを作成している方はほとんどそうだと思いますが、「PCにあるファイル→サーバへアップロード」という手順で行ってることから、PCのデータが少し古かったり、画像なんかはCMSで直接アップロードしてるから手元に無いということが多いかと思います。全データを手動ダウンロードするのも結構面倒です。

ということで、 Git を使って Bitbucket にファイルをバックアップします。

1. バックアップしたいディレクトリに Bitbucket の「ファイル用」リポジトリを設定

# バックアップしたいディレクトリのパスを入力
cd "/hogehoge/fugafuga/piyopiyo"

git init 

# 事前準備でメモした 「ファイル用」の git@bitbucket.org:******.git を入力
git remote add origin git@bitbucket.org:******.git

2. 以下のシェルスクリプトを作成

さくらVPSの例なので、特に一行目の「#!/bin/bash」などは環境によって変わるかも。

#!/bin/bash

# このファイルを「git_push.sh」みたいなファイル名にし、ユーザーディレクトリ直下にでも入れておきます。
# パーミッションを 700 あたりにするのをお忘れなく。
# このシェルを叩くことで、Bitbucket に全ファイルがバックアップされます!

# 1 で設定した「ファイル用」のローカルリポジトリを入力
cd "/hogehoge/fugafuga/piyopiyo"

git add -A
git commit -m "Commit at $(date "+%Y-%m-%d %T")" || true
git push -f -q origin master:master

【データベースバックアップ】 mysql のデータを mysqldump+gzip圧縮してバックアップ

私のようなバックエンドの知識に疎いフロントエンドエンジニアは、データベースのバックアップって結構抵抗あるもんです。触るな危険みたいなイメージがあるので…(笑)なので mysqldump についても、もっと効率的な方法が〜とかあるかと思いますが、あくまで小〜中規模程度の運用を前提に、無難な設定を検討しました。

mysqldump --quote-names --skip-lock-tables --single-transaction --flush-logs --master-data=2 [データベース名] | gzip > [バックアップ用SQL保存ディレクトリ]/database.sql.gz

オプションの詳細は「よく使うmysqldumpのオプションと使用例」が大変参考になりました。というかほぼコレです。今回は Git で外部転送していることから、さらに gzip で圧縮を行っています(けどGitの仕様的に本当に効率的なのかは不明…)。

「–single-transaction」はinnoDBでしか使えなかったり、「–flush-logs」「–master-data=2」はバイナリログが保存されている状態(my.cnf で log-bin=mysql-bin が設定済) じゃないと怒られるので、このあたりは臨機応変に。

今回は、この mysqldump をベースにしてデータベースをバックアップします。

1. バックアップしたSQLを保存するディレクトリを事前に作成し、そこに Bitbucket で作成した「データベース用」のリポジトリを設定。

# バックアップ用SQL保存ディレクトリのパスを入力
cd "/hogehoge/fugafuga/piyopiyo"

git init 

# 事前準備でメモした  「データベース用」の git@bitbucket.org:******.git を入力
git remote add origin git@bitbucket.org:******.git

2. 以下のシェルスクリプトを作成

さくらVPSの例なので、特に一行目の「#!/bin/bash」などは環境によって変わるかも。

#!/bin/bash

# このファイルを「db_backup.sh」みたいなファイル名にし、ユーザーディレクトリ直下にでも入れておきます。
# パーミッションを 700 あたりにするのをお忘れなく。
# このシェルを叩くことで、Bitbucket に データベースがバックアップされます!

# mysql のバックアップ。innoDBのみ+バイナリログONだと、ほぼ理想系。詳細は以下
# http://qiita.com/ryounagaoka/items/7be0479a36c97618907f
MYSQL_PWD="[データベースのパスワード]" mysqldump -u [データベースユーザー名] --quote-names --skip-lock-tables --single-transaction --flush-logs --master-data=2 [データベース名] | gzip > [バックアップ用SQL保存ディレクトリ]/database.sql.gz

# 1 で設定した「データベース用」のローカルリポジトリを入力
cd "/hogehoge/fugafuga/piyopiyo"

git add -A
git commit -m "Commit at $(date "+%Y-%m-%d %T")" || true
git push -f -q origin master:master

Cron を使って朝方に毎日自動バックアップを行う

最後に作成したシェルをCronに登録し、自動でバックアップするようにします。今回は朝4時にまとめてバックアップする例ですが、小中規模のサービスやWordPressでコーポレートサイトを作ってる程度であれば必要十分なので、この機会に是非どうぞです。

crontab -e

# もしバックアップ時にエラーがあったらメールが飛ぶようにする
MAILTO="alert@example.com"

#毎日朝4時にファイルを自動バックアップ
0 4 * * * /[シェルまでのパス]/git_push.sh > /dev/null

#毎日朝4時にデータベースを自動バックアップ
0 4 * * * /[シェルまでのパス]/db_backup.sh > /dev/null