本文最后更新于 1094 天前,其中的信息可能已经有所发展或是发生改变。
备份脚本
#!/bin/sh
echo "---------------------------------------------------------------"
echo "备份xxx的数据库,包含mysql、MongoDB"
echo "并上传到阿里云oss,bucket: xxx"
echo "---------------------------------------------------------------"
# 备份文件输出目录
OUTPUT_DIR="/opt/xxx"
# 当天的备份文件存放目录
CURR_BACKUP_DIR="`date +%Y-%m-%d`"
MYSQL_USER="xxx"
MYSQL_PWD="xxx"
MYSQL_DB_NAME="xxx"
MYSQL_CONTAINER_NAME="xxx"
MYSQL_BACKUP_FILE_NAME="mysql-$MYSQL_DB_NAME-backup-`date +%Y-%m-%d-%H-%M-%S`.sql"
MONGODB_CONTAINER_NAME="xxx"
MONGODB_DB_NAME="xxx"
MONGODB_USER="xxx"
MONGODB_PWD="xxx"
# 该目录挂载的,这是容器内的目录,对应宿主机的是$OUTPUT_DIR
MONGODB_OUTPUT_DIR="/data/backup"
echo "ʕ•ﻌ•ʔ 开始备份 `date +%Y-%m-%d-%H-%M-%S`"
cd $OUTPUT_DIR
echo "ʕ•ﻌ•ʔ 先删除当天已存在的备份文件目录,再重新创建"
rm -rf $CURR_BACKUP_DIR && mkdir $CURR_BACKUP_DIR
echo "ʕ•ﻌ•ʔ 导出mysql备份文件"
docker exec -i $MYSQL_CONTAINER_NAME /usr/bin/mysqldump -u$MYSQL_USER -p$MYSQL_PWD $MYSQL_DB_NAME >>$OUTPUT_DIR/$CURR_BACKUP_DIR/$MYSQL_BACKUP_FILE_NAME
echo "ʕ•ﻌ•ʔ 导出MongoDB备份文件"
docker exec -i $MONGODB_CONTAINER_NAME mongodump -h 127.0.0.1:27017 -u $MONGODB_USER -p $MONGODB_PWD -d $MONGODB_DB_NAME -o $MONGODB_OUTPUT_DIR
mv $MONGODB_DB_NAME $CURR_BACKUP_DIR
echo "ʕ•ﻌ•ʔ 压缩打包"
tar -czf $CURR_BACKUP_DIR.tar.gz $CURR_BACKUP_DIR
echo "ʕ•ﻌ•ʔ 上传到oss"
./ossutil64 --config-file ./ossutilconfig cp -f $CURR_BACKUP_DIR.tar.gz oss://xxx
echo "ʕ•ﻌ•ʔ 删除当天的备份文件"
rm -rf $OUTPUT_DIR/$CURR_BACKUP_DIR
rm -rf $CURR_BACKUP_DIR.tar.gz
echo "ʕ•ﻌ•ʔ 完成备份 `date +%Y-%m-%d-%H-%M-%S`"
echo "---------------------------------------------------------------"
- 先准备好oss里的bucket,并配置专用账号,只提供该bucket的权限
- bucket设置只保存7天内的文件,不用脚本去删除
- oss存储类型选择归档型,费用低。正常写入数据,但读取数据需要先解冻(耗时一分钟左右)
- mysql备份文件可以直接输出到宿主机
- MongoDB备份文件不只一个文件,不能直接输出到宿主机。可以输出到一个挂载的数据卷
- 服务器上不保存备份文件,只存到oss里
- 使用crontab每天定时执行,并记录日志:
29 2 * * * sh -c /opt/xxx/db-backup.sh >> /opt/xxx/log.txt
- MongoDB还原备份文件:
mongorestore -h 127.0.0.1:27017 -u xxx -p xxx -d xxx /data/xxx
- mysql还原备份文件:先创建对应数据库,再执行备份文件里的sql脚本
- 最后测试下还原出来的数据是否正确