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

サーバーのデータを tar コマンドを使い、同じサーバー内に圧縮バックアップが出来るようにする。
■ サーバー側でのバックアップ設定

1.バックアップスクリプト作成

[root@server1 ~]# 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=10
# バックアップのログファイル名
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@server1 ~]# chmod 700 backup.sh

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

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

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

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

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

[root@server1 ~]# ./backup.sh ← バックアップスクリプトの実行
[root@server1 ~]# ls -lh /backup ← バックアップ先ディレクトリの照会
合計 3.3G
-rw-r--r-- 1 root root 3.3G 12月 17 03:05 backup.tar.bz2
↑ backup.tar.bz2というバックアップファイルが出来ている

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

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

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

毎日2:30にバックアップを実行する
[root@server1 ~]# echo "30 2 * * * root /root/backup.sh" > /etc/cron.d/backup

■MySQLのデータベースのバックアップ
MySQLのバックアップにも色々な方法があるが、もっとも簡単な方法はmysqldumpを利用して自サーバー内の/backupディレクトリーにバックアップすることだと思う。

1.mysqldumpによるバックアップ
たとえば、全データベースを/backupディレクトリーにalldump.sqlという名前でバックアップするのなら次のようにする。linuxではこれをcronから起動させれば深夜に無人バックアップさせることが出来る。

# mysqldump -A -uroot -pパスワード --default-character-set=binary > /backup/alldump.sql

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

# mysqldump mysql -uroot -pパスワード --default-character-set=binary > /backup/mysqldump.sql
# mysqldump fedora -uroot -pパスワード --default-character-set=binary > /backup/fedoradump.sql
# mysqldump nucleus -uroot -pパスワード --default-character-set=binary > /backup/nucleusdump.sql
# mysqldump taka -uroot -pパスワード --default-character-set=binary > /backup/takadump.sql
# mysqldump centos -uroot -pパスワード --default-character-set=binary > /backup/centosdump.sql

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

MySQLの個別のデータベースを/backupにバックアップするスクリプトを作成。
[root@server1 ~]# vi mysqldump.sh
#! /bin/sh
mysqldump mysql -uroot -pパスワード --default-character-set=binary > /backup/mysqldump.sql
mysqldump fedora -uroot -pパスワード --default-character-set=binary > /backup/fedoradump.sql
mysqldump nucleus -uroot -pパスワード --default-character-set=binary > /backup/nucleusdump.sql
mysqldump taka -uroot -pパスワード --default-character-set=binary > /backup/takadump.sql
mysqldump centos -uroot -pパスワード --default-character-set=binary > /backup/centosdump.sql
実行権限を与える
[root@server1 ~]# chmod 700 mysqldump.sh
バックアップスクリプトを実行
[root@server1 ~]# ./mysqldump.sh
バックアップされてるか確認
[root@server1 ~]# ls -lh /backup
合計 3.4G
-rw-r--r-- 1 root root 3.3G 12月 17 03:05 backup.tar.bz2
-rw-r--r-- 1 root root  13M 12月 17 18:58 blogdump.sql
-rw-r--r-- 1 root root 2.3M 12月 17 18:58 centosdump.sql
-rw-r--r-- 1 root root 694K 12月 17 18:58 fedoradump.sql
-rw-r--r-- 1 root root 503K 12月 17 18:58 mysqldump.sql
-rw-r--r-- 1 root root 788K 12月 17 18:58 takadump.sql

3.自動実行
すでに毎日2:30にデータベース以外のバックアップを自動実行させているので、データベースのバックアップはその前の毎日2:00に自動実行させる。

[root@server1 ~]# echo "0 2 * * * root /root/mysqldump.sh" > /etc/cron.d/mysqldump

ちなみにメインサーバの自動実行設定は以下のようになっている。
/etc/cron.dには時間指定のスクリプトを入れておき、特に時間指定しなくても良さそうなものは/etc/cron.dailyにスクリプトを入れておく。

[root@server1 ~]# echo "*/1 * * * * root /usr/ddns/ddo.jpIP_upgrade.pl" > /etc/cron.d/ddns
[root@server1 ~]# echo "0 2 * * * root /root/mysqldump.sh" > /etc/cron.d/mysqldump
[root@server1 ~]# echo "15 2 * * * root /root/mysqlbackup.sh" > /etc/cron.d/mysqlbackup
[root@server1 ~]# echo "30 2 * * * root /root/backup.sh" > /etc/cron.d/backup
[root@server1 ~]# mv chkrootkit /etc/cron.daily/
[root@server1 ~]# mv clamscan /etc/cron.daily/

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

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

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

全てをバックアップした場合のリストア
# mysql -uroot -pパスワード --default-character-set=binary < /backup/alldump.sql
個別のデータベースをバックアップした場合のリストア
# mysql -uroot -pパスワード mysql --default-character-set=binary < /backup/mysqldump.sql
# mysql -uroot -pパスワード fedora --default-character-set=binary < /backup/fedoradump.sql
# mysql -uroot -pパスワード nucleus --default-character-set=binary < /backup/nucleusdump.sql
# mysql -uroot -pパスワード taka --default-character-set=binary < /backup/takadump.sql
# mysql -uroot -pパスワード centos --default-character-set=binary < /backup/centosdump.sql
mysqlをリストアした場合や全てをリストアした場合はmysqlを再起動が必要
[root@server1 ~]# /etc/init.d/mysql restart

5.mysqldumpの世代管理
mysqldumpで個別バックアップして世代管理したい場合

[root@server1 ~]# vi mysqlbackup.sh
#!/bin/bash
# 認証情報
DBUSER="root";
DBPASSWD="パスワード";
# バックアップ先ディレクトリ /backup/mysql/130524 となる。
BAKDIR="/backup/mysql";
TODAYS_BAKDIR="$BAKDIR/`date +%y%m%d`";
# DB一覧
DATABASES=`mysql -NB -u$DBUSER -p$DBPASSWD -e 'show databases'|egrep -vi 'information_schema|performance_schema'`;
# バックアップ先がなければ作成
[ ! -d $TODAYS_BAKDIR ] && mkdir -p $TODAYS_BAKDIR;
# DB名でループ、ダンプ取得
for DB in $DATABASES; do
mysqldump -u$DBUSER -p$DBPASSWD --opt --events --default-character-set=binary --skip-lock-tables $DB > $TODAYS_BAKDIR/$DB.dump.sql;
done;
# 3 日より古いバックアップは削除
find $BAKDIR -type d -mtime +3 -print0 | xargs -0 rm -rf;

これを毎日1:00に自動実行させる

[root@server1 ~]# echo "15 2 * * * root /root/mysqlbackup.sh" > /etc/cron.d/mysqlbackup