云服务器中通过Docker镜像的方式使用Mysql数据库,数据安全考量定期备份数据库到阿里云OSS中
本文主要实现在阿里云ECS服务器中,通过脚本的方式实现将Docker中的Mysql数据库备份到阿里云OSS中。其他云服务商和其他环境的MySQL也可以使用类似的方式。具体方式不再赘述。
环境和工具
- 阿里云ECS服务器,安装Ubuntu或任何带有定时任务
cron
的Linux操作系统 - 阿里云OSS bucket和相应访问的账户
- 阿里云OSS命令行工具ossutil,可以到这里下载或查看详情
- MySQL镜像
具体步骤
- 进入阿里云OSS(对象存储)控制台,如果没有开通OSS服务可能会提示权限和开通确认。
- 创建bucket/存储桶,输入名字,比如xxxxbackup,记住这个名字以及界面中出现的Endpoint(地域节点),后续会用到。
- 创建一个有API的阿里云子账号,并赋予OSS读写权限。记住该账号的API和Secret,后续会用到。帮助文档
下载OSS命令行工具ossutil到本地系统
- 通过
wget https://gosspublic.alicdn.com/ossutil/1.7.13/ossutil64
下载到本地。这里是64位操作系统,32位可以去下载界面查看对应的下载地址。 - 增加运行权限:
chmod +x ossutil64
- 移动到Path中:
sudo mv ossutil64 /bin/
编写脚本
这里需要注意docker容器的名称,容器中应该有MYSQL用户名和密码的环境变量;示例中使用的是root作为用户名;另外备份临时文件夹也需要提前使用mkdir建好
脚本内容示例:
#!/bin/sh
mysql_dump_path=备份文件临时目录,如/var/dbbackup/
#oss-config
oss_endpoint="阿里云OSS Endpoint"
oss_bucket="阿里云OSS bucket名称"
oss_accesskeyid="子账号AccessKeyId"
oss_accesskeysecret="子账号 AccessKey Secret"
backup_name=`date +%Y%m%d%H%M%S`
cd ${mysql_dump_path}
# 使用 mysqldump 备份整个数据库到临时文件夹中
# 注意docker修改docker镜像名称,这里是some-mysql
docker exec some-mysql sh -c 'mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --all-databases' > ${backup_name}.sql
# 打包/pack
tar zcf ${backup_name}.tar.gz ${backup_name}.sql
rm -f ${backup_name}.sql
# 备份到OSS
ossutil64 cp ${backup_name}.tar.gz oss://${oss_bucket}/mysql/backup/${backup_name}.tar.gz -f -e ${oss_endpoint} -i ${oss_accesskeyid} -k ${oss_accesskeysecret}
rm -f ${backup_name}.tar.gz
echo "备份完成"
将脚本保存至任意一个不错的位置,比如/var/backup/dbbackup.sh
,赋予可执行权限:sudo chmod +x /var/backup/dbbackup.sh
试着运行一下脚本文件sudo /var/backup/dbbackup.sh
,再去oss控制台该bucket下-文件管理处查看是否有备份文件存入。如果一切没有问题,则就可以加入cron了。
加入cron计划任务
注:如果脚本位置和临时备份文件夹位置是当前用户无法直接编辑的,则应使用一下方法,在系统级别运行计划任务;用户级别会因为权限问题出错
使用你喜欢的编辑器打开/etc/crontab
文件,并在文件末尾加上这行:
23 2 * * * root /var/backup/dbbackup.sh
这表示在每天的02:23:00运行我们的备份脚本。
重新启动cron计划任务:sudo service cron reload
在次日2:23分之后检查OSS控制台后台,即可发现整个数据库已经备份到阿里云OSS。
参考
- 使用ossutil定时备份自建mysql数据库到阿里云OSS
- Cron介绍
- docker hub: mysql