サーバーを構築して安心しきっていると危ない目に合う可能性が高い。
攻撃とかもそうだと思うけど、もっと基本的な事でバックアップをとってなかったら、費やしていきた時間が消えてなくなる可能性だってある。
だからバックアップはこまめにとりましょう。
と言うことで、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時に実行される