#!/bin/sh
#xtrabackup备份脚本
#获取脚本所存放目录
cd `dirname $0`
bash_path=`pwd`
#脚本名
me=$(basename $0)
#定义变量
LOG=/var/log/mysql_backup.log
DATE=$(date +%F)
DATE1=$(date +%H)
LASTDATE=$(date -d "yesterday" +%F)
MYCONF="/etc/my.cnf"
PASSWD=$(cat /data/save/mysql_root)
BACK_FILE_DIR="/data/backups/database"
EMAIL=("yunwei@xxx.com")
BACK_SERVER="172.16.1.12"
BACK_SERVER_DIR="/home/mysqlbackup"
ssh_port="22"
ssh_parameters="-o StrictHostKeyChecking=no -o ConnectTimeout=60"
ssh_command="ssh ${ssh_parameters} -p ${ssh_port}"
scp_command="scp ${ssh_parameters} -P ${ssh_port}"
#定义保存日志函数
function save_log () {
echo -e "[`date +%F\ %T`] $*" >> $LOG
}
#定义发送邮件函数
function send_mail () {
echo "$*" |mail -s "[mysql `date +%F\ %T` ]" ${EMAIL[@]}
}
save_log "start $0"
#定义数据库多实例对应的socket,备份的文件夹名称,对应的端口,主机名,对应的mysqldgroup
case $1 in
trade)
SOCKET=/tmp/mysql_3306.sock
FILENAME=trade
PORT=3306
HOST=S-C9
MYSQLD_GROUP=mysqld1
;;
product)
SOCKET=/tmp/mysql_3307.sock
FILENAME=product
PORT=3307
HOST=S-C9
MYSQLD_GROUP=mysqld2
;;
user)
SOCKET=/tmp/mysql_3308.sock
FILENAME=user
PORT=3308
HOST=S-C9
MYSQLD_GROUP=mysqld3
;;
bbs)
SOCKET=/tmp/mysql_3306.sock
FILENAME=bbs
PORT=3306
HOST=S-C11
MYSQLD_GROUP=mysqld1
;;
excess)
SOCKET=/tmp/mysql_3307.sock
FILENAME=excess
PORT=3307
HOST=S-C11
MYSQLD_GROUP=mysqld2
;;
sc)
SOCKET=/tmp/mysql_3308.sock
FILENAME=sc
PORT=3308
HOST=S-C11
MYSQLD_GROUP=mysqld3
;;
cms)
SOCKET=/tmp/mysql_3306.sock
FILENAME=cms
PORT=3306
HOST=S-C12
MYSQLD_GROUP=mysqld1
;;
act)
SOCKET=/tmp/mysql_3307.sock
FILENAME=act
PORT=3307
HOST=S-C12
MYSQLD_GROUP=mysqld2
;;
market)
SOCKET=/tmp/mysql_3308.sock
FILENAME=market
PORT=3308
HOST=S-C12
MYSQLD_GROUP=mysqld3
;;
esac
#}
#创建目录
[ ! -d "${BACK_FILE_DIR}/${FILENAME}/${DATE}" ] && mkdir -p ${BACK_FILE_DIR}/${FILENAME}/${DATE}
function xtrabackup_backup () {
NEW_DIR=$(ls -l ${BACK_FILE_DIR}/${FILENAME}/${DATE} | tail -n 1 | awk '{print $9}')
LASTNEW_DIR=$(ls -l ${BACK_FILE_DIR}/${FILENAME}/${LASTDATE} | tail -n 1 | awk '{print $9}')
#备份失败操作
function backup_failed_operation () {
NEW_DIR1=$(ls -l ${BACK_FILE_DIR}/${FILENAME}/${DATE} | tail -n 1 | awk '{print $9}')
LASTNEW_DIR1=$(ls -l $${BACK_FILE_DIR}/${FILENAME}/${LASTDATE} | tail -n 1 | awk '{print $9}')
#备份失败发送邮件
if [ $DATE1 -eq 03 ] ;then
save_log "${FILENAME} full-backup failed"
send_mail "
Server:${HOST}
Port:${PORT}
DB:${FILENAME}
PATH:${BACK_FILE_DIR}/${FILENAME}/${DATE}/
full-backup-failed"
else
save_log "${FILENAME} incremental-backup failed"
send_mail "
Server:${HOST}
Port:${PORT}
DB:${FILENAME}
PATH:${BACK_FILE_DIR}/${FILENAME}/${DATE}/
incremental-backup-failed"
fi
#删除昨天备份备份文件夹里面备份失败的文件夹
if [ $DATE1 -ge 00 ] && [ $DATE1 -le 02 ] ;then
rm -rf ${BACK_FILE_DIR}/${FILENAME}/${LASTDATE}/$LASTNEW_DIR1
#删除今天备份备份文件夹里面备份失败的文件夹
else
rm -rf ${BACK_FILE_DIR}/${FILENAME}/${DATE}/$NEW_DIR1
fi
exit 1
}
#增量备份
if [ $DATE1 -ge 04 ] && [ $DATE1 -le 23 ] ;then
innobackupex --defaults-file=${MYCONF} --user=root --password=${PASSWD} --defaults-group=${MYSQLD_GROUP} --socket=${SOCKET} --incremental-basedir=${BACK_FILE_DIR}/${FILENAME}/${DATE}/$NEW_DIR --incremental ${BACK_FILE_DIR}/${FILENAME}/${DATE}
[ $? -eq 0 ] && save_log "${FILENAME} incremental-backup successed" || backup_failed_operation
elif [ $DATE1 -ge 00 ] && [ $DATE1 -le 02 ] ;then
innobackupex --defaults-file=${MYCONF} --user=root --password=${PASSWD} --defaults-group=${MYSQLD_GROUP} --socket=${SOCKET} --incremental-basedir=${BACK_FILE_DIR}/${FILENAME}/${LASTDATE}/$LASTNEW_DIR --incremental ${BACK_FILE_DIR}/${FILENAME}/${LASTDATE}
[ $? -eq 0 ] && save_log "${FILENAME} incremental-backup successed" || backup_failed_operation
else
#全量备份
innobackupex --defaults-file=${MYCONF} --user=root --password=${PASSWD} --defaults-group=${MYSQLD_GROUP} --socket=${SOCKET} ${BACK_FILE_DIR}/${FILENAME}/${DATE}
[ $? -eq 0 ] && save_log "${FILENAME} full-backup successed" || backup_failed_operation
#压缩打包
cd ${BACK_FILE_DIR}/${FILENAME}/
tar -zcvf $LASTDATE.tgz $LASTDATE
#在远程服务器创建文件夹
$ssh_command root@${BACK_SERVER} "mkdir -p ${BACK_SERVER_DIR}/${FILENAME}/"
#在远程服务器删除30天之前的文件
$ssh_command root@${BACK_SERVER} "find ${BACK_SERVER_DIR}/${FILENAME}/ -mtime +30 -type f -exec rm -rf {} \;"
#传输到远程服务器备份
rsync -avz -e "${ssh_command}" ${BACK_FILE_DIR}/${FILENAME}/$LASTDATE.tgz root@${BACK_SERVER}:${BACK_SERVER_DIR}/${FILENAME}/
[ $? -eq 0 ] && save_log "${FILENAME} rsync successed" && rm -rf ${BACK_FILE_DIR}/${FILENAME}/${LASTDATE}* || { save_log "${FILENAME} rsync failed" ; send_mail "
Server:${HOST}
Port:${PORT}
DB:${FILENAME}
PATH:${BACK_FILE_DIR}/${FILENAME}/
rsync-failed" ; }
fi
}
xtrabackup_backup
save_log "finish $0\n"
xtrabackup 增量,全量备数据库脚本
最新推荐文章于 2024-06-13 17:08:14 发布