【Redmine/Mysql】高速バックアップの実現

# 目的
MySQLのバックアップでは、ベンチマーク上Xtrabackupがmysqldumpより高速であるとの情報がある(特にリストアのパフォーマンスが違う)。そのため、mysqldumpを使用せず、Xtrabackupを使用したMySQLのバックアップを試みることとする。
> http://www.submit.ne.jp/1211

私は最近よく使っているredmineがあるので、実例としてredmineのバックアップをする前提でスクリプトを組みました。ですが、他の色んなプロダクトでも応用できるので、参考になれば幸いです。

# 環境
OS:CentOS6.5 (x86_64)
Xtrabackupのrpmパッケージ：
percona-xtrabackup-20-2.0.8-587.rhel6.x86_64
percona-xtrabackup-20-debuginfo-2.0.8-587.rhel6.x86_64

# 注意点
CentOS6.5でyumでxtrabackupをインストールすると、2.1系がインストールされてしまう(以下)。
percona-xtrabackup-21-2.1.9-746.rhel6.x86_64

この環境でinnobackupexを実行しても、以下のログが出てきて、バックアップがうまくいかない。


```
innobackupex: Error: Support for MySQL 5.1 with builtin InnoDB (not the plugin) 
was removed in Percona XtraBackup 2.1. The last version to support MySQL 5.1 
with builtin InnoDB was Percona XtraBackup 2.0.
```

MySQL5.1にXtrabackup2.1を使用せよとのこと。CentOSでyumでMySQLをインストールすると5.1系になる。なので、xtrabackupのバージョンは、2.0系を使用することにしよう。

以下のページからダウンロードできます。
https://www.percona.com/downloads/XtraBackup/LATEST/

# バックアップスクリプト
では、早速バックアップスクリプトを作ろう...と思ったら、Redmineのバックアップスクリプトを作成している人はたくさんいた。以下の方のスクリプトをxtrabackup風に書きかえて使用することにしました。素敵なスクリプトをありがとうございます。

> https://sites.google.com/site/xisite/Home/redmine/redmineno-bakkuappu

```redmine-backup.sh
#!/bin/sh
#
# redmine-backup.sh				ver.x.x.x   yyyy.mm.xx
#
#
#
# Author:
#    hogehoge
# Usage:
#    redmine-backup.sh
#
# Description:
#    XXX XXX XXX XXX
#
# Caution:
#    XXX XXX XXX XXX
#
###############################################################################


# Redmine home
REDMINE_HOME=/usr/share/redmine

# BACKUP Directory
export HOME=/root/Tools
export BACKUP_HOME=${HOME}/backup
export RDBACKUP=${BACKUP_HOME}/redmine
export DBBACKUP=${BACKUP_HOME}/xtrabackup
export EXTRA_BACKUP_HOME=${BACKUP_HOME}/xtrabackup/
export EXTRA_BACKUP_LOG=${HOME}/log/xtrabackup.log

# DATE
TODAY=`date +'%Y'-'%m'-'%d'`

# Output syslog
# $1: syslog priority
# $2: message
function LOG_ {
        /usr/bin/logger -t REDMINE_BACKUP -p user.$1 $2
}
function LOG_ERR {
        LOG_ err "$1"
}
function LOG {
        LOG_ notice "$1"
}

function LS_EXCEPT {
	ls | grep -v tar.gz
}

# stop redmine
function stopRedmine {
        /sbin/service httpd stop >> ${EXTRA_BACKUP_LOG}
        if [ 0 -ne $? ]; then
                LOG_ERR "Could not stop redmine"
                exit 1
        fi
        return $result
}

# start redmine
function startRedmine {
        /sbin/service httpd start >> ${EXTRA_BACKUP_LOG}
        if [ 0 -ne $? ]; then
                LOG_ERR "Could not start redmine"
                exit 1
        fi
        return $result
}

# backup redmine
function backupRedmineDir {
        cd ${REDMINE_HOME}
        tar czf ${RDBACKUP}/redmine_${STARTTIME}.tar.gz .
        result=$?
        if [ 0 -ne $result ]; then
                LOG_ERR "Could not create redmine backup"
                exit 1
        fi
}

# xtrabackup
function xtrabackup {
        cd ${EXTRA_BACKUP_HOME}
        /usr/bin/innobackupex --user root --password hogehoge --slave-info ${EXTRA_BACKUP_HOME} >> ${EXTRA_BACKUP_LOG}
        result=$?
        if [ 0 -ne $result ]; then
                LOG_ERR "Could not backup database"
                exit 1
        fi

	/usr/bin/innobackupex --user root --password hogehoge --apply-log *_* >> ${EXTRA_BACKUP_LOG}
        if [ 0 -ne $result ]; then
                LOG "Could not extra_backup apply-log"
        fi

	LS_EXCEPT | xargs tar czf ${TODAY}.tar.gz *
	LS_EXCEPT | xargs rm -rf
	result=$?
	if [ 0 -ne $result ]; then
		LOG "Could not remove ${TODAY} backup file"
	fi
}

# checkbackup stop file
function checkstopfile {
        STOPFILE=/home/testadmin/tools/stopbackup
        if [ -f ${STOPFILE} ]; then
                LOG "Stop redmine backup. stopfile exist: ${STOPFILE}"
                rm -f ${STOPFILE}
                exit 0
        fi
}

# main
STARTTIME=`date +%Y%m%d_%H%M%S`
LOG "Start Redmine Backup"

# check stop file
checkstopfile

# stop redmine
stopRedmine
backupRedmineDir
xtrabackup
startRedmine

LOG "End Redmine Backup"

```


ディレクトリ構成は環境にあわせてかえてください。あと、バックアップファイルやバックアップログのローテーションはこのスクリプトにはないので、別で作りましょう。

apacheを止めるので、少しの間、redmineにアクセスできません。夜間などの使用していない時間帯に実行されるようcronに登録してみてください。

# 今後の課題
・もう少しスクリプトを修正予定。
・バックアップファイルをrsyncなどで別サーバへ移動させる。