自从上次误删数据后,我就给服务器开启了定时异地备份功能。实现方法简简单单,并不高级,cron jobs+scp。
不过天朝网络有点抽,最近与备份服务器使用SCP传输文件的速度非常慢,传一个打包的数据库都要好几十分钟,unbearable!
正欲物色新的服务器做备份时,想到自己的网易邮箱是无限容量的,既然如此,就拿来接收备份邮件吧!
总体思路如下:导出数据库,打包网站文件,通过uuencode编码,使用PIPE,数据流重定向至mail命令中然后发到我的网易邮箱中。
首先安装sendmail(安装了就忽略吧):
1 2 3 4 5 |
CentOS: yum install sendmail Debian/Ubuntu: apt-get install sendmail |
安装sharutils(uuencode和uudecode):
1 2 3 4 5 |
CentOS: yum install sharutils Debian/Ubuntu: apt-get install sharutils |
mail命令:
1 2 3 4 5 |
CentOS: yum install mailx Debian/Ubuntu: apt-get install mailutils |
一般安装sendmail后会以deamon方式在后台运行,如果没启动,就执行:
1 |
/etc/init.d/sendmail restart |
先测试一下能不能把邮件发出去:
1 |
mail -s "CPU Information" 收件人地址</proc/cpuinfo |
能收到的话,就无任何问题,如果发不出去,或者发送很慢,就需要检查一下hostsname了,看看hostname是否已经在hosts里面解析。
接下来写一个执行备份的Shell Script,以备份MySQL为例,首先是导出数据库,可以使用MySQL自带的mysqldump:
1 |
mysqldump -u 数据库用户名 -p密码 数据库名称>保存路径 |
请注意-p后面要紧跟着的密码,不能有空格,如果要导出所有数据库,数据库名称就是
1 |
--all-database |
还可以使用gzip压缩,在数据库名称后面添加
1 |
| gzip |
没使用gzip导出的话,个人建议使用zip或者tar压缩一下。如果要安全些的话,还可以用zip的-P参数设置解压密码。
然后使用uuencode编码,使用pipe把数据重定向至mail,发送到邮箱:
1 |
uuencode 文件路径 附件文件名 | mail -s "标题" 收件人 |
下面提供一个完整Shell Script的供各位参考:
1 2 3 4 5 |
filename=$(date +%Y%m%d-%Hh%Mmin%Ss) mysqldump -uroot -proot --all-database | gzip >/tmp/$filename.sql.gz zip -r /tmp/$filename.zip /tmp/$filename.sql.gz -Punzippassword uuencode /tmp/$filename.zip $filename.zip | mail -s "MySQL All Database" my@email.com rm -rf /tmp/$filename.zip /tmp/$filename.sql.gz |
此Shell Script会自动使用用户名root,密码root导出所有数据库到/tmp,并且使用gzip压缩,文件名以执行该Shell Script的时间命名,然后使用zip压缩,设置解压密码为unzippassword,再用uuencode编码,mail发送到my@email.com,最后删除导出的数据库文件。
写好该Shell Script,保存到一个地方。并且赋予执行(x)权限。
最后就是添加一个CRON JOB,执行
1 |
crontab -e |
会自动运行nano/vi/vim编辑cron的配置文件,假如要每三十分钟执行一次备份任务,就在最后一行添加以下代码:
1 |
*/30 * * * * shell script的路径 |
然后保存。
顺便提一下:cron的配置文件,第一列是分钟(0-59),第二列代表小时(0-23),第三列代表天(1-31),第四列代表月(1-12),第五列代表周(0-7),第六列是执行的命令。
注意:周的0和7都是星期天
Ubuntu/Debian的crontab说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any').# # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command |
如果毫无问题的话,就可以实现每过三十分钟,自动发送一次备份文件到你的邮箱中了。
如果是备份网站文件的话,同样可以使用该方法,不过文件太大的话,个人建议用split分割一下。
split使用方法:
1 |
man split |
Comments are closed.