脚本编程

Linux/vps本地七天循环备份和七牛远程备份脚本

Jager · 8月31日 · 2014年 · · · 9915次已读

博客前些时间分享过一次 vps 远程备份到七牛的工具,全傻瓜式交互操作,但也有一个很大的缺憾,那就是不够灵活,在无人干预的情况下,无法完成对多个站点的远程备份设置。

这次博客搬家到 vps 后,张戈花了点时间完善了下,实现了多站点,多数据库的本地七天循环备份和同步备份至七牛云存储的脚本。

Linux/vps本地七天循环备份和七牛远程备份脚本

一、类型说明

①、七天循环备份

受服务器空间制约,我们不可能在 VPS 上每天都备份一份新的网站数据,一是没必要,二是占空间。我们折中一下,采用星期命名,每次备份将覆盖上星期同一天的文件。从而只备份 7 份数据,不至于占用特别大的空间。

如果,你的 vps 很小家子气或是网站数据太庞大,那还可以再折中一下,仅在星期二、四、六做备份,即总共三份数据。甚至还可以选一个星期的某一天做备份,即一周备份一次,也是可以的。

在空间允许的情况下,个人推荐做 7 天循环备份,在 vps 数据全部丢失的时候,能最大程度的容灾,恢复到丢失前一天,甚至是当天凌晨备份的所有数据,非常完美!

②、七牛远程备份

七牛远程备份就是将本地的 7 天备份的数据每天同步至七牛云存储私人空间,就算整台 vps 奔溃时,还能从容的恢复数据。相当于双保险,要知道七牛和你的 vps 同时宕机的几率是非常小的。

二、准备工作

①、整理 vps 已有网站对应的数据库用户名和密码(如不清楚可直接用 mysql 的 root 帐号);

②、整理 vps 已有网站的根目录所在路径,比如 /home/wwwroot/zhang.ge

③、想好本地想要存放备份文件的路径,比如/home/wwwbackup

④、还没有七牛帐号的,点此注册一个,然后新建一个私人空间(为了数据安全,请勿使用公开空间,仅恢复数据时临时切换到公开状态即可),记录空间名以及帐号密钥:

Linux/vps本地七天循环备份和七牛远程备份脚本

Linux/vps本地七天循环备份和七牛远程备份脚本

三、本地七天备份

①、登录 VPS 编写脚本

脚本代码如下:

#!/bin/bash
#Author:ZhangGe
#Des:Backup database and webfile.
#Date:2014-8-28
TODAY=`date +%u`
if [ -z $1 ];then
        echo Needed Usage arguments. Please Use --help to get more infomation.
        exit 1
fi

test -f /etc/profile && . /etc/profile >/dev/null 2>&1
zip --version >/dev/null || yum install -y zip
ZIP=$(which zip)
MYSQLDUMP=$(which mysqldump)

