Home > Tech > Linux > 用Cronjob定时将站点备份发送到邮箱

用Cronjob定时将站点备份发送到邮箱

Add a comment June 20th, 2009 http://s.ibron.co/jytQmV

前几天Leeiio筒子说自己在BlueHost上的数据全部丢失,加上我另一个Blog的账户在事先无任何通知的情况下被suspended,开始考虑如何定时地自动备份站点。原本上周末就打算研究的,无奈工作上事情不断,只好一拖再拖~ :cry:

闲暇的时候逛到老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

  1. Linux对于文件名区分大小写,操作的时候需要格外注意;
  2. 为了测试,你可以将时间选在当前时间之后2分钟,这样保存之后就能马上进行测试。另外在设置Cron Jobs的时候有一个选项是”Please enter an email address where the cron output will be sent”,这里你可以填入自己的邮箱或者使用默认值(用户名),这样当cron产生输出(通常是错误或警告信息)的时候你就能得到邮件,便于调试。如果输入的是用户名的话,邮件到cPanel的WebMail里去看;
  3. Cron里的时间设置是主机时间,各位筒子需要注意一下时间换算;
  4. 如果你发现需要包含的文件项远多于需要排除的文件项,你也可以建立一个排除列表,这样在使用tar压缩的时候只要指定排除文件就好了。具体的用法还请放狗搜一下,我就不代劳了 :smile:

