备份脚本
#!/bin/sh
#on xtrabackup 8.0.14
# 第一次执行时会检查是否有全备,否则先创建一个全库备份
#/app/percona-xtrabackup-2.4.19/bin/xtrabackup --defaults-file=/app/mysql/my.cnf
#-ucgvonline -pcjcgv2019! --socket=/app/mysql/mysql.sock
#-P3306 --backup --all-databases --target-dir=/tmp/tmpcheck
user="root"
pass="xxxx"
port="3361"
MY_CNF="/etc/my5.cnf" #mysql的配置文件
MYSQL_BASE="/var/lib/mysql80_5/bin"
MYSQL="${MYSQL_BASE}/mysql"
MYSQL_ADMIN="${MYSQL_BASE}/mysqladmin"
TMPPATH="/tmp/tmpcheck"
TMPLOG="${TMPPATH}/xtrabackup.$$.log"
BACKUP_DIR=/data/backup # 备份的主目录
Xtrabackup_PATH=xtrabackup #INNOBACKUPEX的命令
Xtrabackup_FULLPATH=/usr/bin/$Xtrabackup_PATH #INNOBACKUPEX的命令路径
#mysql目标服务器以及用户名和密码
MYSQL_CMD=" --defaults-file=${MY_CNF} -S /var/lib/mysql80_5/mysql.sock --user=${user} --password=${pass} --port=${port}"
MYSQL_UP=" --user=${user} --password=${pass} --port=${port} " #mysqladmin的用户名和密码
time=$(date +'%Y%m%d%H%M%S')
FULLBACKUP_IN=$BACKUP_DIR/${port}/
FULLBACKUP_DIR=$BACKUP_DIR/${port}/"$time" # 全库备份的目录
FULLBACKUP_INTERVAL=86400 # 全库备份的间隔周期,时间:秒 ,86400为一日
KEEP_FULLBACKUP=3 # 至少保留几个全库备份
logfiledate=backup_${port}.`date +%Y%m%d%H%M`.txt
#开始时间
STARTED_TIME=`date +%s`
if [ ! -d "${BACKUP_DIR}" ];then
mkdir -pv ${BACKUP_DIR} &> /dev/null
fi
if [ ! -d "${FULLBACKUP_IN}" ];then
mkdir -pv ${FULLBACKUP_IN} &> /dev/null
fi
if [ ! -d "${TMPPATH}" ];then
mkdir -pv ${TMPPATH} &> /dev/null
fi
#############################################################################
# 显示错误并退出
#############################################################################
error()
{
echo "$1" 1>&2
exit 1
}
# 检查执行环境
if [ ! -x "$Xtrabackup_FULLPATH" ]; then
error "$Xtrabackup未安装或未链接到/usr/bin."
fi
if [ ! -d $BACKUP_DIR ]; then
error "备份目标文件夹:$BACKUP_DIR不存在."
fi
#第一句的判断不是很准确,可能造成误判
#第二句的lsof在crontab使用时候没有环境变量,需要写全路径,或者加载环境变量
#mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:3306/) {print "Yes";exit 0}}'`
if ! /usr/sbin/lsof -n -i:${port} &> /dev/null;then
error "MySQL 没有启动运行."
fi
if ! `echo 'exit' | $MYSQL $MYSQL_CMD -s` ; then
error "提供的数据库用户名或密码不正确!"
fi
# 备份的头部信息
echo "----------------------------"
echo
echo "$0: MySQL备份脚本"
echo "开始于: `date +%F' '%T' '%w`"
echo
#新建全备目录
mkdir -p $FULLBACKUP_DIR
#查找最新的完全备份
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -iname "202*" -type d -printf "%P\n" | sort -nr | head -1`
# 查找最近修改的最新备份时间
LATEST_FULL_BACKUP_CREATED_TIME=`stat -c %Y $FULLBACKUP_DIR/$LATEST_FULL_BACKUP`
#如果全备有效进行增量备份否则执行完全备份
echo "*********************************"
echo -e "正在执行全新的完全备份...请稍等..."
echo "*********************************"
$Xtrabackup_FULLPATH ${MYSQL_CMD} --backup --parallel=4 --compress --compress-threads=4 --use-memory=2G --target-dir=$FULLBACKUP_DIR > $TMPLOG 2>&1
#保留一份备份的详细日志
cat $TMPLOG>/data/backup/${port}/$logfiledate
if [ -z "`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`" ] ; then
echo "$INNOBACKUPEX命令执行失败:"; echo
echo -e "---------- $Xtrabackup_PATH错误 ----------"
cat $TMPLOG
rm -f $TMPLOG
#exit 1
fi
THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\\'" ) ; print p[2] }" $TMPLOG`
rm -f $TMPLOG
echo -n "数据库成功备份到:$THISBACKUP"
# 提示应该保留的备份文件起点
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -iname "202*" -type d -printf "%P\n" | sort -nr | head -1`
RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP}
echo "完成于: `date +%F' '%T' '%w`"
exit 0
恢复方法
xtrabackup --prepare --target-dir=/dat/20210813111418
#指定好datadir即可,等恢复执行完后使用此datadir目录启动mysql
xtrabackup --move-back --target-dir=/dat/20210813111418 --datadir=/dat/mysql80/data5
评论