Mysql数据库定时备份到OSS

背景

mysql运行在Docker中,计划每天定时备份数据并存储到阿里云OSS。其中用到了定时任务crontab、云存储管理rclone、shell脚本

部署脚本

# 创建目录
mkdir -p ~/task
cd ~/task
# 创建主备份脚本
touch backup_main.sh
# 创建mysql备份脚本,这个后面要传到运行mysql的docker容器
touch mysql_backup.sh

将一下脚本写入到mysql_backup.sh

#!/bin/bash
backUpFolder=/mnt/backup
databaseName=yourDatabaseName
backFileName="${databaseName}.sql"
password='***'

#创建备份目录
if [ ! -d $backUpFolder ];then
    mkdir -p $backUpFolder
fi
# 进入备份文件夹
cd $backUpFolder

# 导出 dbName 数据库
mysqldump -h 127.0.0.1 -u${username} -p${password} $databaseName > $backFileName

# 压缩导出的数据
tar zcvf $databaseName.tar.gz $backFileName

# 删除文件夹,只保留备份的压缩包
rm -rf $backFileName

将一下脚本写入到backup_main.sh

#!/bin/bash
# 放在宿主机上,将备份的文件拷贝到宿主机并上传到oss
dateNow=`date +%Y_%m_%d_%H%M`
# 这个fileName与mysql_backup.sh中的databaseName保持一直
fileName=yourDatabaseName
newFileName=${fileName}-$dateNow.tar.gz
backupPath=/mnt/data/dbBackup
# 这是rclone中的OSS路径
# yourRcloneConfigName:rclone中的配置名称
# yourBucketName:OSS中的Bucket名改成
# yourBackupPath:要备份到OSS的路径
rclonePath=yourRcloneConfigName:/yourBucketName/yourBackupPath

#创建备份目录
if [ ! -d $backupPath ];then
    mkdir -p $backupPath
fi
/usr/bin/docker exec mysql sh -c 'sh /mnt/mysql_backup.sh' && \
/usr/bin/docker cp mysql:/mnt/backup/${fileName}.tar.gz ${backupPath}
dateNow=`date +%Y_%m_%d_%H%M`
mv ${backupPath}/${fileName}.tar.gz ${backupPath}/${newFileName}
# 
/usr/bin/docker exec rclone sh -c "rclone copy /data/${newFileName} ${rclonePath} && rm -rf ${newFileName}"

将脚本mysql_backup.sh复制到mysql的容器中

docker cp ./mysql_backup.sh mysql:/mnt/

Docker安装Rclone

docker run --restart unless-stopped --name rclone -it \
    --privileged=true \
    --volume /mnt/data/rclone:/config/rclone \
    --volume /mnt/data/dbBackup:/data \
    rclone/rclone \
    config

执行以上指令后会直接进入rclone的配置,根据命令提示和官方文档完成OSS的配置。
然后在宿主机执行sh ~/task/backup_main.sh 然后去OSS检查备份的文件是否已经上传到云端。

添加到定时

crontab -e

输入一下代码

# 每天4点备份数据库
0 4 * * * sh /root/task/backup_main.sh

完成.

posted @ 2023-09-25 11:32  Andyxq  阅读(115)  评论(0编辑  收藏  举报