利用Shell脚本实现自动备份VPS数据到Dropbox


之前发生过几次VPS宕机的故障,经询问托管商,解释是宿主机硬盘出问题,好在数据都在存储上,没有大碍。但却给自己敲了一个警钟,那就是得自己做好VPS的数据备份,尤其是Blog的目录和数据库。
但是VPS远在美国,手动下载备份文件速度会非常慢,于是我想到了Dropbox,它是目前美国名气最大的免费网络硬盘站点,在经过了一系列的搜索和失败的尝试之后,我终于发现了一个Shell脚本,无需安装任何Dropbox客户端程序,就可以实现自动备份VPS数据到Dropbox的功能。

相关截图如下
执行脚本后的显示:

在Dropbox中成功备份:

以下便是脚本的相关内容:
# vim DropboxBackup.sh

#!/bin/bash
# Settings
DROPBOX_DIR="/Backups" #Dropbox中的文件夹名称
BACKUP_SRC="/blog/rainbow" #需要备份的文件夹路径,可以同时指定多个
BACKUP_DST="/home/rainbow/backup" #用来存放备份的文件夹路径
MYSQL_SERVER="127.0.0.1" #连接本地MySQL
MYSQL_USER="root" #本地MySQL的用户
MYSQL_PASS="123456" #本地MySQL的密码

# Stop editing here
NOW=$(date +"%Y.%m.%d")
DESTFILE="$BACKUP_DST/$NOW.tgz"
LAST=$(date -d "2 months ago" +"%Y.%m.%d") #这里的时间可以根据需要进行修改,如"3 months ago"

# Backup files
ps -e | grep -c mysql
if [ $? -eq 0 ]; then
  echo "Dumping databases..."
  /web/mysql/bin/mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS --all-databases > "$BACKUP_DST/$NOW-Databases.sql" #这里的命令路径可以根据需要进行修改
else
  echo "ERROR. Now exiting..."
  exit 1
fi

if [ $? -eq 0 ]; then
  echo "Packing files..."
  tar -czf "$DESTFILE" $BACKUP_SRC "$BACKUP_DST/$NOW-Databases.sql"
else
  echo "ERROR. Now exiting..."
  exit 1
fi

if [ $? -eq 0 ]; then
  /home/rainbow/dropbox_uploader.sh upload "$DESTFILE" "$DROPBOX_DIR/$NOW.tgz" #这里的脚本路径可以根据需要进行修改
else
  echo "ERROR. Now exiting..."
  exit 1
fi

# Delete old files
if [ $? -eq 0 ]; then
  /home/rainbow/dropbox_uploader.sh delete "$DROPBOX_DIR/$LAST.tgz" #这里的脚本路径可以根据需要进行修改
else
  echo "ERROR. Now exiting..."
  exit 1
fi

if [ $? -eq 0 ]; then
  echo "Cleaning the backups..."
  rm -f "$BACKUP_DST/$NOW-Databases.sql"
  rm -f "$BACKUP_DST/$LAST.tgz"
else
  echo "ERROR. Now exiting..."
  exit 1
fi

# chmod +x DropboxBackup.sh
# crontab -e //设置为每个月执行一次备份,具体时间可以根据需要进行修改

00 02 1 * * /bin/bash  /home/rainbow/DropboxBackup.sh #这里的脚本路径可以根据需要进行修改

下载用于上传文件的dropbox_uploader.sh脚本,由http://www.andreafabrizi.it/?dropbox_uploader提供并维护。
# yum install git
# git clone http://github.com/andreafabrizi/Dropbox-Uploader.git
# cd Dropbox-Uploader
# chmod +x dropbox_uploader.sh
# mv dropbox_uploader.sh /home/rainbow/

初始化脚本,并按照脚本中的提示到对应的Dropbox的网页中创建API,在脚本的交互界面中输入生成的Key
# ./dropbox_uploader.sh

