用Cronjob定时将站点备份发送到邮箱
前几天Leeiio筒子说自己在BlueHost上的数据全部丢失,加上我另一个Blog的账户在事先无任何通知的情况下被suspended,开始考虑如何定时地自动备份站点。原本上周末就打算研究的,无奈工作上事情不断,只好一拖再拖~
闲暇的时候逛到老N的博客,看到了一篇如何用Cronjob来定时备份数据库,不由眼前一亮,这不就是现成的方案么~今天终于能清闲一点,开工!
基本思想很简单,利用Cronjob定时执行一个脚本,脚本中依次执行压缩指定文件,发送压缩文件到邮箱以及删除压缩文件的操作。很简单,对吧?另外,考虑到文件的大小以及重要性,本方案将wp自带的文件排除在外,当然,如果你自己hack了部分代码,也可以将hack之后的文件一起备份。
以下操作在cPanel下完成,其他请参照进行。
创建备份工作目录
为了便于操作和管理,在用户主目录下创建一个”Backup”文件夹(也就是”/home/(用户名)”目录)。
创建文件列表
利用自己喜欢的编辑器,创建一个文本文件,名字随意,建议以”.lst”结尾,比如我的是”BackupFiles.lst”,输入要备份的文件以及目录,一条记录一行。路径以”public_html”开始,便于后续操作。
注意:文件夹路径的最后不要以”/”结尾,不要有除路径和文件名之外的其他东西,比如注释。
例如我的:
1 2 3 4 | public_html/index.php public_html/robots.txt public_html/cgi-bin public_html/wp-content |
创建脚本
另外创建一个文本文件,名字同样随意,建议以”.sh”结尾,比如我的是”SiteBackup.sh”,输入如下内容:
1 2 3 4 5 | cd /home/(用户名) #注意将"(用户名)"替换为你的用户名 suffix=$(date +%Y%m%d) #获取当前的日期,格式为20090620,想用两位年的话将大写的Y改成小写的y tar -zcf backup/SiteBackup_$suffix.tar.gz -T backup/BackupFiles.lst #此句的意思是将backup目录中的BackupFiles.lst内指定的文件项压缩成存放在backup目录下名为SiteBackup_$suffix.tar.gz的gz文件 mutt mail@example.com -a backup/SiteBackup_$suffix.tar.gz -s "Site Backup" #将[email protected]换成你自己的邮箱,"Site Backup"指的是邮件主题。 rm -r backup/SiteBackup_$suffix.tar.gz #避免浪费空间,删除本地备份文件。 |
设置环境
将上述两个文件放到之前创建好的”Backup”文件夹中。进入cPanel,找到Cron Jobs,使用Standard模式。(当然如果你对Linux很熟悉的话使用Advanced模式更方便一点。)在”Command to Run”中填入脚本的绝对路径(比如我的:/home/bronco/backup/SiteBackup.sh)。时间可以按照自己的意愿进行设置,我这里选的是每天凌晨12点。最后点击”Save Crontab”,大功告成!
Tips
- Linux对于文件名区分大小写,操作的时候需要格外注意;
- 为了测试,你可以将时间选在当前时间之后2分钟,这样保存之后就能马上进行测试。另外在设置Cron Jobs的时候有一个选项是”Please enter an email address where the cron output will be sent”,这里你可以填入自己的邮箱或者使用默认值(用户名),这样当cron产生输出(通常是错误或警告信息)的时候你就能得到邮件,便于调试。如果输入的是用户名的话,邮件到cPanel的WebMail里去看;
- Cron里的时间设置是主机时间,各位筒子需要注意一下时间换算;
- 如果你发现需要包含的文件项远多于需要排除的文件项,你也可以建立一个排除列表,这样在使用tar压缩的时候只要指定排除文件就好了。具体的用法还请放狗搜一下,我就不代劳了
如果你有什么疑问或者更好的方法,欢迎留言,大家讨论讨论~
Update:
如果想用cron备份全站,可以用以下这个脚本:
1 2 3 4 5 6 7 | cd /home/(用户名) #注意将"(用户名)"替换为你的用户名 suffix=$(date +%Y%m%d) #获取当前的日期,格式为20090620,想用两位年的话将大写的Y改成小写的y mysqldump --user="数据库用户名" --password="数据库密码" -h localhost 数据库名 > backup/Database_$suffix.sql tar -zcf backup/SiteBackup_$suffix.tar.gz backup/Database_$suffix.sql -T backup/BackupFiles.lst #将数据库备份文件Database_$suffix.sql以及backup目录中的BackupFiles.lst内指定的文件项压缩为SiteBackup_$suffix.tar.gz mutt mail@example.com -a backup/SiteBackup_$suffix.tar.gz -s "Site Backup" #将[email protected]换成你自己的邮箱,"Site Backup"指的是邮件主题。 rm -r backup/Database_$suffix.sql #删除数据库文件 rm -r backup/SiteBackup_$suffix.tar.gz #避免浪费空间,删除本地备份文件。 |
呃,数据库备份才是头等大事,另外就是wp-content目录了
@辐射鱼
数据库有插件帮忙啊~文件的备份好像没见到什么插件能搞定的。
@Bronco
你都用定时任务了,还用插件岂不是多此一举呢?备份文件和数据库大同小异,只是备份数据库用的是mysqldump而已
哈,我现在备份可勤快了~
@辐射鱼
嗯~应该写一个完整的备份程序哈~也无所谓了,会的人自己能搞定,不会的人自己研究研究也很有意思。
@Leeiio
你现在用mt了?
@Bronco 对,传说中的 MT 空间~
整站备份倒是没有想过,只是这个应该不太会经常变动的吧
@老N
就怕服务器抽风,到时候数据丢了岂不是很抓狂?
你这个是站点备份吧!
那么数据库自动备份怎么办呢?
@皇家元林
可以用wp的插件或者将我的脚本里的文件压缩命令换成mysqldump。
数据库备份的话 第二步是不是可以省了?
但是我的不行啊,好几天了,没反应啊!
@皇家元林
“创建文件列表”是不需要的。脚本里应该在tar之前加上mysqldump,把生成的脚本压缩之后再发送到邮箱。
有问题可以看看你cpanel的邮箱,里面会有错误信息。另外周期可以调短一点,调试完成之后再改成正常的。
对哦。原来我这里发送不到我的邮箱里呢!
这是为什么啊?
怎么发送到我自己邮箱错误呢?
@皇家元林
详见文章Tips的第二点.
现在能发送邮件了,但是代码好像不对。你帮我看下。
@皇家元林
呃…mysqldump是一个命令,你要用它先生成一个文件,里面包含数据库脚本,然后再用tar把这个文件压缩,最后通过mutt把压缩过的文件发送到邮箱。我原来的脚本里第三行是用tar来压缩指定文件列表里的文件。
建议你查一下tar命令和mysqldump命令的详细用法。
我昨天研究一天,数据库备份可以完成,但是使用不了tar命令,你可以帮我吗?
@皇家元林
你现在是用mysqldump生成了脚本吗?之后再用tar压缩就好了啊~过程是一样的。
cd /home/(用户名)
suffix=$(date +%Y%m%d) #获取当前的日期,格式为20090620
mysqldump …… #mysqldump生成数据库脚本
tar -zcf backup/SiteBackup_$suffix.tar.gz %mysqldump生成的文件%
mutt …
rm -r backup/wp_$suffix.tar.gz
出现以下错误代码:
这是怎么回事呢?好像生成的数据库没权限。我也设置backup文件夹的权限为777.
@皇家元林
可能是你的mysqldump写得不对,试试这个:
mysqldump –user=”用户名” –password=”密码” -h localhost 数据库名 > 文件名
注意下user和password前是两个”-”。
都是发生这样的问题:
哎,算了,折腾这么长时间还是不行。
真是太麻烦你了。
@皇家元林
你的mysqldump参数不对。
我在文章后面贴了一个备份全站的脚本,你可以试一下。另外注意脚本里的所有字符,包括文件名,都是半角英文,使用全角或者中文有可能出问题,当然注释除外。
我直接测试备份的shell脚本是好使的 可是在空间使用cron 到时间就是不执行这个脚本是怎么回事呢?时间 路劲我写的都对的啊。
@jasmine
)
可以去cPanel的WebMail邮箱里看看有没有错误日志。另一种可能是cron没运行(虽然这几乎不可能
那个simplehelix,bluehost不支持mutt,好像就不能用mutt命令,还有其他的方式可以将备份的数据库发送到邮箱里么?可以在空间里设置么?
@jasmine
好像bh可以用mailx,具体参数可google之~
你好,看了你的文章,我也很想把自己的vps的东西备份下来
你里面用到了mutt,不知道mutt应该怎么配置?
感觉很神秘似的。
@贝贝爸爸
就是一个发邮件的程序罢了。虚拟主机里一般都会装的,vps的话应该也很方便的,google一下就知道了。
cd /home/(用户名) #注意将”(用户名)”替换为你的用户名
这里是要写网站绝对路径吗?
@liangjia
也不一定。但是后续操作都使用的相对路径,所以要注意保持前后的路径关系正确。
博主你好,你讲的是cpanel上的cornjob备份。
我现在使用的是godaddy空间,他也支持cornjob定时任务,但是不知道该怎样修改路径。
godaddy空间登录ftp首页就是网站根目录,就是”/”
绝对路径是/home/content/b/6/7/用户名/html
我该怎样修改代码呢?
如果我要备份/uploadfile这个目录;
BackupFiles.lst代码如下
/uploadfile
SiteBackup.sh代码如下
cd /home/content/b/6/7/用户名/html #注意将”(用户名)”替换为你的用户名
suffix=$(date +%Y%m%d) #获取当前的日期,格式为20090620,想用两位年的话将大写的Y改成小写的y
tar -zcf backup/SiteBackup_$suffix.tar.gz -T backup/BackupFiles.lst #此句的意思是将backup目录中的BackupFiles.lst内指定的文件项压缩成存放在backup目录下名为SiteBackup_$suffix.tar.gz的gz文件
mutt [email protected] -a backup/SiteBackup_$suffix.tar.gz -s “Site Backup” #将[email protected]换成你自己的邮箱,”Site Backup”指的是邮件主题。
rm -r backup/SiteBackup_$suffix.tar.gz #避免浪费空间,删除本地备份文件。
我就是这样配置的,但是没成功,执行结果邮件内容如下:
/bin/sh: /home/content/b/6/7/用户名/html/backup/SiteBackup.sh: Permission denied
请博主帮我看看代码哪里出了问题,这个弄好了网站备份就容易多了,博主的思路很好,相信很多人都受益匪浅,,这里我仅以我个人先谢谢博主。
@liangjia
检查一下SiteBackup.sh文件的权限,至少是755,即有执行权限,也可以尝试设置为777.
文件权限改正后确实可以备份文件到空间,但程序执行到mutt是提示未知命令,无法发送邮箱
现在主机的DA面板备份数据库,下载到三分之一就中断了。不知何故···
不知道DA面板能用这个方法吗?~
@求索阁
DA面板没用过,但是只要支持设置Cronjob的话应该就没问题。
博主,你好!创建脚本cd /home/(用户名) 里的这个用户名是指数据库用户名还是。。。?
另外,本文的方法是备份站点文件,那么对于较大的mysql数据库文件呢?如何备份/上传啊?
@求索阁
用户名是指cPanel账户创建时的用户名。
文章最后有备份mysql的脚本啊,纯文本的sql文件用gz能压缩到很小的。
哦,最后那段备份全站的代码是不是就包含了:数据库与wordpress的程序啊?~
请问没有ssh权限怎么备份呢?
@暮春
不用ssh啊,直接在cPanel里就能搞定的。
是的,我弄错了,忘记改成755了!但是只备份成功了一个文件,数据库还有其他文件夹都失败了!
下面是邮件反馈的信息:
/home/luilinet/backup/SiteBackup.sh: line 1: cd: /home/luilinet
: No such file or directory
tar: backup/BackupFiles.lst\r: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now
Can’t stat backup/SiteBackup_20111121
.tar.gz: No such file or directory
backup/SiteBackup_20111121
.tar.gz: unable to attach file.
rm: cannot remove `backup/SiteBackup_20111121\r.tar.gz’: No such file or directory
应该与我用的TE程序无关吧?难道是我的脚本错了?
[...] address of this article is http://heybronco.net/tech/linux/use-cronjob-to-send-site-backup-to-mail-periodically/.When you got this here have more than 30 comments. Why not come to check it [...]