#!/bin/bash # # ============================================================ # # @license This program is free software. # # @category Script for Percona Server # @project Gedow Software # @package Gedow Percona Utils # @author GedowFather http://blog.father.gedow.net/ # @copyright gedow.net All Rights Reserved. # @version v2.2.1 # @since File available since Release 1.0.0 # @depends percona-xtrabackup >= 2.0.3 # @recommended pigz, pbzip2 # # ============================================================= # # Percona Server の Xtrabackup を用いたバックアップスクリプトです。 # # 処理内容は # - (Debianの場合) debian.cnf の退避 # - バックアップの取得 # - 既存バックアップファイルの間引き # # 下記 config を編集 もしくは --help で表示されるオプションを使うことで、 # 設定を上書きして実行することができます。 # # 例) /usr/local/bin/percona_backup.sh \ # -u root -p password \ # -d /var/mysql_backup --file-prefix SERVICENAME # # この場合、指定のディレクトリにサービス名と今日の日付でファイルが作成されます # もしファイル名を完全に指定したい場合は --file-name を利用してください。 # # アーカイブ化の並列処理数指定(xbstreamのみ) # --archive-threads 4 # 最大でも 4 で十分な処理ができます。 # CPUは400%まで利用せず、200%程度までとなります。 # # 圧縮方法の指定 # --compress-type に圧縮コマンドを指定することができます。指定値は gzip, bzip2 ですが、 # それぞれ pigz, pbzip2 コマンドが存在する場合は並列圧縮を実行します。 # 並列数を指定しない場合は自動的に1スレッド残した最大数になります。 # # ex) --compress-type gzip --compress-threads 10 # --compress-type bzip2 --compress-threads 10 # # 圧縮CPUはスレッド数 * 100% が稼働すると仮定して指定してください。 # 基本的に多ければ多いほど処理時間が短くなります。 # PATH=/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin DATE_FORMAT="+%Y-%m-%d %H:%M:%S" ########################################################### # # 設定 # # # 定数 # MYSQL_USER=root # MySQL接続用ユーザ MYSQL_PASS=password # MySQL接続用パスワード BACKUP_DIR=/var/mysql_backup # バックアップ保存ディレクトリ FILE_PREFIX="xtrabackup" # バックアップファイル名の先頭 FILE_TIMESTAMP=`date "+%Y%m%d_%H%M%S"` # バックアップファイル名の日時 FILE_NAME="" # オプションで直指定か無ければ上記3項目の連結 STREAM_TYPE=xbstream # tar or xbstream ARCHIVE_THREADS=4 # xbstream時のみ、--parallel 並列処理数指定 COMPRESS_TYPE="bzip2" # パイプで渡す圧縮コマンド COMPRESS_THREADS= # 並列圧縮コマンドを利用する場合のスレッド数 COMPRESS_TYPES=(gzip bzip2) # 利用可能な圧縮コマンドのリスト COMPRESS_EXTENSIONS=(gz bz2) # 圧縮形式に対応した拡張子のリスト # 上記2配列は必ずセットの値にすること COMPRESS_PARALLELS=(pigz pbzip2) # 対応する圧縮形式で、こちらのコマンドが存在する場合は優先して利用する DEBIAN_CONFIG=/etc/mysql/debian.cnf # DebianのMySQL管理者情報ファイル DEBIAN_DUMMY_NAME=debian.cnf.CSV # バックアップ一式に含ませるためデータディレクトリに入れる時の名前 LATEST_LINK=LATEST # 保存ディレクトリと同階層に置く最新ファイルへのリンク FIND_DELETE_CONDITION="-mtime +3 ! -name '*01_*.gz' ! -name '*15_*.gz'" # find -delete のよる間引き条件。 # 例は3日以上経過だが1日と15日のファイルを除いている # # オプション # exit_usage() { echo "Usage: this.sh [-h|--help] [-u|--user MYSQL_USER] [-p|--pass MYSQL_PASS] " echo " [-d|--backup-dir BACKUP_DIR] [-f|--file-name FILE_NAME] [--file-prefix FILE_PREFIX]" echo " [--stream-type tar|xbstream] [--archive-threads #]" echo " [--compress-type gzip|bzip2] [--compress-threads #]" echo " [--delete-condition FIND_DELETE_CONDITION]" exit 1 } OPTSHORT="hu:p:d:f:" OPTLONG="help,user:,pass:,backup-dir:,file-name:,file-prefix:" OPTLONG+=",stream-type:,archive-threads:,compress-type:,compress-threads:,delete-condition:" GETOPT=`getopt -q -o $OPTSHORT -l $OPTLONG -- "$@"` [ $? != 0 ] && exit_usage eval set -- "$GETOPT" while true do case $1 in -h|--help) exit_usage ;; -u|--user) MYSQL_USER=$2; shift 2;; -p|--pass) MYSQL_PASS=$2; shift 2;; -d|--backup-dir) BACKUP_DIR=$2; shift 2;; -f|--file-name) FILE_NAME=$2; shift 2;; --file-prefix) FILE_PREFIX=$2; shift 2;; --stream-type) STREAM_TYPE=$2; shift 2;; --archive-threads) ARCHIVE_THREADS=$2; shift 2;; --compress-type) COMPRESS_TYPE=$2; shift 2;; --compress-threads) COMPRESS_THREADS=$2; shift 2;; --delete-condition) FIND_DELETE_CONDITION=$2; shift 2;; --) shift; break ;; *) exit_usage ;; esac done # # Validation # # STREAM_TYPE [ "$STREAM_TYPE" != "tar" -a "$STREAM_TYPE" != "xbstream" ] && exit_usage # # 圧縮に利用できる最大CPUスレッド数を自動設定 # - ただしオプション指定されていない場合に限る # - 総スレッド数 から xtrabackupの並列数 と SLAVE用に 1 引いた数値 # - SLAVEは通常2スレッド、Semiで1スレッドだがparallelはMAXまでCPUを使わないので問題ない if [ -z "$COMPRESS_THREADS" ]; then os_threads=`grep ^processor /proc/cpuinfo | wc -l` COMPRESS_THREADS=`expr $os_threads - $ARCHIVE_THREADS - 1` [ $COMPRESS_THREADS -le 0 ] && COMPRESS_THREADS=1 fi # # 圧縮方法の確認と並列処理への切替 # # 配列もどき作成 count=0 for key in ${COMPRESS_TYPES[@]} do eval COMPRESS_EXTENSION_OF_$key=${COMPRESS_EXTENSIONS[$count]} eval COMPRESS_PARALLEL_OF_$key=${COMPRESS_PARALLELS[$count]} count=`expr $count + 1` done # 拡張子の確定 COMPRESS_EXTENSION=`eval echo "\\$COMPRESS_EXTENSION_OF_$COMPRESS_TYPE"` if [ -z "$COMPRESS_EXTENSION" ]; then echo "$COMPRESS_TYPE is invalid command." echo "Check COMPRESS_TYPES value." exit 1 fi # 圧縮コマンドの存在確認 type $COMPRESS_TYPE > /dev/null if [ $? -ne 0 ]; then echo "You need '$COMPRESS_TYPE' command." echo "Retry after installing $COMPRESS_TYPE package." exit 1 fi # 対応する並列圧縮コマンドがあれば切り替える COMPRESS_PARALLEL=`eval echo "\\$COMPRESS_PARALLEL_OF_$COMPRESS_TYPE"` if [ ! -z "$COMPRESS_PARALLEL" ]; then type $COMPRESS_PARALLEL > /dev/null if [ $? -eq 0 ]; then COMPRESS_TYPE="$COMPRESS_PARALLEL -p$COMPRESS_THREADS" echo "COMPRESS_TYPE is changed to $COMPRESS_TYPE." echo fi fi # # 変数 # MYSQL_OPTION="--user=$MYSQL_USER --password=$MYSQL_PASS" FILE_EXTENSION=".$STREAM_TYPE.$COMPRESS_EXTENSION" FILE_NAME=${FILE_NAME:-"$FILE_PREFIX-$FILE_TIMESTAMP$FILE_EXTENSION"} ########################################################## # # 開始表示 # echo `date "$DATE_FORMAT"`" starting backup." ########################################################### # # バックアップ # # # 可動チェック # output=`mysqladmin $MYSQL_OPTION ping 2>&1` result=`echo "$output" | grep alive` if [ $? != 0 ]; then echo "$output" exit 1 fi # # Debian専用my.cnfのコピー # - サーバのシャットダウン時などの管理作業に必要なため # 無理矢理データディレクトリに入れておき、リストア時に取り出して復旧する # if [ -f "$DEBIAN_CONFIG" ]; then query="SHOW GLOBAL VARIABLES like 'datadir';" datadir=`echo "$query" | mysql --skip-column-names $MYSQL_OPTION | awk '{ print $2 }'` dst_file=${datadir}/mysql/${DEBIAN_DUMMY_NAME} cp $DEBIAN_CONFIG $dst_file fi # # バックアップ取得 # save_file=$BACKUP_DIR/$FILE_NAME latest_link=$BACKUP_DIR/$LATEST_LINK mkdir -p -m 0755 $BACKUP_DIR innobackupex --user=$MYSQL_USER --password=$MYSQL_PASS \ --slave-info --stream=$STREAM_TYPE --parallel=$ARCHIVE_THREADS \ $BACKUP_DIR | $COMPRESS_TYPE > $save_file chmod 644 $save_file ln -nfs $save_file $latest_link ########################################################### # # 間引き # find $BACKUP_DIR -type f $FIND_DELETE_CONDITION -delete ########################################################### # # 終了表示 # echo echo `date "$DATE_FORMAT"`" finished backup '$save_file'" echo exit 0