如果你有什么疑问或者更好的方法,欢迎留言,大家讨论讨论~


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 #避免浪费空间,删除本地备份文件。
  1. June 21st, 2009 at 12:04 | #1
    Reply Quote

    呃,数据库备份才是头等大事,另外就是wp-content目录了

  2. June 21st, 2009 at 12:47 | #2
    Reply Quote

    @辐射鱼
    数据库有插件帮忙啊~文件的备份好像没见到什么插件能搞定的。

  3. June 21st, 2009 at 18:33 | #3
    Reply Quote

    @Bronco
    你都用定时任务了,还用插件岂不是多此一举呢?备份文件和数据库大同小异,只是备份数据库用的是mysqldump而已

  4. June 21st, 2009 at 20:42 | #4
    Reply Quote

    哈,我现在备份可勤快了~

  5. June 21st, 2009 at 21:59 | #5
    Reply Quote

    @辐射鱼
    嗯~应该写一个完整的备份程序哈~也无所谓了,会的人自己能搞定,不会的人自己研究研究也很有意思。

    @Leeiio
    你现在用mt了?

  6. June 22nd, 2009 at 12:36 | #6
    Reply Quote

    @Bronco 对,传说中的 MT 空间~

  7. July 3rd, 2009 at 15:37 | #7
    Reply Quote

    整站备份倒是没有想过,只是这个应该不太会经常变动的吧

  8. July 3rd, 2009 at 15:43 | #8
    Reply Quote

    @老N
    就怕服务器抽风,到时候数据丢了岂不是很抓狂?

  9. March 14th, 2010 at 11:58 | #9
    Reply Quote

    你这个是站点备份吧!
    那么数据库自动备份怎么办呢?

  10. March 14th, 2010 at 21:28 | #10
    Reply Quote

    @皇家元林
    可以用wp的插件或者将我的脚本里的文件压缩命令换成mysqldump。

  11. March 17th, 2010 at 11:28 | #11
    Reply Quote

    数据库备份的话 第二步是不是可以省了?
    但是我的不行啊,好几天了,没反应啊!

  12. March 20th, 2010 at 21:19 | #12
    Reply Quote

    @皇家元林
    “创建文件列表”是不需要的。脚本里应该在tar之前加上mysqldump,把生成的脚本压缩之后再发送到邮箱。
    有问题可以看看你cpanel的邮箱,里面会有错误信息。另外周期可以调短一点,调试完成之后再改成正常的。

  13. March 21st, 2010 at 15:45 | #13
    Reply Quote

    对哦。原来我这里发送不到我的邮箱里呢!
    这是为什么啊?
    怎么发送到我自己邮箱错误呢?

  14. March 21st, 2010 at 23:11 | #14
    Reply Quote

    @皇家元林
    详见文章Tips的第二点.

  15. March 22nd, 2010 at 08:30 | #15
    Reply Quote

    现在能发送邮件了,但是代码好像不对。你帮我看下。

    cd /home/laucom #注意将"(用户名)"替换为你的用户名
    suffix=$(date +%Y%m%d) #获取当前的日期,格式为20090620,想用两位年的话将大写的Y改成小写的y
    tar -zcf backup/wp_$suffix.tar.gz -T mysqldump #此句的意思是将数据库备份压缩成存放在backup目录下名为wp_$suffix.tar.gz的gz文件
    mutt [email protected] -a /home/laucom/backup/wp_$suffix.tar.gz -s "Site Backup" #将[email protected]换成你自己的邮箱,"Site Backup"指的是邮件主题。
    rm -r backup/wp_$suffix.tar.gz #避免浪费空间,删除本地备份文件。
  16. March 25th, 2010 at 09:39 | #16
    Reply Quote

    @皇家元林
    呃…mysqldump是一个命令,你要用它先生成一个文件,里面包含数据库脚本,然后再用tar把这个文件压缩,最后通过mutt把压缩过的文件发送到邮箱。我原来的脚本里第三行是用tar来压缩指定文件列表里的文件。
    建议你查一下tar命令和mysqldump命令的详细用法。 :cool:

  17. March 26th, 2010 at 08:30 | #17
    Reply Quote

    我昨天研究一天,数据库备份可以完成,但是使用不了tar命令,你可以帮我吗?

  18. March 26th, 2010 at 13:05 | #18
    Reply Quote

    @皇家元林
    你现在是用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

  19. March 26th, 2010 at 13:57 | #19
    Reply Quote

    出现以下错误代码:

    /home/k0neid75/backup/sitebackup.sh: line 3: /backup/wp_20100326.sql: Permission denied
    tar: Removing leading `/' from member names
    tar: /backup/wp_20100326.sql#\264\313\276\344\265\304\322\342\313\274\312\307\275\253\312\375\276\335\277\342\261\270\267\335\321\271\313\365\263\311\264\346\267\305\324\332backup\304\277\302\274\317\302\303\373\316\252wp_20100326.tar.gz\265\304gz\316\304\274\376\r: Cannot stat: No such file or directory
    tar: Error exit delayed from previous errors
    Can't stat /home/laucom/backup/wp_20100326.tar.gz: No such file or directory
    /home/laucom/backup/wp_20100326.tar.gz: unable to attach file.
    rm: cannot remove `/backup/wp_20100326.tar.gz': No such file or directory

    这是怎么回事呢?好像生成的数据库没权限。我也设置backup文件夹的权限为777.

  20. March 26th, 2010 at 21:25 | #20
    Reply Quote

    @皇家元林
    可能是你的mysqldump写得不对,试试这个:
    mysqldump –user=”用户名” –password=”密码” -h localhost 数据库名 > 文件名
    注意下user和password前是两个”-”。

  21. March 27th, 2010 at 09:46 | #21
    Reply Quote

    都是发生这样的问题:

    mysqldump: unknown option '-¨'
    tar: wp_20100326.sql#\264\313\276\344\265\304\322\342\313\274\312\307\275\253\312\375\276\335\277\342\261\270\267\335\321\271\313\365\263\311\264\346\267\305\324\332backup\304\277\302\274\317\302\303\373\316\252wp_20100326.tar.gz\265\304gz\316\304\274\376\r: Cannot stat: No such file or directory
    tar: Error exit delayed from previous errors
    Can't stat /home/laucom/backup/wp_20100326.tar.gz: No such file or directory
    /home/laucom/backup/wp_20100326.tar.gz: unable to attach file.
    rm: cannot remove `/backup/wp_20100326.tar.gz': No such file or directory

    哎,算了,折腾这么长时间还是不行。
    真是太麻烦你了。

  22. March 27th, 2010 at 11:48 | #22
    Reply Quote

    @皇家元林
    你的mysqldump参数不对。
    我在文章后面贴了一个备份全站的脚本,你可以试一下。另外注意脚本里的所有字符,包括文件名,都是半角英文,使用全角或者中文有可能出问题,当然注释除外。

  23. jasmine
    April 19th, 2010 at 14:42 | #23
    Reply Quote

    我直接测试备份的shell脚本是好使的 可是在空间使用cron 到时间就是不执行这个脚本是怎么回事呢?时间 路劲我写的都对的啊。

  24. April 19th, 2010 at 22:30 | #24
    Reply Quote

    @jasmine
    可以去cPanel的WebMail邮箱里看看有没有错误日志。另一种可能是cron没运行(虽然这几乎不可能 ;-) )

  25. jasmine
    April 20th, 2010 at 10:36 | #25
    Reply Quote

    那个simplehelix,bluehost不支持mutt,好像就不能用mutt命令,还有其他的方式可以将备份的数据库发送到邮箱里么?可以在空间里设置么?

  26. April 20th, 2010 at 18:24 | #26
    Reply Quote

    @jasmine
    好像bh可以用mailx,具体参数可google之~

  27. 贝贝爸爸
    June 18th, 2010 at 14:26 | #27
    Reply Quote

    你好,看了你的文章,我也很想把自己的vps的东西备份下来
    你里面用到了mutt,不知道mutt应该怎么配置?
    感觉很神秘似的。

  28. June 22nd, 2010 at 21:26 | #28
    Reply Quote

    @贝贝爸爸
    就是一个发邮件的程序罢了。虚拟主机里一般都会装的,vps的话应该也很方便的,google一下就知道了。 ;-)

  29. liangjia
    November 27th, 2010 at 17:18 | #29
    Reply Quote

    cd /home/(用户名) #注意将”(用户名)”替换为你的用户名
    这里是要写网站绝对路径吗?

  30. November 27th, 2010 at 22:38 | #30
    Reply Quote

    @liangjia
    也不一定。但是后续操作都使用的相对路径,所以要注意保持前后的路径关系正确。

  31. liangjia
    November 28th, 2010 at 00:26 | #31
    Reply Quote

    博主你好,你讲的是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

    请博主帮我看看代码哪里出了问题,这个弄好了网站备份就容易多了,博主的思路很好,相信很多人都受益匪浅,,这里我仅以我个人先谢谢博主。

  32. December 4th, 2010 at 23:31 | #32
    Reply Quote

    @liangjia
    检查一下SiteBackup.sh文件的权限,至少是755,即有执行权限,也可以尝试设置为777.

  33. liangjia
    December 7th, 2010 at 01:44 | #33
    Reply Quote

    文件权限改正后确实可以备份文件到空间,但程序执行到mutt是提示未知命令,无法发送邮箱

  34. March 20th, 2011 at 20:54 | #34
    Reply Quote

    现在主机的DA面板备份数据库,下载到三分之一就中断了。不知何故···

  35. March 20th, 2011 at 21:09 | #35
    Reply Quote

    不知道DA面板能用这个方法吗?~

  36. March 22nd, 2011 at 18:25 | #36
    Reply Quote

    @求索阁
    DA面板没用过,但是只要支持设置Cronjob的话应该就没问题。

  37. May 23rd, 2011 at 19:30 | #37
    Reply Quote

    博主,你好!创建脚本cd /home/(用户名) 里的这个用户名是指数据库用户名还是。。。?

  38. May 23rd, 2011 at 19:31 | #38
    Reply Quote

    另外,本文的方法是备份站点文件,那么对于较大的mysql数据库文件呢?如何备份/上传啊?

  39. May 25th, 2011 at 23:31 | #39
    Reply Quote

    @求索阁
    用户名是指cPanel账户创建时的用户名。
    文章最后有备份mysql的脚本啊,纯文本的sql文件用gz能压缩到很小的。

  40. May 26th, 2011 at 07:43 | #40
    Reply Quote

    哦,最后那段备份全站的代码是不是就包含了:数据库与wordpress的程序啊?~

  41. November 21st, 2011 at 13:14 | #41
    Reply Quote

    请问没有ssh权限怎么备份呢?

  42. November 22nd, 2011 at 12:58 | #42
    Reply Quote

    @暮春
    不用ssh啊,直接在cPanel里就能搞定的。

  43. November 22nd, 2011 at 14:58 | #43
    Reply Quote

    是的,我弄错了,忘记改成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

  44. November 22nd, 2011 at 14:59 | #44
    Reply Quote

    应该与我用的TE程序无关吧?难道是我的脚本错了?

  1. [...] 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 [...]

Comments feed