海洋工作室的自动备份

***********************************************************************
*                              版权声明
*      此文章为ocean所有,版权归ocean所有,任何网
* 站和 媒体转载必须包含此段声明,否则将视为侵权,作
* 者将保留一切权力。此声明为此文章中不可或缺的一部分。
* 作者网名:ocean
* 作者email:ocean@forever.net.cn
* 作者网站:http://www.oceanstudio.net
*                http://sps.oceanstudio.net
* 作者blog:博客园,http://www.cnblogs.com/ocean
*                     Ocean's blog,http://www.oceanstudio.net/sps/blog
* 此文章发表时间:2005年5月5日
************************************************************************


     海洋工作室的网站一直以来都没有自动备份(我比较懒),一般情况都是我想起来才备份一下。服务器的三块MAXTOR ATLAS10K4_73SCA 的73G的SCSI硬盘做了RAID5冗余,所以到也不太担心硬盘损坏,至少两块硬盘同时坏的可能性比较低。但是Raid只是保证硬件安全,不能保证数据库的误删除,所以备份还是要做的,而最好的就是自动备份。

    五一正好比较轻闲,就想干脆设置一个自动备份。其实设置自动备份很简单,靠一个计划任务就可以,不过我想实现的更彻底一些,就是希望备份之后,我在公司自己用的机器能够自动ftp上去,将当天的备份下载下来,然后重命名加上当天的日期戳,然后将当天备份的日志消息发送邮件给我,这样我每天一去公司,就可以在outlook中看到备份的消息了。如果备份失败我可以及时察觉。

    OK,这个过程该如何做呢,这里我将用计划任务和强大的批处理功能,实现一个完美的每日备份方案。我们一步一步来做。首先是服务器上网站的自动备份。服务器上的内容分为两部分,一部分是http://sps.oceanstudio.net的网站,这是一个WSS站点(http://www.oceanstudio.net是个sps站点,但是没有内容更新,所以不需要每日备份)。另外一部分是在非托管路径下的一些文件,比如Flash教程,由于这部分基本也不常变动,而且在我自己的机器上也都有这些文件,所以也不需要备份,真正需要备份的就是一个WSS站点。备份WSS站点我们通过stsadm.exe命令,具体命令为:

    stsadm -o backup -url http://www.oceanstudio.net/sps -filename "oceanstudio.data" -overwrite

    当这个命令成功后会显示:操作成功完成。

    因为每天都会将备份文件下载下来,所以服务器只要保留一份最新的备份文件即可,这样可以不占用服务器的宝贵空间。所以命令加了-overwirte,这样每天都会覆盖这个文件。但是如果备份没有成功,这个文件也是存在的,这样下载也能成功,但是却不知道备份实际是失败的,所以我们需要在服务器写一个日志文件,记录操作。写日志只要采用文件重定向即可。即:

    stsadm -o backup -url http://www.oceanstudio.net/sps -filename "oceanstudio.data" -overwrite > serverlog.txt

    这样就会有一个serverlog.txt文件,但是这个serverlog.txt也要知道是哪一天的,所以先用echo命令在log文件中写入当天日期。

    echo "%date% 开始备份" > serverlog.txt

    其中%date%是操作系统中表示当天日期的变量,直接引用就可以了。

    这样最终的批处理文件backup.cmd如下:

    echo "%date% 开始备份" > serverlog.txt
    stsadm -o backup -url http://www.oceanstudio.net/sps -filename "oceanstudio.data" -overwrite >> serverlog.txt

    第二条语句重定向要使用>>来追加log。

    这样每次备份完毕就会产生两个文件,oceanstudio.data和serverlog.txt,serverlog.txt的内容大致如下:

    "2005-05-04 星期三 开始备份"

    操作成功完成。

    然后建立一个计划任务,规定每天早上凌晨5点执行此批处理文件,如何建立计划任务我就不说了,这个大家都很熟悉了。这样服务器的每日备份就做好了。

    下面就是要在自己的机器上做的事情了,在自己的机器上建立一个批处理文件,然后建立一个计划任务在每天早上6点执行这个批处理文件。这个批处理文件做了三个操作,首先下载这两个文件,然后重命名这个文件,最后将操作日志email到我的ocean@forever.net.cn邮箱。

    如何下载呢?显然不能用http,这样太不保险,我选择了ftp,那么如何在批处理中自动用ftp下载呢?我使用xp自带的ftp.exe命令,该如何写呢,如下:

    ftp -n -s:ftp.txt xxx.xxx.xxx.xxx

    其中-n表示只连接到服务器而不提示登录。-s:ftp.txt表示连接成功后执行ftp.txt内的ftp命令,xxx.xxx.xxx.xxx是我服务器的ip地址。

    那么这个ftp.txt如何写呢?如下:

    user {username} {password}
    cd backup
    get oceanstudio.data
    get serverlog.txt
    bye

    其中{username}和{password}表示登录ftp服务器的用户名和密码。登录后用get命令将两个文件下载下来。

    重命名就很简单了ren oceanstudio.data "oceanstudio%date%.data"

    这样就让oceanstudio.data改名成为了类似oceanstudio2005-05-04 星期三.data这种形式。

    当然本地操作也要记录日志,重定向到log.txt

    ftp -n -s:ftp.txt 221.6.4.250 > log.txt
    ren oceanstudio.data "oceanstudio%date%.data" >> log.txt

    这样就有两个日志文件,一个是下载下来的serverlog.txt,一个是log.txt,下一步是将这两个文件合并起来,合并文件可以巧用more命令。more命令本来是查看文件的,但是可以将显示的内容重定向追加到另一个文件,这样就起到了合并文件的功能。

    more log.txt >> serverlog.txt

    上面的命令就将log.txt的内容追加到了serverlog.txt末尾中。

    然后就是发送邮件了,这个没有找到现成的命令,只好用.net写一个console app了。还好发邮件程序很简单,定义两个参数,一个subject,一个body的filename。然后在命令行中执行:

    SendMail "%date% 海洋工作室网站备份日志" serverlog.txt

    这样就会收到一个标题类似为“2005-05-04 星期三 海洋工作室网站备份日志”的邮件,内容大致如下:

    "2005-05-04 星期三 开始备份"

    操作成功完成。

    Connected to xxx.xxx.xxx.xxx. 220 Serv-U FTP Server v5.0 for WinSock ready...
    ftp> user {username} {password}
    331 User name okay, need password.
    230 User logged in, proceed.
    ftp> cd backup
    250 Directory changed to /x:/xxxx/backup
    ftp> get oceanstudio.data
    200 PORT Command successful.
    150 Opening ASCII mode data connection for oceanstudio.data (20812309 Bytes).
    226 Transfer complete.
    ftp: 收到 20812309 字节,用时 730.36Seconds 28.50Kbytes/sec. ftp> get serverlog.txt 200 PORT Command successful.
    150 Opening ASCII mode data connection for serverlog.txt (51 Bytes).
    226 Transfer complete.
    ftp: 收到 51 字节,用时 0.00Seconds 51000.00Kbytes/sec. ftp> bye
    221 Goodbye!

    批处理文件全文如下:

    ftp -n -s:ftp.txt 221.6.4.250 > log.txt
    ren oceanstudio.data "oceanstudio%date%.data" >> log.txt
    more log.txt >> serverlog.txt
    SendMail "%date% 海洋工作室网站备份日志" serverlog.txt

    这样服务器端5点自动备份,公司自己用的机器(我不关机的,outlook也不关)6点钟开始下载,然后我8点钟上班看到邮件,可以看到当天是否备份成功,下载了多少字节,如果没有收到email或者邮件内容有问题,则表示备份的某个环节出了问题。

    借助计划任务、批处理和一些基本命令,是可以完成比较强大的功能的。而且省时省力(Unix系统更好,以前我用solaris时,其shell命令更加强大)。对于一般网站的文件备份也可以采用这种方式,就是服务器只保留一个备份文件,可以采用winrar命令,winrar提供命令行形式,可以采用归档形式,这样不压缩,可以降低cpu使用率,当然如果半夜人少的时候,或者为了减少下载的时间,可以采用最高压缩比的形式压缩。winrar还有一个好处就是只添加修改过的文件,比如备份文件是backup.rar,当第二次压缩的时候因为backup.rar已经存在,这个时候可以通过开关选择只将修改过的文件添加到压缩包内,速度就会很快。总归很多事情完全不用写很多程序就可以做完。

    很多东西无定式,因为每天我到公司第一件事情就是看邮件,所以把消息发送到我的邮箱中是很便捷的方法,当然我也可以将serverlog.txt创建一个快捷方式到桌面,这样我每天点击一下也能看,但是仍然需要点击一下,实际上可以将最后一句SendMail命令替换一下,替换成nodepad serverlog.txt,这样就会自动用记事本打开,每天去公司屏幕上都开着一个记事本,里面是日志情况,这样也和邮件差不多快捷,很多东西就看自己的想象力了。

    备份方案是和具体对象相关的,海洋工作室内容不多,所以可以每日完全备份和下载。如果内容过大(过G)就不适合了,怎么做呢,千万不要问我,发挥你自己的想象力。

   

    欢迎访问海洋工作室(http://sps.oceanstudio.net)


   

posted on 2005-05-05 13:36  ocean  阅读(...)  评论(...编辑  收藏

导航