最近的正好腾讯云硬盘故障事件闹得沸沸扬扬,提醒了大家备份的重要性。借此机会,介绍一下本站的备份方案。
本来在 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
保存退出就可以了
总结
写了这么多其实一共只有两条命令
- 通过
mysqldump
每天定时备份数据库 - 通过 prasmussen/gdrive 每天定时上传备份文件至 Google Drive
自动备份便大功告成了。
这个方法的不足之处是每天都会上传一份新的文件到云盘之中,如果备份文件很大的话很快就会把云盘填满。
目前我还是采用的手动删除,但如果你的数据更新不频繁(比如博客)的话,可以考虑调整备份频率来节省空间。