初始化完成以后,便可以立即执行一次DropboxBackup.sh脚本进行备份了
# /home/rainbow/DropboxBackup.sh

  1. #1 by alswl on 2011/12/06 - 20:56

    不错的脚本。
    我在寻找能够增量备份并同步到Dropbox的方案,没找到之前还是在手工备份~

    • #2 by mcsrainbow on 2011/12/06 - 22:50

      这个脚本的精髓是几个Dropbox的API,通过Curl命令来进行调用,你所说的增量备份,把脚本略加修改后肯定也是可以实现的。

  2. #3 by coolmoon on 2012/02/04 - 14:44

    请问有方法删除N天前在dropbox上备份的文件嘛?也就是说,如果每天备份的话,只保留最近N天的备份文件。

    • #4 by mcsrainbow on 2012/02/06 - 15:23

      这个脚本的主要作用是通过Curl调用Dropbox支持的Web API来上传文件,因此功能取决于Dropbox的API,我看了一下,貌似要实现删除操作的话,只有通过安装客户端同步来实现了。

  3. #5 by 崔俊伟 on 2012/03/13 - 20:00

    这是我目前见到的唯一有效的一个版本,很不错。
    你的代码插件是什么?

    • #6 by mcsrainbow on 2012/03/13 - 21:10

      我的代码插件是SyntaxHighlighter。本着对自己也对他人负责的态度,我博客里的文章大多都是经过实践后自己所总结出来的,能够帮助到你,我也很开心。

  4. #7 by 小麻 on 2012/03/16 - 14:35

    [root@localhost home]# ./DropboxBackup.sh
    tar: 从成员名中删除开头的“/”
    > Logging in...grep: /tmp/du_resp_29003: 没有那个文件或目录
    Failed!

    你好请问这个是什么问题?

    • #8 by 小麻 on 2012/03/16 - 15:09

      晕 ,我是放在本地测试的~~结果我放到VPS就好了,估计是国内用此法不能登陆dropbox吧

      • #9 by mcsrainbow on 2012/03/16 - 19:08

        国内登陆Dropbox的确偶尔会有点问题,所以这个脚本对境外VPS非常适用。

    • #10 by mcsrainbow on 2012/03/16 - 19:11

      tar: 从成员名中删除开头的“/”,这个是正常的,因为tar压缩绝对路径的时候都要去掉根目录,也就是“/”。
      至于Failed,应该和你的网络有关。

      • #11 by 小麻 on 2012/03/17 - 01:10

        failed是登陸dropbox失敗了,呵呵~~就是國內用dropbox提供的API接口登陸登陸不了~這個腳本很給力!多謝大哥!

  5. #12 by Harid on 2012/04/15 - 22:18

    非常感谢啊,我只用了你的那个关键函数。

  6. #13 by 杜小白 on 2012/05/09 - 01:12

    你这文章很新!脚本也很好,高效!受用了!
    最后想问一个问题:
    最后一行代码
    find $BACKUP_DST -mtime +31 -delete //这里的时间可以根据需要进行修改
    修改时间是把31换成其它数字么?31是指分钟对吧?

    • #14 by mcsrainbow on 2012/05/09 - 09:55

      指的是天数,+31就代表删除31天以前的备份,可以根据具体情况进行修改的。

  7. #15 by tljiang on 2012/09/15 - 18:41

    脚本失效啦。。。。刚开始用的一个星期都挺好的,13号开始突然用不了了….

    tar: Removing leading `/’ from member names
    > Logging in… OK
    > Loading Home… OK
    > Uploading ‘/home/wwwroot/backup/2012.09.15.tgz’ to ‘DROPBOX/backup/’… Faile

    问题出在最后一步,有没有解决之策?

    • #16 by mcsrainbow on 2012/09/21 - 00:04

      Dropbox已经升级了,现在需要像Google一样创建API,然后根据密钥来登陆。
      在这里找到最新的Shell: http://www.andreafabrizi.it/?dropbox_uploader
      然后按照提示操作就可以了。这个script非常好,并且在持续维护更新。

  8. #17 by remember on 2013/06/06 - 16:00

    楼主,这个脚本现在已经支持删除远端文件和目录了,请完善一下脚本删除旧的备份文件?

    • #18 by mcsrainbow on 2013/06/07 - 12:46

      OK,我已经更新了脚本,支持删除远端的备份文件,同时加了一些上下文的关联判断,避免了备份失败以后本地备份也丢失的情况。

      • #19 by remember on 2013/06/08 - 09:19

        我发现这样每天上传的备份,不会被win8客户端同步到回来,只有第一天的备份被自动同步回来,不知道什么原因.

        • #20 by mcsrainbow on 2013/06/08 - 11:50

          我每天都在用Dropbox同步文件,自动备份是每月一次,也经常手动备份,都没出现过你这种问题,我用的是Windows7。

  9. #21 by DickWu on 2013/07/22 - 19:56

    博主你好~
    我想问一下这个脚本怎么拿来还原。。。

(will not be published)
*