通过自建的 Git 服务器来管理代码后,定时备份数据文件就显得格外重要了。一旦服务器出现故障,上传的代码就没了。 DropBox 是国外非常受信赖的云同步服务,虽然 DropBox 提供的免费空间较小,但用来备份个人代码文件还是足够的。而且 DropBox 提供了完善的 API 接口,可以通过命令行直接上传下载文件,当服务器位于海外时同步速度也十分令人满意。下面介绍如何将服务器中的数据备份至 DropBox 中。
创建 DropBox 应用
首先需要创建一个 DropBox 应用来利用 DropBox 的 API,直接点击该网址创建: https://www.dropbox.com/developers/apps/create 。
创建应用时的一些选项如下:
- Choose an API(应用类型):DropBox API
- Choose the type of access you need(数据访问类型):App folder
- Name your app(应用名称,取一个喜欢的即可):GogsBackup
应用创建后就可以获得 App key
和 App sercet
,保存这两行字符。
获取并设置 DropBox 上传下载脚本
Dropbox-Uploader 是一个第三方的 DropBox 上传下载脚本。首先获取该脚本并为其设置可执行权限:
wget https://raw.githubusercontent.com/tennfy/Dropbox-Uploader/master/dropbox_uploader.sh
chmod +x dropbox_uploader.sh
直接运行该脚本,第一次运行时会连接 DropBox 验证权限。
~/shell/dropbox_uploader.sh
按照提示输入上文中保存的 App key
和 App sercet
,Permission type 选择a
。然后在浏览器中打开给出的连接地址,给予权限。以后运行时就不用再次验证了。
注意 :这个授权的过程只是针对当前登陆 ssh 的用户,并非全局,如果切换用户运行脚本,会提示再次进行授权,因此应提前切换到需要运行该脚本的用户进行授权。其实当前用户的授权信息保存在 ~/.dropbox_uploader
文件中,因此切换用户后会提示首次运行需要进行授权。
备份脚本
#!/bin/bash
# 指定dropbox_uploader.sh脚本的保存目录
SCRIPT_DIR="/root/backup"
# 上传到DropBox的文件夹
DROPBOX_DIR="/backup/$(date +"%Y.%m.%d")"
# 需要保存的服务器文件夹,可以用空格隔开多个文件夹
BACKUP_SRC="/data/wwwroot"
# 服务器上临时的备份保存文件夹
LOCAL_BAK_DIR="/root/backup"
# MySQL相应配置
MYSQL_SERVER="localhost"
MYSQL_USER="root"
MYSQL_PASS="password"
# 数据备份压缩后的文件名称
DBBakName=Data_$(date +"%Y%m%d").tar.gz
WebBakName=Web_$(date +"%Y%m%d").tar.gz
# 已过期备份数据的名称(3天前的数据会被删除)
Old_DROPBOX_DIR="/backup/$(date -d -3day +"%Y.%m.%d")"
OldDBBakName=Data_$(date -d -3day +"%Y%m%d").tar.gz
OldWebBakName=Web_$(date -d -3day +"%Y%m%d").tar.gz
# 导出MySQL数据库备份(所有数据库),并压缩为指定文件名
mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS --events --all-databases > $LOCAL_BAK_DIR/Database.sql
tar zcvf $LOCAL_BAK_DIR/$DBBakName $LOCAL_BAK_DIR/Database.sql
rm -rf $LOCAL_BAK_DIR/Database.sql
# 压缩需要保存的文件夹为指定文件名
tar zcvf $LOCAL_BAK_DIR/$WebBakName $BACKUP_SRC
# 上传压缩后的备份文件到指定的DropBox目录
$SCRIPT_DIR/dropbox_uploader.sh upload $LOCAL_BAK_DIR/$DBBakName $DROPBOX_DIR/$DBBakName
$SCRIPT_DIR/dropbox_uploader.sh upload $LOCAL_BAK_DIR/$WebBakName $DROPBOX_DIR/$WebBakName
echo -e "upload done!"
# 上传完成后删除服务器上及DropBox中已经过期的备份数据,节省空间
rm -rf $LOCAL_BAK_DIR/$OldDBBakName $LOCAL_BAK_DIR/$OldWebBakName
$SCRIPT_DIR/dropbox_uploader.sh delete $Old_DROPBOX_DIR/
echo -e "delete old backup done"
数据库备份无效请设置 mysqldump 为绝对路径
设置备份脚本定时运行
通过 cron 程序可以设定程序定时运行。需要注意的是 cron 运行是分用户的,某个用户设定的定时任务运行时会以该用户的权限运行。因此要注意上文中提到的 dropbox_uploader 运行用户的问题。
su root # 切换到合适用户执行定时任务
crontab -e
编辑定时任务
crontab -e
0 3 * * * /bin/bash /root/shell/backup.sh
以上命令表示每天早上 3:00 执行命令 /bin/bash /root/shell/backup.sh
。
如果没有设置服务器时区或者不知道服务器时间,可以通过命令 date
来查看服务器的当前时间。
设置完成后,重启 cron 服务:
service cron restart
然后,定时任务就会自动执行了。