backup2mail.sh 服务器内容自动压缩分卷成附件大小发送到邮箱备份

2017年12月7日 1296点热度

概述

039c280ff790f5ba515130334672ed98_24bc2a7a-bcf4-4301-9b5c-6ac60d92a95c

 
本脚本目的是>将vps网站内容(文件夹和数据库)分割成指定附件大小发送邮件到邮箱作为备份
国内QQ和163邮箱无限容量,相当于永久免费备份.
适用于vps和独立服务器.
四步流程概览>>>
1>安装配置mutt邮件发送程序
2>安装7z压缩程序
3>修改backup2mail.sh脚本(收件人,要备份的文件夹,数据库等用户信息)
4>执行backup2mail.sh脚本
(tips:末尾文献部分是博主在研究这个脚本时所参考浏览过的文章.)
邮箱选择:163.
建议用国内邮箱附件主流50M,比国外主流30M附件容量多70%,这样生成的分割邮件会少很多.
QQ邮箱
50M/附件
优点: 收件比163快,经测试每天都能收到附件,并没有被拒收.
缺点: 自定义文件夹必须折叠,每次要点击两次。
163邮箱 
50M/附件
优点:自定义文件夹可以置顶,直接点击进入.
缺点:45M的压缩包接收比较慢,需要几十分钟,5M附件的邮件倒是能正常快速收到.实际延时测试>大约是22:09收到第一份5M附件邮件,22:16分收到45M附件邮件,相隔7分钟。
数据库是否选择压缩:压缩.(压缩后体积大约是未压缩的20%)
备份命令mysqldump格式:
格式:mysqldump -h主机名  -P端口 -u用户名 -p密码 –database 数据库名 > 文件名.sql 
不压缩
1.48M
mysqldump -u数据库用户名 -p数据库密码 数据库名 > sqlbakup.sql
gz压缩后
300.41K
mysqldump -u数据库用户名 -p数据库密码 数据库名 | gzip > sqlbakup.sql.gz

文件夹压缩格式选择:7zip.
linux自带的tar.gz分卷方式在windwos下合并比较麻烦,需要敲命令.因此选用压缩率比较高的7z格式做分卷处理.(zip的压缩率太低,作为邮箱备份目的不在此考虑.)
原始文件夹体积 201 MB 命令简介
7za压缩后 64.43 MB centos安装7z:yum install p7zip

分卷:7za -v45M a /要存在哪个文件夹/文件名 /要压缩的目标文件夹
参数 -bt:显示执行时间统计信息

