タグ別アーカイブ: バックアップ

Mysqlとディレクトリのバックアップ方法

サーバーを構築して安心しきっていると危ない目に合う可能性が高い。

攻撃とかもそうだと思うけど、もっと基本的な事でバックアップをとってなかったら、費やしていきた時間が消えてなくなる可能性だってある。

だからバックアップはこまめにとりましょう。

と言うことで、CENTOSでのバックアップ方法です。

これも、他のサイト様から引用です。

http://centossrv.com/mysql-backup.shtmlさんからの引用でバックアップ用のスクリプトを作ります。

[root@centos ~]# vi mysql-backup.sh ← MySQLデータベースバックアップスクリプト作成
#!/bin/bash

PATH=/usr/local/sbin:/usr/bin:/bin

# バックアップ先ディレクトリ
BACKDIR=/backup/mysql

# MySQLrootパスワード
ROOTPASS=xxxxxxxx

# バックアップ先ディレクトリ再作成
rm  -rf $BACKDIR
mkdir -p $BACKDIR

# データベース名取得
DBLIST=`ls -p /var/lib/mysql | grep / | tr -d /`

# データベースごとにバックアップ
for dbname in $DBLIST
do
    table_count=`mysql -u root -p$ROOTPASS -B -e "show tables" $dbname|wc -l`
    [ $table_count -ne 0 ] &&
    mysqlhotcopy $dbname -u root -p $ROOTPASS $BACKDIR | logger -t mysqlhotcopy
done

[root@centos ~]# chmod 700 mysql-backup.sh ← rootのみ参照・実行できるようにパーミッション変更

そして、スクリプトを実行してうまくいっているのか確認するのですが、こんなエラーがでました。

[root@centos ~]# ./mysql-backup.sh
DBD::mysql::db do failed: SELECT,LOCK TABL command denied to user ‘root’@'localhost’ for table ‘cond_instances’ at /usr/bin/mysqlhotcopy line 489.

この場合は、下記の内容を追記して解決できます。

# データベースごとにバックアップ
for dbname in $DBLIST
do
[ $dbname = "performance_schema" ] && continue  ←追加
table_count=`mysql -u root -p$ROOTPASS -B -e “show tables” $dbname|wc -l`
[ $table_count -ne 0 ] &&
mysqlhotcopy $dbname -u root -p $ROOTPASS $BACKDIR | logger -t mysqlhotcopy
done

 mysql-backup.shの中身

上記でMYSQLのバックアップは完了です。

最後に毎日実行されるようにcronに入れいます。

echo "0 5 * * * root /root/mysql-backup.sh" > /etc/cron.d/backup

次はディレクトリのバックアップです。

これもhttp://centossrv.com/backup.shtmlさんからの引用です。

まずはバックアプスクリプトを作ります。

[root@centos ~]# vi backup.sh ← バックアップスクリプト作成
#!/bin/bash

#
# ローカル内でバックアップ
#

LANG=C

#
# 設定開始
#

# バックアップ対象リスト名
# ※バックアップ対象をフルパスで記述したリスト
BACKUPLIST=/root/backuplist
[ ! -s $BACKUPLIST ] && echo "$BACKUPLIST is not found" && error_exit

# バックアップ対象外リスト名
# ※バックアップ対象外をフルパスで記述したリスト
BACKUPNOLIST=/root/backupnolist

# バックアップ先ディレクトリ名
BACKUPDIR=/backup
mkdir -p $BACKUPDIR

# バックアップ保存世代数
# ※当日分を含めた過去分バックアップを保存する世代数
# ※過去分バックアップを保存しない場合は1を指定する
BACKUPGEN=8

# 暗号化・復号化パスフレーズ
# ※指定がないときは暗号化しない
PASS=''

# バックアップログファイル名
BACKUPLOG=/var/log/backup.log

#
# 設定終了
#

# 異常終了処理関数定義
error_exit () {
    rm -f $TMPBACKUPNOLIST
    exit 1
}

# バックアップファイルをバックアップ対象外リストに追加
# ※バックアップ先ファイルをバックアップしないようにする
TMPBACKUPNOLIST=`mktemp`
[ -s $BACKUPNOLIST ] && cat $BACKUPNOLIST > $TMPBACKUPNOLIST
echo "$BACKUPDIR/*backup.tar.bz2" >> $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
code=$?
if [ $code -ne 0 ]; then
    cat $BACKUPLOG | mail -s "BACKUP NG CODE IS $code" root
    rm -f $BACKUPDIR/backup.tar.bz2
    error_exit
fi
echo "`date` backup end" >> $BACKUPLOG

# バックアップ暗号化(暗号化・復号化パスフレーズ指定時のみ)
if [ ! -z $PASS ]; then
    echo "`date` encrypt start" >> $BACKUPLOG
    mkdir -p $HOME/.gnupg
    echo $PASS|gpg --passphrase-fd 0 --batch -c $BACKUPDIR/backup.tar.bz2 > /dev/null 2>&1
	code=$?
	if [ $code -ne 0 ]; then
	    cat $BACKUPLOG | mail -s "BACKUP NG CODE IS $code" root
	    rm -f $BACKUPDIR/backup.tar.bz2*
	    error_exit
	fi
    rm -f $BACKUPDIR/backup.tar.bz2
    echo "`date` encrypt end" >> $BACKUPLOG
fi

# バックアップ保存世代を超えた古いバックアップを削除
if [ $(ls $BACKUPDIR/*backup.tar.bz2*|wc -l) -gt $BACKUPGEN ]; then
    OLDBACKUPCNT=`expr $(ls $BACKUPDIR/*backup.tar.bz2*|wc -l) - $BACKUPGEN`
    for file in `ls -t $BACKUPDIR/*backup.tar.bz2*|tail -n $OLDBACKUPCNT`
    do
        rm -f $file
    done
fi

# バックアップ対象外リスト削除
rm -f $TMPBACKUPNOLIST
 chmod 700 backup.sh
バックアップスクリプト権限付与↑

次にバックアップの対象リストを省くリストを作ります。

今回は下記内容で作成

[root@ ~]# echo "/root" >> backuplist 
[root@ ~]# echo "/etc" >> backuplist
[root@ ~]# echo "/var/www" >> backuplist 
[root@ ~]# echo "/var/lib/gitosis" >> backuplist [root@ ~]# echo "/backup/mysql" >> backuplist

拒否リストは下記で

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

あとは正常に動作するかどうかを確かめます。

 ./backup.sh
で実行する

バックアップが正常にいっている事を確認

ls -lh /backup
tar tjvf /backup/backup.tar.bz2

バックアップした一覧が表示される

そして自動実行するためにcronに登録

echo "0 5 * * * root /root/mysql-backup.sh ; /root/backup.sh" > /etc/cron.d/backup  毎朝5時に実行される