在运维工作中,让人郁闷让人烦燥的不是LINUX下的配置和操作(因为在linux下往往有N种方法实现同一功能)。恰恰相关,而是平时给我们提供最多便利的图形化的windows。而备份应该算是运维工作的基本功之一吧!而windows下有点类似于linux的shell的应该就是批处理了(现在有人poweshell替代了弱弱的cmd,不过还是和linux shell差了十万八千里)。批处理实起来是蛮不爽的,不过一句一句分开来去写也不是那么麻烦。下面我们利用bat来逐步实现批处理的备份。

一、给备份文件加上年月日时标志

众所周知(对于运维来说啊!^v^),linux下有个date命令。其实windows下面也有一个date命令,其作用和linux下的一样。可以设置时间,也可以查看年月日。不过对于时和分,cmd下用到了另一个命令time 。实现年月日也很简单:

1echo %date:~0,4%   //year
2echo %date:~5,2%   //month
3echo %date:~8,2%   //day

在cmd下,试试上面的语句。显示的就是年月日,是不是很简单?同样取星期、时、分、秒,甚至毫秒同样简单,如下:

1echo 取星期:%date:~10,6%
2echo 取小时:%time:~0,2%
3echo 取分:%time:~3,2%
4echo 取秒:%time:~6,2%
5echo 毫秒:%time:~9,2%

同样也不难吧!不过这里还有点小问题,我们取出的小时,如果是0~9点之间时,前面的零是剩略的。为了美观一致,想要小时是0的时候在其前面加上零同样也不难。只需要加个if判断就OK了:

1if "%time:~0,1%"==" " (set backup_file=%db_name%-%date:~0,4%%date:~5,2%%date:~8,2%-0%time:~1,1%) else (set backup_file=%db_name%-%date:~0,4%%date:~5,2%%date:~8,2%-%time:~0,2%)

二、文件压缩

平时我们备份的对像主要是数据库、web站点内容居多。像数据库文件和html页面文件多以文本类内容居多,这些文件的压缩率是很高的。如果磁盘空间不足的情况下。对备份出来的文件进行压缩,完成后再把原备份出来的文件删除掉是个不错的选择。而我们在windows下装的最多的压缩文件应该是winrar,当然我们也可以选择开源的7zip 。我们这里以winrar为例吧。

默认安装在C:\Program Files\WinRAR下,其可以通过rar.exe进行命令行操作,直接敲rar.exe出例出来:

1C:\Documents and Settings\Administrator>"C:Program Files\WinRAR\rar.exe"
2用法:     rar  - -  
3  a             添加文件到压缩文件
4  c             添加压缩文件注释

以上我只是列出了首部分,由于参数很多,后面我就省略了。列举几个常见用法:

1、默认压缩

1rar a help *.hlp 或
2rar a help.rar *.hlp

2、目录中是否包含子目录

1rar a Pictures.rar 361way*   (不包含子目录)
2rar ar Pictures.rar 361way*  (包含子目录)

3、列出详细的压缩文件列表,并输出到文件

1rar vt system.rar >list.txt

4、只单纯列文件名输出到文件

1rar vb system.rar >list.txt

5、使用当前的日期和时间生成压缩文件名

1D:>"C:Program FilesWinRARrar.exe" a -ag centos
2正在创建  压缩文件 centos20121225152129.rar
3正在添加    1.bat                                                       完成
4正在添加    10.7.dmg                                                     1%

默认为YYYYMMDDHHMMSS格式,另外还有其他几种形式为

1rar a -agDD-MMM-YY backup
2rar a -ag+YYYYMMDDHHMM backup
3rar a -agYYYY{year}-WW{week}-A{wday} backup
4rar a -agYYYYMMDD-NN backup

注:上面的N代表递增数字,允许一天之内生成前面相同,后在的NN是递增的数个文件

6、为压缩文件加密

1rar.exe a -hptest nginx.rar nginx-1.2.2     密码test

