1.1.2 代码错误
代码错误到处都有。比方说,某个脚本里可能写了一段过于宽泛的逻辑,把本来不该删的一些数据给删了。或者某个关键的软件里可能有一个bug,导致某些数据悄悄地遭到删除。类似情况经常发生,只是未必总能成为新闻而已。
有时,公司内部的开发者可能忘记遵守基本的原则,例如没有把代码存放到应该放的位置。笔者记得多年前遇到过一个公司内部的开发团队,他们有十几个人,这些人把整个代码库都放在了服务器的/tmp目录里面,但问题是,那台计算机装的是HP-UX系统,那个系统把/tmp存放在RAM(内存)之中(而不是存放在磁盘上)。这套代码本来没事,但有人把服务器重启了一下,结果发现代码库与内存中的其他东西一样,都被计算机清理掉了。
即便软件不是由本公司内部的团队开发的,而是从其他软件公司购买的,那家公司里面的专业开发团队也依然有可能出错。因为那些软件通常也会运行在权限较高的模式下,因此有可能会损坏大量数据,而且由于那种软件会有成百上千的公司安装,因此其中如果隐藏着什么问题,那么一旦爆发,就会造成相当大的危害。
在这一方面,笔者最喜欢讲的是这样一个故事。我当时在使用一款商用的备份软件包,这个软件包的开发者想在新版本里让用户能够更迅速地给每盘磁带打上电子标签。旧版的软件包在流程上有两个问题,一个问题是用户如果要拿某盘磁带保存其他数据(保存完之后当然还会给这盘磁带重新打一个电子标签),那么必须按好多个按钮才能完成,因为软件会通过这些步骤来确认用户是不是真的想把磁带里面已有的内容洗掉并重新打一个电子标签。第二个问题是,这个软件每次只使用一个磁带驱动器(又叫磁带机),就算磁带柜里有好多磁带机可用,它每次也只使用其中的一个。于是,开发者就在最新版的软件里引入了一个叫作“fast-and-silent”(快速且静默)的选项,意思是让用户能够迅速覆写多盘磁带并为其重新打标签,而不用再点击那么多的提示按钮,另外,新版也会把所有的磁带机全都利用起来。
然而,他们在引入新功能的同时,还带来了一个bug。以前,用户双击磁带列表中的某盘磁带之后,软件会弹出一个对话框,询问用户是否要覆写当前这盘磁带。但是现在,双击任何一盘磁带之后所弹出的这个对话框,针对的都不仅是当前这盘磁带,而是磁带柜里面的所有磁带。
1.1.1节讲的用户错误与本节讲的代码错误结合起来,经常会造成数据丢失,例如本章的书稿内容就这样丢过一次。在这个故事中,用户本来可能只想洗掉一盘磁带,但如果按错两次鼠标,那就有可能在没有得到提示的情况下,把整个磁带柜里的每盘磁带都洗掉,由于新版软件将所有的磁带机都用上了,因此这个过程相当快。
笔者当时参加了一次客户会议,坐在旁边的那位顾问是提供这款备份软件的那家公司派来的,他也遇到了这个bug。他当时想从保存客户数据的那套磁带柜里把其中一盘磁带的标签重新打一下,于是就双击了那盘磁带,他可能认为新版软件跟旧版一样,都只会针对当前的这盘磁带执行操作。他当时看到了fast-and-silent选项,于是就勾选了这个选项。几分钟之后他才反应过来,这样做实际上是把保存客户数据的这个磁带柜里的每盘磁带都洗掉了,这会让这些磁带中的数据全都消失。当然,这些磁带中的数据在客户那里也有一份,因此他们其实并没有真正丢失数据。所以,他们并不像真正丢失了数据的用户一样惨,他们无法完全理解后者的痛苦。
讲到这里,笔者正好可以提出3-2-1原则,即数据要有三个版本,要放在两个介质上,其中一份则要放在远处。
3-2-1原则是所有备份工作的基础原则。我们会在第3章详细讲解该原则,本书的每一章几乎都会提到这条原则。
人难免犯错。有时可能并没有恶意,但却把数据给删除或破坏掉了,这就是我们要做备份的另一项原因。