搞服务器,文件和数据的备份是非常重要的事。
本文基于本人2006年的主机系统而来,提供一种简单方便的方法和思路。本文基于Windows系统,至于其他非win系统么,对应的文档记录我这找不到了,也就懒得重新造轮子,但类似的方法和工具也有很多,简单修改就可以。
本文假设数据文件目录为“E:\Host”,需要备份至“D:\Backup\VHost”。备份策略为每月1日进行完整备份,每1或者2天进行增量备份。
想了一下,还是先讲一下数据备份的一些思路好了。备份本身是为了应对一些不可预知的灾难性情况或者较严重的误操作,所以在硬件层面至少需要能排除掉“单点”问题,否则备份的意义不大。比如,在单机+单硬盘环境中,任何形式的数据备份都没多大意义,因为硬盘挂了就挂了,你的备份有什么用途么?最多可以在硬件正常的时候,且较小损失的情况下恢复一些误删除罢了。而且备份--还原这个事本身是会有一些损失的(特指文件系统的数据备份),最多可以恢复到上一次的备份点,而上个点到现在这段时间的数据是无法恢复的,印象中好像zfs格式的文件系统能有效恢复所有数据,但记不清了,不确定。
所以呢,在架构设计之初就应当考虑到这种风险,物理机的话,至少增加一个硬盘吧,现在硬盘便宜的要死……我以前是这么干的:操作系统+备份+数据库为一个硬盘,业务数据为一个硬盘。这样的话呢,因为系统和备份这两部分的硬盘使用率是较低的,所以数据库可以获得相对较独立的硬件资源,业务数据则可以获得最高的硬件性能,而备份的时候,相当于从业务盘读取,写入到备份盘,于是整个流程中是没有瓶颈的。 继而呢,如果你的服务器多于1台,则在每个节点之间同步一下备份。于是乎,做到了这么一个效果:假设所有服务器中的某个硬盘挂了,没事有备份;假设某个服务器挂了,没事有备份;如果存在于不同机房,那么恭喜你,假设地震、洪水、恐怖袭击发生了,没事,依然有备份*^_^*
回到正题。原则上,服务器上面应该尽可能不要运行非必须的程序和软件,但winrar、7zip这类软件应该都是有的,用这个即可。
每月1日的自动备份这么干:
"C:\Program Files\WinRAR\Rar.exe" a -mt0 -r -ri5 -tk -m1 -ep1 -agMM-DD -xE:\Host\排除目录1\* -xE:\Host\排除目录2\* D:\Backup\VHost\VHost-.rar E:\Host
这条命令可以在D:\Backup\VHost中产生一个“VHost-月日.rar”的压缩包,参数意义如下,可以参考修改:
-MT<线程> - 设置线程数
-R - 连同子文件夹
-RI<p>[:<s>] - 设置优先级和休眠时间
-TK - 保留原压缩文件时间
-M<n> - 设置压缩方式
-EP1 - 从名称中排除主文件夹
-AG[格式] - 以当前日期与时间生成压缩文件名
更详细的打开WinRAR的帮助文件就可以了:
需要注意的是,命令使用的是rar.exe而不是winrar.exe。将上面的命令增加一个计划任务,或者写个bat文件,把命令复制进去,计划任务里面调用bat,这样更方便一些,后续修改或者增加其他操作会更方便。
然后呢,增加一个每天或者每两天这样的增量备份:
"C:\Program Files\WinRAR\Rar.exe" a -mt0 -r -ri5 -tk -m1 -ep1 -tn2d -agMM-DD-NN -xE:\Host\排除1\* -xE:\Host\排除2\* D:\Backup\VHost\VHost-.rar E:\Host
有所变动的地方:
-ag的格式有变,这个可以在文件较多的时候看的清楚些
-TN<时间> - 处理比指定时间新的文件。? 这里的-tn2d意思是只打包2天内更新过的文件
将这个写进bat,然后增加个计划任务即可。但注意,参数-tn和计划任务的间隔时间应该同步。
备份就这样完成了,要异地同步的话,命令行较方便的有rsync和ncftp这类一行命令就能够运行的工具,简单的附加在bat后面就可以了。
需要恢复的时候怎么办呢?
第一步,将完整备份解压出来,或者只解压你需要恢复的某个目录。
第二步,按照时间顺序,将所有增量备份中对应的目录覆盖解压到完整目录,只要备份文件在,是可以精确还原到每一天的。
已知问题:
1,有一些极特殊的目录结构是无法正常打包的,像那些“木马”喜欢创建的目录这类。这个问题没办法的,因为基于文件的备份依托于操作系统自身的正常处理,我测试过所有基于文件的备份软件都无法处理这类特殊目录,不过话说回来,这种目录内也不会有你想要打包的东西。 对于这种情况,如果一定要处理的话呢,需要用那种直接读写硬件的备份工具才能正常处理,比如ghost这类。
2,有一个不算bug的bug,因为每月1日是完整备份,所以每月1日的增量备份是多余的,而且如果你设置的运行时间相同,则每月1日的这个时间点会同时开始两个打包进程,如果你设置的线程数较多,则对系统性能影响会挺大的,所以一方面不要设置过多的线程以免影响业务系统性能,另一方面应该将完整备份和增量备份的时间错开,比如间隔1到2小时。