if [ "$1" == "db" ];then
        domain=$2
        dbname=$3
        mysqluser=$4
        mysqlpd=$5
        back_path=$6
        test -d $back_path || (mkdir -p $back_path || echo "$back_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
        cd $back_path
        $MYSQLDUMP -u$mysqluser -p$mysqlpd $dbname --skip-lock-tables>$back_path/$domain\_db_$TODAY\.sql
        test -f $back_path/$domain\_db_$TODAY\.sql || (echo "MysqlDump failed! Please CheckOut Or feedback to zhang.ge..." && exit 2)
        $ZIP -Pmypassword -m $back_path/$domain\_db_$TODAY\.zip $domain\_db_$TODAY\.sql
elif [ "$1" == "file" ];then
        domain=$2
        site_path=$3
        back_path=$4
        test -d $site_path || (echo "$site_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
        test -d $back_path || (mkdir -p $back_path || echo "$back_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
        test -f $back_path/$domain\_$TODAY\.zip && rm -f $back_path/$domain\_$TODAY\.zip
        $ZIP -Pmypassword -9r $back_path/$domain\_$TODAY\.zip $site_path
elif [ "$1" == "--help" ];then
        clear
        echo =====================================Help infomation=========================================
        echo 1. Use For Backup database:
        echo The \$1 must be \[db\]
        echo \$2: \[domain\]
        echo \$3: \[dbname\]
        echo \$4: \[mysqluser\]
        echo \$5: \[mysqlpassword\]
        echo \$6: \[back_path\]
        echo
        echo For example:./backup.sh db zhang.ge zhangge_db zhangge 123456 /home/wwwbackup/zhang.ge
        echo
        echo 2. Use For Backup webfile:
        echo The \$1 must be [\file\]:
        echo \$2: \[domain\]
        echo \$3: \[site_path\]
        echo \$4: \[back_path\]
        echo
        echo For example:./backup.sh file zhang.ge /home/wwwroot/zhang.ge /home/wwwbackup/zhang.ge
        echo =====================================End of Hlep==============================================
        exit 0
else
        echo "Error!Please Usage --help to get help infomation!"
        exit 2
fi

使用说明:

②、将代码中的 2 处 mypassword 改成你自定义的压缩密码(确保数据安全),并保存为 backup.sh 之后,执行 chmod +x backup.sh 赋执行权限。

为了避免复制转码问题,下文已打包分享[点此直达]

Ps:下载的代码包没有加密打包,请自行参考上述代码,自行加上【-P 密码】参数。

③、执行./backup.sh --help 可获得如下帮助说明:

Linux/vps本地七天循环备份和七牛远程备份脚本

④、备份数据库

命令行示例如下:

./backup.sh db zhang.ge zhangge_db zhangge 123456 /home/wwwbackup/zhang.ge

命令参数说明:

参数 1:db,设置备份类型为数据库

参数 2:domain 网站域名,如 zhang.ge,用于备份文件命名

参数 3:dbname  要备份的数据库名次,如 zhangge_db

参数 4:mysqluser  mysql 用户名,如不清楚可用 mysql 的 root 帐号

参数 5:mysqlpassword  mysql 密码

参数 6:back_path  备份文件存放路径

⑤ 备份网站文件:

命令行示例:

./backup.sh file zgboke.com /home/wwwroot/zgboke.com /home/wwwbackup/zgboke.com

命令参数说明:

参数 1:file,设置备份类型为网站文件

参数 2:domain 网站域名,如 zgboke.com,同样用于备份文件的命名

参数 3:site_path 网站文件的路径,如/home/wwwroot/zgboke.com

参数 4:back_path 备份文件存放路径

Tips:为了方便后面的七牛同步,建议将备份文件存放到同一个上级目录,然后以网站域名来命名当前目录,比如,同一个 vps 的备份数据,我都放到/home/wwwbackup/,然后以各自的网站域名来命名,zhang.ge 的数据库和文件我都统一存放到/home/wwwbackup/zhang.ge。

最新补充:2014/10/25 日,手动执行命令检查时,发现报如下错误信息:

Access denied for user 'dbuser'@'localhost' to database 'db' when using LOCK TABLES

即提示该用户不具备锁表权限,导致数据导出失败!这种情况一般发生在数据库正在执行某个查询动作,此时普通帐号是无法导出备份的!

解决办法:

方法①、修改上面的备份脚本,找到如下行

mysqldump -u$mysqluser -p$mysqlpd $dbname>$back_path/$domain\_db_$TODAY\.sql

添加--skip-lock-tables 参数即可,即不锁表导出(可能丢失某些正在更新的数据,当然凌晨时候几率很小)。

mysqldump -u$mysqluser -p$mysqlpd $dbname --skip-lock-tables>$back_path/$domain\_db_$TODAY\.sql

方法②、使用 root 帐号执行备份即可:

执行 crontab -e 修改 Linux 计划任务,修改数据库备份计划命令行中的用户名为 mysql 的 root 帐号:

./backup.sh db zhang.ge zhangge_db root rootpasswd /home/wwwbackup/zhang.ge

个人推荐方法②,最大限度的保证了数据备份的完整度!

⑥、建立七天备份的任务计划

I. 先执行 crontab -l 看看命令是否存在,若不存在,请使用  yum -y install vixie-cron crontabs 安装 crond

II. 确认 crond 已存在后,请执行/etc/init.d/crond start 确保启动了 crond 服务,并执行 chkconfig crond on 设置为开机启动。

III. 执行 crontab -e 建立任务计划,如下是我的 vps 的任务计划,请参考添加:

#backup zgboke.com:
0 3 * * * /root/scripts/backup.sh db zgboke.com zgboke zgboke 123456 /home/wwwbackup/zgboke.com >/dev/null 2>&1
5 3 * * * /root/scripts/backup.sh file zgboke.com /home/wwwroot/zgboke.com /home/wwwbackup/zgboke.com >/dev/null 2>&1
#backup zhang.ge:
10 3 * * * /root/scripts/backup.sh db zhang.ge zhangge zhangge 123456 /home/wwwbackup/zhang.ge >/dev/null 2>&1
15 3 * * * /root/scripts/backup.sh file zhang.ge /home/wwwroot/zhang.ge /home/wwwbackup/zhang.ge >/dev/null 2>&1

每个网站 2 行,第一行备份数据库,第二行备份网站文件。

crontab 参数格式为 {分 时 日 月 周 + 命令行}

所以,拿第 2 行来说,就是 每天的凌晨 3 点,执行后面的命令行,最后的>/dev/null 2>&1 表示屏蔽任何日志信息。

注意事项:脚本需要写绝对路径,比如/root/scripts/backup.sh 并且要有执行权限,可以再次执行 chmod +x 来赋权

作完以上步骤之后,你的 VPS 已经实现了本地七天循环备份机制。下面说下同步至七牛的方法。

四、七牛远程备份

远程备份至七牛的原理,在之前的博文已经说明,不清楚的请参考:https://zhang.ge/4221.html

下面说具体做法:

①、下载我整理好的七牛同步工具包(仅提供 64 位):

wget http://static.zhang.ge/diy_tools/QN_Backup_tools.zip

备用下载:

②、将工具包解压:

unzip QN_Backup_tools.zip

解压完成后,会得到一个 tools 文件夹,里面有三个文件,分别为:

qrsync:七牛同步工具仅适合 Linux64 位,其他版本请点此下载相应版本替换此文件

qrsync.conf :通用配置模版

config.sh:配置初始化辅助脚本

③、配置 qrsync 和计划任务

I. 会用 vim 和 crontab -e 的童鞋 可以无视 config.sh,直接使用 vim 编辑 qrsync.conf:
{"src":"/home/wwwbackup","dest":"qiniu:access_key=Your AK&secret_key=Your SK&bucket=bucket_name&threshold=512000","deletable":0,"debug_level":1}

修改代码中的 /home/wwwbackup 、Your AK 、Your SK、bucket_name 三个参数即可。

/home/wwwbackup 表示要同步到七牛的目录,即上文七天备份的文件存放路径

Your AK:你的七牛帐号 Access_key

your SK:你的七牛帐号的Secret_key

bucket_name:准备存放备份文件的七牛私人空间名字

改完后,执行 crontab -e 添加如下计划任务:

#Add by QN_backup Scripts
0 4 * * * /root/tools/qrsync /root/tools/qrsync.conf >/dev/null 2>&1 &

Ps:代码表示每天凌晨 4 点同步至七牛,记得要修改 qrsync 和 qrsync.conf 的实际路径。

II. 不熟悉 vim 和 crontab 的同学,可如下执行我写好的初始化脚本:config.sh
[root@Mars_Server tools]# sh config.sh
Please input the access_key:   输入七牛 access_key 密钥
Please input the secret_key:   输入七牛 secret_key 密钥
Please input the bucket name:  输入七牛私人空间名称
Please input the backup path:  输入本地七天循环备份存放路径,比如/home/wwwbackup
#回车后将开始初始化配置,出现如下类似信息则成功:
echo =========================The crontab list===============================
...
...
#Add by QN_backup Scripts
0 4 * * * /root/tools/qrsync /root/tools/qrsync.conf >/dev/null 2>&1 &
echo =========================The crontab list===============================
configure Success!

完成以上所有步骤之后,你的 vps 就实现了本地七天循环备份和七牛远程备份了!

五、附加说明

①、注意事项

I. 考虑到脚本适用性,压缩时会包含文件的绝对路径,而解压时也将恢复原来的绝对路径。

比如,解压 zhang.ge_7.zip,所有文件将带上备份前的路径:/home/wwwroot/zhang.ge/

看得懂脚本、又不想带路径压缩的同学,可以自行修改下,让脚本只压缩网站目录。

比如,将脚本第 29 行修改如下即可实现:

cd $site_path && cd ..
zip --version >/dev/null && zip -9r $back_path/$domain\_$TODAY\.zip $domain

注意网站目录名必须和输入的 domain 一致!看不懂脚本的,不建议修改,带了绝对路径也不影响后期手动恢复!

II. 备份文件会带有脚本执行者的权限,比如备份脚本是以 root 身份执行,那么这个压缩包解压后的文件的所有者和权限都是 root,那么在恢复网站数据时,必须使用 chmod 恢复权限到当前的 web 使用者,比如 lnmp 一件安装的环境,web 的使用者是 www,那么解压缩备份文件后,记得执行:chown -R www:www /网站路径  恢复所有者权限,否则打开网站可能出现空白页!

②、贴上我的 vps 计划任务截图,供参考:

Linux/vps本地七天循环备份和七牛远程备份脚本

③、本地备份截图:

Linux/vps本地七天循环备份和七牛远程备份脚本

Ps:文件中的数据表示星期几,带 db 的表示数据库,没带的表示网站文件,每个网站最终将有 14 份文件(7 个数据库备份,7 个网站文件备份)。

④、七牛备份截图:

Linux/vps本地七天循环备份和七牛远程备份脚本

 

Linux/vps本地七天循环备份和七牛远程备份脚本

和本地数据保持一致,七牛同步工具还有一个优点,通过哈希值判断文件是否有更新,而不重复同步相同文件,所以每天的七牛同步其实只会同步当天生成的备份包。

六、展望

本文到此就要告一段落了,仔细想想可以发现,还是存在一定的改善空间。

比如,还可以加上网站恢复机制。同步一些帐号等配置数据到七牛,当 vps 完全奔溃,数据无法找回时,可直接通过脚本等工具从七牛下载数据,然后按照写好的配置数据,自动将数据恢复到指定日期。完全无需过多的人工干预。想想都觉得很强大,是不?

如果有一套全自动恢复机制,不但可以在 vps 完全奔溃时快速恢复,还可以用于全自动网站搬家,有没有感觉像最近推出的的多备份服务?

其实,要实现也非常简单,多写一个脚本就可以实现,只是考虑到实用性、环境兼容性等因素,暂时就不花精力去实现了。

2016 年 12 月 16 日更新:博客目前已分享阿里云主机从内网备份到 OSS 方案【点此前往】。

45 条回应
  1. PHP二次开发 2014-8-31 · 22:05

    一直是手工备份的来着。

    • avatar
      Jager 2014-8-31 · 22:08

      看了就没想过用一下?真的很方便

      • PHP二次开发 2014-8-31 · 22:13

        有时间再说吧,我现在更新博文都是勉强保证。

        • avatar
          Jager 2014-8-31 · 22:14

          嗯,正事要紧

  2. 纺织机厂 2014-9-1 · 16:01

    小白表示看了,更晕了

    • avatar
      Jager 2014-9-1 · 20:46

  3. 灰常记忆 2014-9-1 · 23:54

    折腾不起,也没那个资金整VPS~

    • avatar
      Jager 2014-9-2 · 0:03

      我这VPS一年才280.

      • 有梦网 2015-3-29 · 1:39

        怎么便宜?求介绍啊

  4. 梦轩丽人 2014-9-2 · 0:05

    还在用虚拟主机88元/年的路过,等有条件用上VPS的时候再来学习

  5. musk 2014-9-2 · 5:13

    提示上传失败怎么版

    • avatar
      Jager 2014-9-2 · 8:51

      七牛的同步工具么?两种可能原因,1是防火墙没堵住吧?2是那个同步配置可能写错了

      • musk 2014-9-2 · 17:00

        嗯 同步配置了

  6. 微历史 2014-9-2 · 8:04

    我准备将图片放到七牛

  7. 站长技术流啊 简单的说用了七牛是不是网站访问明显加快了

  8. 微信大学 2015-2-9 · 18:12

    太强大了. 亲测可用,感谢张哥的技术分享! :wink:

    • avatar
      Jager 2015-2-9 · 18:13

      看来你的linux知识已经有了不小的进步

      • 微信大学 2015-2-10 · 18:21

        用这个备份 nginx配置文件,php配置文件也不错唉.

  9. jalena 2015-3-8 · 21:13

    搞的好复杂哦!!

    • avatar
      Jager 2015-3-8 · 21:33

      高手啊,见笑了~咱也就是抛砖引玉。

  10. serm 2015-10-9 · 11:53

    可以备份云数据库吗,数据库不在本地

  11. 找牛网 2015-12-22 · 16:59

    很GOOD,这个脚本解决了我的大问题,本来想自己弄一个,有现成的,并且可能比我的更好。多谢。

  12. 操他妈 2016-3-25 · 17:31

    看不太懂
    大牛我只想将生成的图片自动同步到七牛,如何弄呢?采集的图片一旦有直接同步到七牛,不用自己执行

  13. 深蓝 2016-4-18 · 13:53

    不服不行!脚本小弟也能写的出来,并且已经在用了,不过像博主这样洋洋洒洒写一篇精彩的博文我就万万不行了!
    赞一个!

  14. 小鱼 2016-4-26 · 11:36

    戈哥,我想问下设定的晚上自动备份数据库为什么总是空文件,里面什么内容都没有。但是直接执行 ./backup.sh db zhang.ge zhangge_db root rootpasswd /home/wwwbackup/zhang.ge 又可以成功备份出来,这是为什么呢?用的root账号密码。
    还有直接执行的时候会提示 Warning: Using a password on the command line interface can be insecure.
    备份网站数据没有问题。
    谢谢戈哥

    • avatar
      Jager 2016-4-26 · 13:17

      是不是密码里面有百分号?如果有百分号,放到crontab中就得弄2个%才可以。 比如密码是 123% 那么写到crontab就是
      123%%
      那个提示忽略,就是告诉你不要在命令里面带入密码。

      • 小鱼 2016-4-26 · 13:58

        没有百分号。只有大小写字母和数字。不知道是哪里出了问题。Centos 6.5 64位系统

        • 野人摊影视分享 2017-2-16 · 16:59

          我跟你的情况是一样的,单纯的执行命令可以备份出完整的数据文件,但是用了定时去备份文件,压缩包里面是空白,望Jager大神能修复下,数据库密码也没有百分号,只有大小写字母和数字,用的是root账号去备份,Jager大哥若是看到了,麻烦修复下这个问题!谢谢!

  15. 小丢丢 2016-5-18 · 10:41

    嗨.请教个问题
    当vps上数据库比较多的时候,比如有5个.
    那么
    ./backup.sh db zhang.ge zhangge_db zhangge 123456 /home/wwwbackup/zhang.ge
    这行命令,要写5条吗?

    问题2:
    哪个地方实现了 ,7天自动循环. backup.sh 中没有看到删除7天以前的旧文件操作.
    恕在下笨拙. 谢谢指导.

    • avatar
      Jager 2016-5-18 · 13:09

      1、是要写5条,脚本是分开备份的,也是为了方便单个恢复。
      2、7天备份的原理是一个星期为一个周期,周一备份的时候会自动覆盖上周一的备份文件,因为名称都一样

      • 小丢丢 2016-5-18 · 13:22

        了解了 谢谢博主.

  16. xxxky 2016-7-28 · 20:14

    期待站长来一篇关于家用Windows系统定时远程下载VPS上的数据, 本地Windows电脑是24小时开机的。没有固定IP

    • avatar
      Jager 2016-7-28 · 21:57

      这个简单吧,批处理配合wget.exe,用windows的任务计划就能实现了。

      • xxxky 2016-7-29 · 9:42

        不懂 :razz:
        请问你那边有相关的教程吗 ?

        • avatar
          Jager 2016-7-29 · 16:48

          没有,靠你自己百度搜索windows计划任务以及wget.exe用法

          • xxxky 2016-7-29 · 18:02

            恩 恩好, 谢谢!

  17. mrjucn 2016-10-12 · 3:13

    看着头大。还是手动备份到七牛,人笨没办法。linux刚学会几个命令。就不折腾了。

  18. boke112导航 2016-10-14 · 9:07

    不知道这个是否适用于阿里云的ECS服务器?我也想实现同步到七牛云空间或百度云盘或360云盘之类的,感觉这样比较安全

    • avatar
      Jager 2016-10-14 · 20:34

      Linux系统都可以使用

  19. boke112导航 2016-10-23 · 10:30

    后面七牛同步的那个搞不定,wget https://static.zhang.ge/diy_tools/QN_Backup_tools.zip 显示错误,下载不了。

    • avatar
      Jager 2016-10-23 · 10:59

      文章中不是有备用下载吗?再说,还有最新的备份方式:https://zhang.ge/5111.html

      • boke112导航 2016-10-24 · 8:51

        最新那个OSS对象存储好像要花钱购买的,目前根据这篇文章已经成功实现自动备份,就是从备用下载得到的文件上传到服务器后进行修改,上传到七牛的步骤没有成功。等过段时间再折腾OSS试试。

        • avatar
          Jager 2016-10-24 · 9:28

          OSS 一年应该只要几块钱。。。而且内网流量不花钱。备份到七牛走服务器公网,上传的时候网站会卡出翔。

  20. 伊万家 2017-12-6 · 21:23

    博客的文章都是精品,第一次看到,就收藏了,这两天一直在浏览。有两个问题问下:
    1、看到博主的文章排版很漂亮,比如标题、引用什么的,想问下使用自带的编辑器排版的么,还是怎么自己源代码写的?
    2、今天按照本篇文章做备份,自己准备在自己网站记录做下备忘,看到博主有写未经允许禁止任何转载,问下我这样的可以么,附链接:http://www.ewwe.net/p/166.html,如不合适,请告知,删除。最后很感谢博主无私的分享。

  21. more 2018-8-16 · 10:20

    "注意网站目录名必须和输入的 domain 一致",如果不一致不就用不了?假设网站目录的绝对地址是 "/data/www/domain" 备份压缩的时候想 压缩成www.domain.com_7.zip 是不是要改成这样?

    zip --version >/dev/null && zip -Ppassowrd -9r $back_path/$domain\_$TODAY\.zip $site_path