バックアップ(サーバー内へ)

■ FC2~FC6 / Fedora7 / Fedora8 / Fedora9
サーバーのデータを tar コマンドを使い、同じサーバー内に圧縮バックアップが出来るようにする。
■ サーバー側でのバックアップ設定
1.バックアップスクリプト作成

[root@server ~]# vi backup.sh
#!/bin/bash
LANG=C
# バックアップ対象ファイルリスト名
BACKUPLIST=/root/backuplist
[ ! -s $BACKUPLIST ] && echo "$BACKUPLIST is not found" && exit 1
# バックアップ対象外ファイルリスト名
BACKUPNOLIST=/root/backupnolist
# バックアップ先ディレクトリ名
BACKUPDIR=/backup
mkdir -p $BACKUPDIR
# バックアップの保存世代数
BACKUPGEN=12
# バックアップのログファイル名
BACKUPLOG=/var/log/backup.log
# バックアップ先ディレクトリをバックアップ対象外ファイルリストに追加
TMPBACKUPNOLIST=`mktemp`
[ -s $BACKUPNOLIST ] && cat $BACKUPNOLIST > $TMPBACKUPNOLIST
echo $BACKUPDIR >> $TMPBACKUPNOLIST
# 前回バックアップしたファイル名変更
cd $BACKUPDIR
OLDBACKUPFILE=`ls backup.tar.bz2* 2>/dev/null`
if [ -f $OLDBACKUPFILE ]; then
TIMESTAMP=`ls --full-time $OLDBACKUPFILE|awk '{print $6}'|tr -d -`
mv $BACKUPDIR/$OLDBACKUPFILE $BACKUPDIR/${TIMESTAMP}$OLDBACKUPFILE > /dev/null 2>&1
fi
# バックアップのログファイル作成
rm -f $BACKUPLOG
touch $BACKUPLOG
chmod 400 $BACKUPLOG
# バックアップの実行
echo "`date` backup start" >> $BACKUPLOG
tar cjvfP $BACKUPDIR/backup.tar.bz2 -T $BACKUPLIST -X $TMPBACKUPNOLIST >> $BACKUPLOG 2>&1
[ $? -ne 0 ] && cat $BACKUPLOG | mail -s "BACKUP NG" root && exit 1
echo "`date` backup end" >> $BACKUPLOG
# バックアップの保存世代を超えた古いバックアップファイルを削除
if [ $(ls /backup/|wc -l) -gt $BACKUPGEN ]; then
OLDBACKUPCNT=`expr $(ls /backup/|wc -l) - $BACKUPGEN`
for file in `ls -t $BACKUPDIR|tail -n $OLDBACKUPCNT`
do
rm -f $BACKUPDIR/$file
done
fi
# バックアップ対象外ファイルを削除
rm -f $TMPBACKUPNOLIST

バックアップスクリプトへ実行権限付加

[root@server ~]# chmod 700 backup.sh

2.バックアップ対象ファイルリストの作成
バックアップ対象ファイルリストに/var/www/htmlディレクトリを追加

[root@server ~]# echo "/var/www/html" >> backuplist

3.バックアップ対象外ファイルリストの作成
例としてバックアップ対象外ファイルリストに/var/www/errorディレクトリを追加

[root@server ~]# echo "/var/www/error" >> backupnolist

4.バックアップスクリプトの確認

[root@server ~]# ./backup.sh ← バックアップスクリプトの実行
[root@server ~]# ls -lh /backup ← バックアップ先ディレクトリの照会
合計 754M
-rw-r--r-- 1 root root 753M 10月 27 20:15 backup.tar.bz2
↑ backup.tar.bz2というバックアップファイルが出来ている

5.バックアップディレクトリ、ファイルの確認

[root@server ~]# tar tjvf /backup/backup.tar.bz2
バックアップしたディレクトリ、ファイルが一覧表示される

6.バックアップ定期自動実行設定

[root@server ~]# crontab -e
00 05 * * * /root/backup.sh ← 追加(毎日05:00にバックアップを実行する)

