3

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

 3 years ago
source link: https://zhang.ge/4336.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

一、类型说明

①、七天循环备份

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

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

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

②、七牛远程备份

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

二、准备工作

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

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

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

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

三、本地七天备份

①、登录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
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 For example:./backup.sh db zhang.ge zhangge_db zhangge 123456 /home/wwwbackup/zhang.ge
echo 2. Use For Backup webfile:
echo The \$1 must be [\file\]:
echo \$2: \[domain\]
echo \$3: \[site_path\]
echo \$4: \[back_path\]
echo For example:./backup.sh file zhang.ge /home/wwwroot/zhang.ge /home/wwwbackup/zhang.ge
echo =====================================End of Hlep==============================================
exit 0
echo "Error!Please Usage --help to get help infomation!"
exit 2

使用说明:

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

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

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

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

④、备份数据库:

命令行示例如下:

./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计划任务截图,供参考:

③、本地备份截图:

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

④、七牛备份截图:

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

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

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

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK