备份脚本
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#!/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 zhangge.net..." && 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 zhangge.net..." && 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 zhangge.net..." && exit 2) test -d $back_path || (mkdir -p $back_path || echo "$back_path not found! Please CheckOut Or feedback to zhangge.net..." && 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 zhangge.net zhangge_db zhangge 123456 /home/wwwbackup/zhangge.net 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 zhangge.net /home/wwwroot/zhangge.net /home/wwwbackup/zhangge.net echo =====================================End of Hlep============================================== exit 0 else echo "Error!Please Usage --help to get help infomation!" exit 2 fi |
使用说明
1、将代码中的 2 处 mypassword 改成你自定义的压缩密码(确保数据安全),并保存为 backup.sh 之后,执行 chmod +x backup.sh 赋执行权限。
2、相关命令如下:
参见 –help
1 2 |
./backup.sh db 文件名 数据库名 数据库用户名 数据库密码 备份路径 ./backup.sh file 文件名 网站路径 备份路径 |
加入计划任务
安装crontab
1 2 3 4 5 |
yum install vixie-cron yum install crontabs /bin/systemctl restart crond.service #启动服务 /bin/systemctl reload crond.service #重新载入配置 /bin/systemctl status crond.service #查看crontab服务状态 |
设为开机启动
为了方便我们可以把crontab设置成开机自启 在 /etc/rc.d/rc.local 脚本中加入
1 |
systemctl start crond.service |
设置计划任务
执行 crontab -e 建立任务计划,如下是我的 vps 的任务计划,请参考添加:
1 2 3 4 |
# backup database 0 3 * * * /root/backup/backup.sh db janotes.com janotes janotes luzhen4ever /root/backup # backup website 5 3 * * * /root/backup/backup.sh file janotes.com /home/wwwroot/www.janotes/com/ /root/backup |
每个网站 2 行,第一行备份数据库,第二行备份网站文件。
crontab 参数格式为 {分 时 日 月 周 + 命令行}
所以,拿第 2 行来说,就是 每天的凌晨 3 点,执行后面的命令行,最后的>/dev/null 2>&1 表示屏蔽任何日志信息。
注意事项:脚本需要写绝对路径,比如/root/scripts/backup.sh 并且要有执行权限,可以再次执行 chmod +x 来赋权
同步到其他VPS
使用rsync命令,并加入到crontab中:
1 2 |
# sync website 15 3 * * * rsync -azP -e "ssh -p port_num" /root/backup/ root@目标服务器:/root/backup/ |
更多ssh免密介绍,请看另一篇文章。
注意事项
1、考虑到脚本适用性,压缩时会包含文件的绝对路径,而解压时也将恢复原来的绝对路径。
比如,解压 zhangge.net_7.zip,所有文件将带上备份前的路径:/home/wwwroot/zhangge.net/
看得懂脚本、又不想带路径压缩的同学,可以自行修改下,让脚本只压缩网站目录。
比如,将脚本第 29 行修改如下即可实现:
1 2 |
cd $site_path && cd .. zip --version >/dev/null && zip -9r $back_path/$domain\_$TODAY\.zip $domain |
注意网站目录名必须和输入的 domain 一致!看不懂脚本的,不建议修改,带了绝对路径也不影响后期手动恢复!
2、备份文件会带有脚本执行者的权限,比如备份脚本是以 root 身份执行,那么这个压缩包解压后的文件的所有者和权限都是 root,那么在恢复网站数据时,必须使用 chmod 恢复权限到当前的 web 使用者,比如 lnmp 一件安装的环境,web 的使用者是 www,那么解压缩备份文件后,记得执行:chown -R www:www /网站路径 恢复所有者权限,否则打开网站可能出现空白页!