サーバーのデータを 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