VPS自动备份到Dropbox

3,643次阅读
没有评论

VPS 自动备份到 Dropbox

如果你是 VPS 用户或者对主机有 Root 权限,可以使用脚本来实现 VPS 备份到 Dropbox 的功能。

本文所讲内容为如何将 VPS 上的文件以及数据库中的内容定时自动备份到 Dropbox 上。

1. 创建 Dropbox 应用

首先,需要创建一个 Dropbox 应用,可以从该网址进行创建:https://www.dropbox.com/developers/apps/create

VPS 自动备份到 Dropbox

在这里,应用类型选择 Dropbox API App,数据存储类型选择 Files and datastores,权限选择 Yes(应用只需要访问它创建的文件)。然后命名创建。

2. 下载并执行 dropbox_uploader.sh

dropbox_uploader 是一个第三方 Dropbox 备份脚本,我们可以从这里获取到:https://raw.github.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh

然后,为该脚本添加执行权限:
# chmod +x dropbox_uploader.sh

执行该脚本:
# ./dropbox_uploader.sh

根据提示输入 Dropbox 应用中的 App key 和 App secret,许可类型选择 a,确认 y, 复制给出的权限验证链接到浏览器 ,确认后回到终端按任意键完成。

VPS 自动备份到 Dropbox

3. 编写备份脚本

编写定时备份脚本,取名为 backup.sh。其代码如下:

#!/bin/bash

# MYSQL 数据库帐号密码
MYSQL_USR="root"  # 数据库帐号
MYSQL_PWD="password"  # 数据库密码

# 定义需要备份的目录
NGINX_CONF_DIR=/usr/local/nginx/conf  # nginx 配置目录
WEB_DIR=/home/wwwroot  # 网站数据存放目录

# 定义备份存放目录
DROPBOX_DIR=/$(date +%Y-%m-%d)  # Dropbox 上的备份目录
LOCAL_BAK_DIR=/home/backup  # 本地备份文件存放目录

# 定义备份文件名称
DBBakName=DB_$(date +%Y%m%d).tar.gz
NginxConfBakName=NginxConf_$(date +%Y%m%d).tar.gz
WebBakName=Web_$(date +%Y%m%d).tar.gz

# 定义旧数据名称
Old_DROPBOX_DIR=/$(date -d -7day +%Y-%m-%d)
OldDBBakName=DB_$(date -d -10day +%Y%m%d).tar.gz
OldNginxConfBakName=NginxConf_$(date -d -10day +%Y%m%d).tar.gz
OldWebBakName=Web_$(date -d -10day +%Y%m%d).tar.gz

cd $LOCAL_BAK_DIR

#使用命令导出 SQL 数据库, 并且按数据库分个压缩
for db in `mysql -u$MYSQL_USR -p$MYSQL_PWD -B -N -e 'SHOW DATABASES' | xargs`; do
    (mysqldump -u$MYSQL_USR -p$MYSQL_PWD ${db} | gzip -9 - > ${db}.sql.gz)
done

#压缩数据库文件合并为一个压缩文件
tar zcf $LOCAL_BAK_DIR/$DBBakName $LOCAL_BAK_DIR/*.sql.gz
rm -rf $LOCAL_BAK_DIR/*.sql.gz

#压缩 Nginx 配置数据
cd $NGINX_CONF_DIR
tar zcf $LOCAL_BAK_DIR/$NginxConfBakName ./*

#压缩网站数据
cd $WEB_DIR
tar zcf $LOCAL_BAK_DIR/$WebBakName ./*

cd /root/bin
#开始上传
./dropbox_uploader.sh upload $LOCAL_BAK_DIR/$DBBakName $DROPBOX_DIR/$DBBakName
./dropbox_uploader.sh upload $LOCAL_BAK_DIR/$NginxConfBakName $DROPBOX_DIR/$NginxConfBakName
./dropbox_uploader.sh upload $LOCAL_BAK_DIR/$WebBakName $DROPBOX_DIR/$WebBakName

#删除旧数据
rm -rf $LOCAL_BAK_DIR/$OldDBBakName $LOCAL_BAK_DIR/$OldNginxConfBakName $LOCAL_BAK_DIR/$OldWebBakName
./dropbox_uploader.sh delete $Old_DROPBOX_DIR/

echo -e "Backup Done!"

其中,用户可以根据自己的需求改编需要备份的目录,以及保留旧数据的时长(比如我这里设置的是 Dropbox 保留 7 天,本地保留 10 天)。

接下来,为这个备份脚本增加执行权限:

# chmod +x backup.sh

4. 添加 crontab

crontab -e 添加:

30 3 * * * /root/bin/backup.sh

这样,就可以每天凌晨 3:30 自动备份到 Dropbox 了。

 
解决自动备份脚本不执行

我是直接在 VPS 上创建.sh 文件的,复制内容进去以后保存,不管用,提示 -bash: ./backup.sh: /bin/bash^M: bad interpreter: No such file or directory
查了一下,出错原因如下:
此文件是在 window 下写的,所以在每行后面会加个 ctrl+ m 就是 ^M,所以后面的 sh 就变成 sh^M 当然是没有这个命令的,所以脚本就不能运行了,把 ^M 去掉就应该没问题了。(觉得可能是自己创建的方法问题,或者说是 linux 为了安全,故意这么设定)

输入命令:dos2unix backup.sh 把它转化成 linux 文件。

会提示 dos2unix: converting file backup.sh to UNIX format …

如果没有 dos2unix 此命令,可用此方法:

cat ./backup.sh | tr -d‘\r’> temp.sh
mv temp.sh backup.sh

本文部分内容转自 Pythoner

正文完
 
VPSWe
版权声明:本站原创文章,由 VPSWe 2015-05-30发表,共计2577字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)