■MySQLのデータベースのバックアップ
MySQLのバックアップにも色々な方法があるが、もっとも簡単な方法はmysqldumpを利用して自サーバー内の/backupディレクトリーにバックアップすることだと思う。
1.mysqldumpによるバックアップ
たとえば、全データベースを/backupディレクトリーにalldump.sqlという名前でバックアップするのなら次のようにする。linuxではこれをcronから起動させれば深夜に無人バックアップさせることが出来る。

[root@server ~]# mysqldump -A -uroot -pパスワード -Q --opt -r/backup/alldump.sql

個別のデータベースを/backupディレクトリーにデータベース名.sqlという名前でバックアップしたい場合は以下のようにする。

[root@server ~]# mysqldump mysql -uroot -pパスワード -Q --opt -r/backup/mysqldump.sql
[root@server ~]# mysqldump fc -uroot -pパスワード -Q --opt -r/backup/fcdump.sql
[root@server ~]# mysqldump ss1129 -uroot -pパスワード -Q --opt -r/backup/ss1129dump.sql
[root@server ~]# mysqldump nucleus -uroot -pパスワード -Q --opt -r/backup/nucleusdump.sql
[root@server ~]# mysqldump taka -uroot -pパスワード -Q --opt -r/backup/takadump.sql

2.MySQLのデータベースの自動バックアップ

MySQLの個別のデータベースを/backupにバックアップするスクリプトを作成。
[root@server ~]# vi mysqldump.sh
#! /bin/sh
mysqldump mysql -uroot -pパスワード -Q --opt -r/backup/mysqldump.sql
mysqldump fc -uroot -pパスワード -Q --opt -r/backup/fcdump.sql
mysqldump ss1129 -uroot -pパスワード -Q --opt -r/backup/ss1129dump.sql
mysqldump nucleus -uroot -pパスワード -Q --opt -r/backup/nucleusdump.sql
mysqldump taka -uroot -pパスワード -Q --opt -r/backup/takadump.sql
実行権限を与える
[root@server ~]# chmod 700 mysqldump.sh
バックアップスクリプトを実行
[root@server ~]# ./mysqldump.sh
バックアップされてるか確認
[root@linux ~]# ls -lh /backup
合計 1.2G
-rw-r--r-- 1 root root 753M 10月 28 05:16 backup.tar.bz2
-rw-r--r-- 1 root root 377K 10月 28 05:00 fcdump.sql
-rw-r--r-- 1 root root 150K 10月 28 05:00 ss1129dump.sql
-rw-r--r-- 1 root root 285K 10月 28 05:00 mysqldump.sql
-rw-r--r-- 1 root root  12M 10月 28 05:00 nucleusdump.sql
-rw-r--r-- 1 root root 234K 10月 28 05:00 takadump.sql

3.自動実行
すでに毎日5:00にデータベース以外のバックアップを自動実行させているのでデータベースも連携してバックアップする。
先にデータベースをバックアップして次に他のバックアップを実行するように/root/backup.shの前に/root/mysqldump.shを入れる。

[root@server ~]# crontab -e
00 05 * * * /root/mysqldump.sh ; /root/backup.sh

4.復元
バックアップファイルをサーバーへ復元する必要が出てきた場合は、以下のコマンドを実行することで、パーミッション、所有者も含めて元のメインサーバーにリストア出来る。

[root@server ~]# tar jxvfP /backup/backup.tar.bz2
個別にパーミッション、所有者も含めて復元する場合は
[root@server ~]# tar jxvfP /backup/backup.tar.bz2 /var/www/html/ファイル名

mysqldumpでバックアップしたファイルをリストアするにはmysqlコマンドを使う。

全てをバックアップした場合のリストア
[root@server ~]# mysql -uroot -pパスワード < /backup/alldump.sql
個別のデータベースをバックアップした場合のリストア
[root@server ~]# mysql -uroot -pパスワード mysql < /backup/mysqldump.sql
[root@server ~]# mysql -uroot -pパスワード fc < /backup/fcdump.sql
[root@server ~]# mysql -uroot -pパスワード ss1129 < /backup/ss1129dump.sql
[root@server ~]# mysql -uroot -pパスワード nucleus < /backup/nucleusdump.sql
[root@server ~]# mysql -uroot -pパスワード taka < /backup/takadump.sql
mysqlをリストアした場合や全てをリストアした場合はmysqlを再起動が必要
[root@server ~]# /etc/init.d/mysql restart