#默认等级压缩:
7za a /root/mail-test/zip/test2 /www/wwwroot/www.luoji.men 
[注*:"a"命令是添加已有,不反馈删除,因此需要作为脚本使用是需要先删除已存在压缩包]
#指定等级压缩:
7za -mx=5 a /root/mail-test/zip/test8  /www/wwwroot/www.luoji.men-mx=0等于不压缩(参数1-9(看内存,我vultr的vps只能使用最高等级5压缩)

#分卷压缩,支持直接使用目录
7za -v45M a /root/mail-test/zip/test5 /www/wwwroot/www.luoji.men
039c280ff790f5ba515130334672ed98_507e1f14-1fee-464b-a488-9352e8687729
zip压缩后 95.24 MB 压缩:zip -r /root/mail-test/zip/test.zip /root/mail-test/file/*
分卷:zip -s 200k file.zip --out ziptest    #分卷成200k一包
(注*:zip分卷需要先压缩成zip才能分卷)
BT宝塔备份
tar.gz
84.41 MB
tar -jcvf
bz2
79.56 MB tar -jcvf /root/mail-test/zip/tar-test.tar.bz2 /root/mail-test/file/
039c280ff790f5ba515130334672ed98_d90350ee-f9e3-4271-b912-a593eb2b8edf
tar -zcvf
tgz
87.50 MB tar -zcvf /root/mail-test/zip/tar-test.tgz /www/wwwroot/www.luoji.men
039c280ff790f5ba515130334672ed98_37cc033a-b3c2-46f8-840b-9d20fea2a8ab

压缩方式耗时对比:7z虽然压缩率高,但耗时确实很长。不过自用服务器负荷很小,虽然7z耗时长,但是压缩后的体积小,便于邮箱存放,适合作为每日发到邮箱备份。
测试压缩所用的文件夹体积 039c280ff790f5ba515130334672ed98_6a464497-f1e0-4feb-9b6a-b27a646d38c6039c280ff790f5ba515130334672ed98_80115811-c37c-4099-8b4e-1a4ea46f73a4
7z.zip.tar
耗时3分25秒
(不发邮件)
time backup.sh 同时使用三种压缩方式总耗时3分25秒(不发邮件)039c280ff790f5ba515130334672ed98_c1f5416b-474c-443e-ab0a-a10b3eb15e3a
7z.zip.tar
耗时5分10秒
(发邮件)
 time backup2mail.sh 同时使用三种压缩方式总耗时5分10秒(发邮件)039c280ff790f5ba515130334672ed98_77a89881-1434-4218-9638-7e52d7ed9573
7z
耗时3分17秒
(不发邮件)
time backup.sh 仅使用7z压缩方式耗时3分17秒(不发邮件) 039c280ff790f5ba515130334672ed98_0c600fb8-ef8e-46be-a062-67ce7f714473
zip
耗时52秒
(不发邮件)
time backup.sh 仅使用zip压缩耗时52秒(不发邮件)
tar
耗时17秒
(不发邮件)
time backup.sh 仅使用tar压缩耗时17秒(不发邮件)039c280ff790f5ba515130334672ed98_a2a82c7c-2562-45d0-975f-28cb0a24985f

安装mutt邮件发送服务

centos使用yum一条命令就安装完成

设置主机名
临时# hostname www.luoji.men 否则aliyun邮箱和gmail邮箱拒收(连垃圾邮箱都不给进).
成功后可修改成永久
设置发件人
默认设置很可能被作为作为垃圾邮件甚至拒收,
编辑 vi /etc/Muttrc
在开头添加发件人信息 :

编辑 vi /etc/Muttrc.local
添加set copy = no参数,意思是取消附件的拷贝

测试mutt发送邮件查看对方服务器是否能收到:
格式是:文本、标题、邮箱

039c280ff790f5ba515130334672ed98_8de41a3d-721a-4bde-90c5-051457d65af2  

接着测试mutt发送附件

 格式是:文本、标题、邮箱、附件(-a 附件必须放在最后面,否则报错)

新建一个 vi fujian.txt 文档

查询当前路径:

发送附件

大约1分钟后,邮箱应当收到这封带有附件的邮件>

039c280ff790f5ba515130334672ed98_204cd097-3be1-4a26-9875-f12be89ae74e

 039c280ff790f5ba515130334672ed98_99ac2100-d6f2-4630-b035-6e11513c7c49

 

安装7z压缩

测试7z分卷:
新建两个测试目录并在其中放进一个10M左右的文件

查看文件体积

查看当前完整路径

分卷压缩命令
格式:7za -v分卷大小 a /压缩包存放文件夹/压缩包名 /需要分卷压缩的文件夹
分卷成2M大小测试

进入/root/temp/output7z/查看是否正确生成分卷压缩包,如下分割分卷无误>


导出MySQL数据库测试

mysqldump -u用户名 -p用户密码 数据库名称 > 保存为文件.sql

mutt和7z还有数据库导出测试无误后.即可使用backup2mail脚本

backup2mail.sh脚本

本sh脚本特点:
1、支持分卷压缩,将目标数据分割成指定的附件体积发送到邮箱作为存档备份。
2、可选7z、zip、tar三种压缩方式,默认使用7z.
3、支持文件夹、数据库的备份

推荐脚本(7z压缩方式 backup2mail.sh

脚本使用测试:
测试100M的网站文件夹,被压缩成36M附件的邮件发送完毕大约2分钟后qq邮箱可以查到这封新邮件>

 039c280ff790f5ba515130334672ed98_6cba7087-7e73-4f3e-9462-b510755b072e 


文件夹压缩率对比> 

文件夹体积 107M.

7z压缩 36.9M.
宝塔tar.gz压缩 50.44M.
两个压缩包下载后解压对比无异:

039c280ff790f5ba515130334672ed98_625ad534-94fb-415a-b306-dd3dd1da966d


数据库压缩率对比>

不压缩导出数据库1.7M
7z压缩以上文件后:233K
使用gz压缩方式导出数据库331K
结论:还是7z优秀.


脚本二(zip压缩方式)

分卷压缩、通过mutt发送邮件
文件+数据库+计划任务版本
脚本维护时间>2017年9月17日20:00


脚本三(zip压缩方式.不含数据库) 

脚本维护时间>2017年9月16日21:55:43

脚本四(tar压缩方式.不含数据库)

/bin/bash /your-script-path/backup.sh


参考文献

mysql备份与还原 

http://www.cnblogs.com/Cherie/p/3309456.html

Linux使用Mutt发送邮件/附件 

http://www.isucc.me/129.html

VPS 自动备份脚本 

https://blog.onens.com/auto-backup-bash.html

用邮箱备份VPS的数据 超简易教程 

https://ilazycat.com/posts/2012/08/backup-vps-data-using-mailbox.html

[SHELL]备份系统文件并邮件发送

 http://showerlee.blog.51cto.com/2047005/1283408
039c280ff790f5ba515130334672ed98_0.02878437096215536

用python自动备份网站到你的邮件中 

https://blog.iw3c.com/archive/1085


压缩>综合相关

浅谈Linux下各种压缩 解压命令和压缩比率对比 http://blog.sina.com.cn/s/blog_407abb0d0100lajg.html

Linux下解压:tar、rar、7z命令简单易懂的教程(含实例)
http://blog.csdn.net/ac_huang/article/details/23279641

Linux zip分卷压缩 
http://blog.csdn.net/u010273224/article/details/54171696

Linux系统zip压缩命令详细参数,附文件排除选项的正确用法
 https://zhangge.net/4776.html

Linux 下zip包的压缩与解压
 https://www.cnblogs.com/chinareny2k/archive/2010/01/05/1639468.html

linux下分卷压缩,合并解压的3种方法 
http://blog.csdn.net/aree/article/details/50946137 、http://blog.51yip.com/linux/988.html

Linux下分卷压缩较大的文件 
http://blog.csdn.net/baggio1006/article/details/17503113

CentOS 安装 rar、zip 解压缩 
https://ehlxr.me/2016/12/22/CentOS-%E5%AE%89%E8%A3%85-rar%E3%80%81zip-%E8%A7%A3%E5%8E%8B%E7%BC%A9/

Linux下的压缩(zip)解压(unzip)缩命令
 http://blog.csdn.net/shenyunsese/article/details/17556089

压缩>7zip相关文献

CentOS中如何安装7ZIP  
https://teddysun.com/176.html

How to create multipart 7zip file in Linux? 
https://superuser.com/questions/184557/how-to-create-multipart-7zip-file-in-linux

How to use 7zip on Linux command Line
 https://www.ibm.com/developerworks/community/blogs/6e6f6d1b-95c3-46df-8a26-b7efd8ee4b57/entry/how_to_use_7zip_on_linux_command_line144?lang=en

Shell相关文献

shell 将字符串分割成数组 
https://my.oschina.net/5lei/blog/189559

Shell 数组元素个数${#array[@]} 数组的所有元素${array[*]} 字符串长度${#str} 
http://zhenshi4597.blog.51cto.com/1891465/871166

SHELL脚本中的数组 
http://smilejay.com/2016/04/array-in-bash/

Shell编程中的数组定义、遍历 
https://www.coder4.com/archives/3853

Shell数组:shell数组的定义、数组长度 
http://c.biancheng.net/cpp/view/7002.html

SSJ

不积跬步无以至千里