Linux/Unixサーバーの自動バックアップをシェルスクリプトとcronで実現する方法
このガイドでは、Linux(および多くの*BSDなどのUnix系OS)環境において、自動バックアップを構築する手順をステップバイステップで解説します。
なぜバックアップが必要なのか
「備えあれば憂いなし」ということわざがあるように、コンピュータの世界ではこの「備え」に相当するのがバックアップです。本番環境のITインフラを運用している場合、サーバーやアプリケーションの稼働率は可能な限り100%に近づける必要があります。ITインフラを堅牢にする方法は数多く存在しますが、完全に障害を防ぐことは不可能です。だからこそ、プランBとしてのバックアップ体制が不可欠になります。
サーバーは大きく分けて「ハードウェア」「OSとアプリケーション」「データ」の3層で構成されています。ハードウェアが故障した場合は新しいマシンに交換すればよく、OSやアプリケーションの再インストールも比較的簡単です。しかし、置き換えるのが難しいのは、アプリケーションが使用するデータと設定ファイルです。障害発生時に失われてしまうと二度と取り戻せないのがこの部分であり、定期的にバックアップし、緊急時にすぐ復旧できる形で保存しておくことが重要です。
想定する環境
本記事では、以下のような構成のLinuxサーバーを例に説明します。
- Apacheウェブサーバーが稼働している
- MySQLデータベースサーバーが稼働している
- /homeパーティション配下にバックアップ対象のデータディレクトリがある
- 前日のApacheアクセスログも別のバックアップディレクトリへ保存したい
ステップ1:バックアップ用ディレクトリを作成する
まず、バックアップファイルの保存先となるディレクトリを作成します。ここでは/optパーティションにBACKUPディレクトリを作り、「/opt/BACKUP/年/月/日/」という階層構造で日ごとのバックアップを整理します。たとえば2008年8月11日のバックアップは「/opt/BACKUP/2008/08/11/」に格納されるイメージです。
rootユーザーで以下のコマンドを実行してください。
# mkdir -p /opt/backup/DATA/2008 # cd /opt/backup/DATA/2008 # mkdir 01 02 03 04 05 06 07 08 09 10 11 12 # cd /opt/backup/DATA/ # cp -r 2008 2009 # cd /opt/backup/ # cp -r DATA LOG
最後のコマンドを実行する前に、下記の注意点をご確認ください。
# chown -R calvin.calvin /opt/backup
これでデータ用とログ用の2組のバックアップディレクトリが準備できました。以降の記事ではユーザー名としてcalvinを使用していますが、ご自身の環境に合わせて読み替えてください。
ステップ2:バックアップスクリプトを作成する
次に、自動バックアップを行うbashスクリプトを書いていきます。設定値はすべて変数として先頭にまとめてあるので、自分の環境に合わせて書き換えるだけで動作します。
スクリプト全体のコード
#####################################################
# CODE BEGINS HERE
#####################################################
#!/bin/bash
# SERVER DATA BACKUP V1.0
#########################
# BACKUP CONFIG
#########################
# 年・月・日を取得
YEAR=`date +"%Y"` # 2008
MONTH=`date +"%m"` # 11
DAY=`date +"%d"` # 14
YESTERDAY=`date --date="yesterday" +%Y-%m-%d` # 2008-11-13
YESTERDAY_DATE=`date --date=yesterday +%d` # 13
YESTERDAY_MONTH=`date --date=yesterday +%m` # 11
YESTERDAY_YEAR=`date --date=yesterday +%Y` # 2008
TODAY=`date +%Y-%m-%d` # 2008-11-14
TODAY_DATE=`date +%d` # 14
# バックアップ保存先ディレクトリ
DATA_BACKUP_PARENT_DIR=/opt/backup/DATA/ # <-- データ用バックアップディレクトリに変更
LOG_BACKUP_PARENT_DIR=/opt/backup/LOG/ # <-- ログ用バックアップディレクトリに変更
# Apacheドキュメントルート
APACHE_DOCROOT=/var/www/html/
# MySQL接続設定
DB_IP="localhost" # <-- DBサーバーのIPアドレスに変更
DB_USER="calvin" # <-- データベースのユーザー名に変更
DB_PASS="calvin_password" # <-- データベースのパスワードに変更
DB_NAME="clientlist" # <-- データベース名に変更
# Apacheログディレクトリ
APACHE_LOG_DIR="/var/log/httpd/" # <-- ログの保存パスに変更
# アプリケーションファイルのディレクトリ
APP_FILES="/home/calvin/application_files/" # <-- 対象データのパスに変更
# 設定ファイルディレクトリ
CONFIG_DIR="/etc/" # <-- 設定ディレクトリのパスに変更
# レポート送信先メールアドレス
EMAIL_ID="you@youremailid.com" # <-- 自分のメールアドレスに変更
#####################################################
# DATA BACKUP(データのバックアップ)
#####################################################
# バックアップディレクトリを作成して移動
cd $DATA_BACKUP_PARENT_DIR/$YEAR/$MONTH
mkdir $DAY
cd $DAY
# データベースのバックアップ
mysqldump -h ${DB_IP} -u ${DB_USER} -p${DB_PASS} ${DB_NAME} > ${DB_NAME}.db
tar -zcvf ${DB_NAME}.tar.gz ${DB_NAME}.db
rm -f ${DB_NAME}.db
# /etc のバックアップ
tar -zcf etc.tar.gz /etc
# アプリケーション関連のバックアップ
tar -zcf Apache_Doc_Root.tar.gz ${APACHE_DOCROOT}
tar -zcf App_Files.tar.gz ${APP_FILES}
#####################################################
# LOG BACKUP(ログのバックアップ)
#####################################################
# バックアップディレクトリを作成して移動
cd $LOG_BACKUP_PARENT_DIR/$YESTERDAY_YEAR/$YESTERDAY_MONTH
mkdir $YESTERDAY_DATE
cd $YESTERDAY_DATE
# HTTPDログのバックアップ(前日分)
for i in ${APACHE_LOG_DIR}/access_log.${YESTERDAY}*; do cp $i .; done
for i in access_log.${YESTERDAY}*; do gzip $i; done
#####################################################
# メール通知の送信
#####################################################
# バックアップ完了をメールで通知
du -shc $DATA_BACKUP_PARENT_DIR/$YEAR/$MONTH/$DAY/* | mail -s "Backup for ${HOSTNAME}::DATA done :)" ${EMAIL_ID}
du -shc $LOG_BACKUP_PARENT_DIR/$YESTERDAY_YEAR/$YESTERDAY_MONTH/$YESTERDAY_DATE/* | mail -s "Backup for ${HOSTNAME}::LOG done :)" ${EMAIL_ID}
#####################################################
# CODE ENDS HERE
#####################################################
スクリプトのポイント解説
このスクリプトが行っている処理は以下の通りです。
- MySQLダンプ:
mysqldumpコマンドでデータベースをSQL形式で出力し、gzip圧縮したtarアーカイブ(.tar.gz)にまとめた後、元のダンプファイルを削除して容量を節約します。 - /etcのバックアップ: サーバーの設定ファイル群を丸ごと圧縮保存します。
- アプリケーションファイル: Apacheのドキュメントルートと/home配下のアプリケーションデータを圧縮します。
- ログのバックアップ: 前日付のApacheアクセスログをコピーし、gzipで圧縮します。
- メール通知:
duコマンドでバックアップサイズを確認し、その結果をメールで通知することで、毎日のバックアップ成否を一目で把握できます。
ステップ3:スクリプトに実行権限を付与してテストする
作成したスクリプトを、たとえば「/home/calvin/scripts/backup.sh」というパスに保存し、実行権限を付与します。
# chmod +x /home/calvin/scripts/backup.sh
これで準備完了です。まずはコマンドラインから手動で実行して、正しく動作するか確認しましょう。
# /home/calvin/scripts/backup.sh
ステップ4:cronで毎日自動実行する
スクリプトをcronジョブとして登録すれば、毎日決まった時刻に自動的にバックアップが実行されます。たとえば毎朝午前4時に実行したい場合は、以下のようにします。
# crontab -e
開いたファイルに次の1行を追加してください。
0 4 * * * /home/calvin/scripts/backup.sh > /dev/null
これで完成です。毎日午前4時に、データベース・設定ファイル・アプリケーションファイル・ログファイルがすべて/opt/backupへ自動的にバックアップされるようになりました。さらに安全性を高めたい場合は、バックアップファイルを暗号化したり、別サーバーやクラウドストレージへの転送(オフサイト保管)を組み合わせることをおすすめします。
-
Linuxでシェルスクリプトを作成する方法【初心者向け基本ガイド】
シェルスクリプトの作成は、Linuxユーザーが必ず身につけておきたい最重要スキルのひとつです。シェルスクリプトを活用すれば、手作業で一行ずつ実行すると面倒な反復タスクを効率的に自動化できます。このチュートリアルでは、すべてのLinuxユーザーが押さえておくべき基本的なシェルスクリプトの操作方法を、実例とともにわかりやすく解説します。1. 簡単なシェルスクリプトを作成するシェルスクリプトとは、ASCIIテキストで構成されたファイルのことです。まずはテキストエディタを使って、簡単なシェルスクリプトを作成してみましょう。テキストエディタにはコマンドライン型とGUI型のさまざまな種類がありますが、本ガ
-
Linux で起動可能な Windows 10 USB メモリを作成する方法
Linux 環境に Windows 10 をインストールするのは、決して複雑な作業ではありません。むしろ、手間やトラブルを避けたいのであれば、起動可能な Windows 10 USB メモリを作成するのが最適な方法です。この記事では、起動可能な Windows 10 USB の作成手順を、具体的な操作方法とあわせて詳しく解説します。それでは始めましょう。 Linux で起動可能な Windows 10 USB を作成する この作業には、大きく分けて2つの方法があります。1つ目の方法では、UEFI 互換の起動ディスクを作成できます。マウント作業を始める前にまず必要になるのが、Windows の