由于rar的用法比较多,在此不一一列举。具体可以查看该命令的帮助提示。

三、备份文件的轮循删除

在备份过程中,一般都是将备份文件保持在一个周期内。这个周期可能是一周、半个月也可能是一个月。而通过批处理实现循环删除的方法我总结了三种,如下

1、move循环删除

1move /Y 3.sql  4.sql
2move /Y 2.sql  3.sql
3move /Y 1.sql  2.sql

循环覆盖,备份出的文件为1.sql 。该文件适用于循环周期比较短的情况下。

2、for循环删除

1for /f "skip=30" %i in ('dir *.bak /tc /o-d /b') do del %i 

利用for和dir的时间排序,保留最近30个.bak备份文件。

3、forfiles命令法

windows 2003系统下有一个非常实用的命令forfiles.exe(windows 2000和windows xp下可以直接把该文件复制过来使用),其有一个非常好用的参数/D,即按时间列出最近的文件或文件和目录。

1forfiles.exe /D -30 /c "cmd /c del /Q @file"

以上语句会把30天以上的文件全部del掉。如果想把文件和目录都列出来,只需要把@file换成@path即可,但是目录是不能通过del命令删除的。其需要 rd命令才能删除。上面的用法可以换成:

1FORFILES /c "cmd /c if @ISDIR==TRUE RD /s/q @PATH" 只针对目录
2FORFILES /c "cmd /c if @ISDIR==TRUE del /Q @file" 只针对文件

forfiles提供了另外的有用的参数是@isdir,用于判断是否是目录。至于forfiles的其他用法,可以通过在windows 2003下,输入forfiles.exe /?查看。

四、将备份文件保存到其他机器上

上面的三部,我们基本上完成了备份所需要的大致流程。不过往往也有很多企业会将所有的备份集中进行管理。这个时候我们还需要将备份的文件传到其他服务器上。当然实现的方法很多。思路主要也是两种,一种是推;一种是拉。即:一种是将目前的服务器做为服务端,备份服务器过来取;另外一种是备份服务器是服务端。由本服务器上传。这里我们以后者为例吧!

方法一:ftp上传法

首先在服务器一上建立backup.ftp文件(这里假设保存至C:backup.ftp),文件内容如下:

 1open 192.168.1.10   //Your Ftp Server 你要备份到的服务器的ip
 2user backup    //Your Ftp username
 3*************//Your Ftp password
 4lcd d:backup
 5bin
 6prompt
 7mput *.*
 8bye
 9quit
10exit

再建立uptobak.bat的批处理文件,文件内容如下:

1ftp -n -s:"c:backup.ftp"

上面三部的备份过程完成后,调用该bat文件即可。

方法二:rsync实现法

rsync实现法,在此不多说。以前有篇日志介绍过。

注:实现的方法远远不止以上两种,只不这两种最为常见而已。其他方法同此类似,可以类举调用。

五、备份提示

最后这一步,可能无关轻重,但又似乎十分关轻重。因为日常工作中对很多程序执行情况的了解,都会通过检查是否收到相关告知提示,或告知文件中是否有异常来判断。本例提到的工具是sendEmail,这个也是linux上的一衍生品。前提是只要服务器可以正常上网即可。该工具本来只是linux上一个.pl邮件工具。不过现在被高人改成了.exe的windows版本。

该工具用法比较简单,但功能十分强大。用法不再介绍,其项目主页为:http://caspian.dotconf.net/menu/Software/SendEmail/ ,如是接收邮件方为139邮箱,可以做到短信提示的做用。

后记:此五步法,基本上完成了windows下所有备份操作的总体思路,另外,由于批处理中可能会涉及到用户密码之类的敏感信息。最好可以利用批处理加密工具对批处理文件进行下加密操作。这样的工具也非常多,在此不再介绍。下文会以此文提到方法为例,将第一、二、三、五步的操作为例,做一个window下oracle的备份。