备份环境:
- 具备docker
- mysql8+(5.7及以下版本更换xtrabackup版本即可,具体版本号查看官网)
- 将云盘挂载到服务器上,可以使用s3协议
#!/bin/bash
# 目录配置部分
HOST_BACKUP_DIR="/root/docker/mysql8/backup/full" # 宿主机备份目录
HOST_LOG_DIR="/root/docker/mysql8/backup/logs" # 宿主机日志目录
HOST_MYSQL_DATA_DIR="/root/docker/mysql8/data" # 宿主机MySQL 数据目录
CLOUD_BACKUP_DIR="/mnt/qn-iptudou-backup" # 云盘备份目录
# mysql连接配置
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="3306"
MYSQL_USER="root"
MYSQL_PWD="12345678"
# docker容器内的目录配置,可以不修改
DATETIME=$(date +'%Y%m%d%H%M%S') # 当前日期
MYSQL_DATA_DIR="/var/lib/mysql" # MySQL 数据目录
BACKUP_DIR="/backup/full" # 备份存储目录
LOG_FILE="$HOST_LOG_DIR/backup-$DATETIME.log" # 日志文件
# 创建备份目录
mkdir -p $HOST_MYSQL_DATA_DIR
mkdir -p $HOST_LOG_DIR
mkdir -p $HOST_BACKUP_DIR
set +e
echo "[$(date +'%F %T')] 开始全量备份" >> $LOG_FILE
# 容器名称
CONTAINER_NAME="pxback-full"
# 检查容器是否存在
echo "[$(date +'%F %T')] 检测容器是否存在" >> $LOG_FILE
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
echo "[$(date +'%F %T')] 容器已存在,执行删除" >> $LOG_FILE
docker rm ${CONTAINER_NAME} >> $LOG_FILE 2>&1
echo "容器已删除." >> $LOG_FILE
fi
set -e
echo "执行备份操作" >> $LOG_FILE
docker run --name pxback-full -v $HOST_MYSQL_DATA_DIR:$MYSQL_DATA_DIR -v $HOST_BACKUP_DIR:$BACKUP_DIR --user root percona/percona-xtrabackup:8.0.34 /bin/bash -c "xtrabackup --backup --datadir=$MYSQL_DATA_DIR --target-dir=$BACKUP_DIR/$DATETIME --host=$MYSQL_HOST --port=$MYSQL_PORT --user=$MYSQL_USER --password=$MYSQL_PWD --compress" >> $LOG_FILE 2>&1
echo "备份文件已生成" >> $LOG_FILE
if [ $? -eq 0 ]; then
cd $HOST_BACKUP_DIR
echo "压缩备份" >> $LOG_FILE
tar -czvf full-$DATETIME.tar.gz $DATETIME >> $LOG_FILE 2>&1
echo "删除原备份" >> $LOG_FILE
rm -rf $HOST_BACKUP_DIR/$DATETIME >> $LOG_FILE 2>&1
echo "[$(date +'%F %T')] 将备份移入云盘" >> $LOG_FILE
echo "复制压缩备份到云盘" >> $LOG_FILE
cp full-$DATETIME.tar.gz $CLOUD_BACKUP_DIR
echo "压缩备份已上传云盘" >> $LOG_FILE
rm -f full-$DATETIME.tar.gz
echo "[$(date +'%F %T')] 删除7天前的备份" >> $LOG_FILE
find $CLOUD_BACKUP_DIR -type f -mtime +7 -exec rm -f {} \;
echo "[$(date +'%F %T')] 全量备份成功" >> $LOG_FILE
else
echo "[$(date +'%F %T')] Full backup failed" >> $LOG_FILE
exit 1
fi
使用linux的定时任务每天凌晨进行备份
crontab -e
进入定时任务编辑
在尾部换行追加定时任务
0 0 * * * sh /root/docker/mysql8/db-backup.sh