自动备份数据库至 Google Drive

最近的正好腾讯云硬盘故障事件闹得沸沸扬扬,提醒了大家备份的重要性。借此机会,介绍一下本站的备份方案。

本来在 WordPress 上备份数据库还是挺简单的,直接搜一搜插件就好了,但是我数据库里还有其他服务的表(并不推荐这么做。。。),因此选择了定时任务来进行这个操作

环境

我的服务器环境如下,不同的环境可能细节会有不用,但大致思路是一样的:

  • Ubuntu 16.04 LTS x64
  • MySQL 5.7

为了简便,下文的命令默认具有管理员权限而省略 sudo

备份数据库

在命令行中输入

crontab -e

然后在打开的文件末尾加入

1 2 * * * mysqldump -u username -pPassword --all-databases > /path/to/$(date -I).sql

其中1 2 * * *表示在每天的2点01分执行之后的命令,而之后就是备份数据库的命令了。需要注意的是-p参数和之后的密码之间没有空格,而在输出的文件名中调用了date命令,从而可以在指定目录下得到以当前日期命名的文件。

上传至 Google Drive

只有本地备份其实意义并不大,万一服务器一起挂了,备份也会跟着一起凉,因此需要上传至 Google Drive 从而实现多地备份。首先需要下载 Google Drive 的命令行工具

https://github.com/prasmussen/gdrive

在 Readme 中找到对应的地址下载就好了,以我的64位 Linux 为例

    wget https://docs.google.com/uc?id=0B3X9GlR6EmbnQ0FtZmJJUXEyRTA&export=download

移动下载好的文件到 /usr/bin/ 目录下并重命名为gdrive

mv uc\?id\=0B3X9GlR6EmbnQ0FtZmJJUXEyRTA /usr/bin/gdrive

给文件添加执行权限

chmod +X /usr/bin/gdrive

用命令行登录 Google Drive

gdrive about

程序会生成一段 URL 并要求输入一段验证码,把URL粘贴到浏览器中,在打开的页面登录 Google Drive 并把返回的验证码粘贴回命令行就可以了。

在 Google Drive 中新建一个文件夹(比如 backups)用来存放备份文件,虽然命令行也能实现,但直接在网页中操作就好了。

获取刚才新建的文件夹的Id,并复制下来。

gdrive list

Id                                Name    Type ...
1_RcQkQzO4mn8NMjtkEOCqHIOd6QAMRou backups dir  ...

然后再使用crontab -e命令,添加下面的定时任务,crontab的时间需要设置在备份的时间之后,并且路径要和备份存放的路径相同。

11 2 * * * gdrive upload -r "/path/to/$(date -I).sql" -p 1_RcQkQzO4mn8NMjtkEOCqHIOd6QAMRou

保存退出就可以了

总结

写了这么多其实一共只有两条命令

  1. 通过 mysqldump 每天定时备份数据库
  2. 通过 prasmussen/gdrive 每天定时上传备份文件至 Google Drive

自动备份便大功告成了。

这个方法的不足之处是每天都会上传一份新的文件到云盘之中,如果备份文件很大的话很快就会把云盘填满。

目前我还是采用的手动删除,但如果你的数据更新不频繁(比如博客)的话,可以考虑调整备份频率来节省空间。