详析邮件服务器邮件存储和日志从事务的描述中我们可以看到,事务是具有原子特性的,为了保证数据库的一致和完整,事务必须全部成功或全部失败,如果事务失败,则必须回滚到事务开始的状态。而当邮件在内存中修改完成后,此时事务并没有完成(为什么呢?)因为一旦系统崩溃,这些修改就丢失了。所以要确保事务修改完成,必须尽快将修改写回到数据库里去(也就是硬盘上)。这也是事务的持久性要求。注意,我们这里说的第一时间或是尽快,是一个什么样的概念。如果我们直接修改EDB文件,由于EDB文件比较大,那么在硬盘上修改一个大文件,就 需要花费大量的时间在等待和寻找数据存储块上(见操作系统原理),当系统出现高负载的繁忙状态时,这将是一个非常大的瓶颈。也就无法做到“尽快”了。那怎么办呢?所以数据库系统使用了日志,而日志通常很小(EXCHANGE的日志只有5MB),向这些文件写入修改结果是很快速的,因此当内存的修改完成后,这些结果就会立即写入日志中,以保证了事务的持久性。当成功写入日志后,该事务就成功完成了(现在在硬盘上了,不会因为当机丢失了)接下来,ESE引擎会在后台慢慢将这些日志里的修改记录写回真正的数据库里去(这对用户来说已经不是那么重要了),这就是日志的第一个作用:确保事务在第一时间(尽可能快的)保存到非易失存储器上(提供了事务持久性支持)。 根据上面的藐视,我们看到运行中的EXCHANGE数据库,是由三个部分组成的: * 内存中已经完成处理还没有写会到日志里的内容(Dirt page) * 还没有写到数据库文件里的日志内容 * EDB和STM数据库文件 对于第一个部分,一旦掉电就回丢失的,是最不安全的。而对于第二部分的内容,系统通过检查点文件(CHK)来标记哪些日志已经被写入数据库了,而哪些还没有。CHK文件类似一个指针。我们可以用“ESEUTIL /MK”来检查CHK文件里的内容,在该命令的输出中的checkpoint:<0x8,26d1,29>这样的东西就是检查点位置,它表示E0x00008的日志的页面序号已经被成功写入数据库了。大家可以自己看看。。:) 前面提到过,EXCHANGE系统在出现灾难时,应能恢复到灾难发生前的时刻的状态。这是非常重要的。但即使是最勤快的管理员,也只能在指定的预定时间内做系统备份,而不可能时时刻刻的都在备份。那么在备份完成后到灾难发生之前的这段数据该如何保护呢?是不是就任由它丢失呢?显然是不可能的。那答案是什么呢?就是日志文件。前面我们知道,任何对数据库的更改都先写入日志里,再由日志写入数据库,这样我们只要找到日志文件,就可以重新进行模拟的操作来完成备份后的数据库文件的更改了,我们举个例子来看看: 假设我们在凌晨3点完成了一次FULLBACKUP,备份完成后,系统正常运行,到下午4点的时候,系统突然崩溃。管理员用凌晨3点的数据恢复了数据库,那么从凌晨3点到下午4点这段时间的数据变更,就只能依赖于日志了。当完成数据库恢复后,系统会自动的跟踪到关联的日志文件,如果发现有比当前数据库还新的日志存在,系统就会自动的按照日志的顺序将更改写回到数据库中去。因此这样一来,从凌晨3点到下午4点的数据变更就被完整的恢复了。这就是日志的第二个作用:保证系统备份和恢复的完整性。当然前提是没有使用循环日志!!(看到了吧,使用循环日志的危害是相当大的,比起你的数据来说,多做几次备份不是没有意义的吧? 说到这里,有人可能要问,如果数据库和日志同时损坏,如何办?答案是:尽量避免这样的情况发生。首先数据库损坏的几率要大于日志,另外,微软建议将数据库和日志分别存储在不同的磁盘上,要是这样还会同时坏,那就没有办法了,呵呵。。对于管理员对日志文件的抱怨,合理的解决方法是定期做备份。启用循环日志是不正确的做法,当启用循环日志后,一旦系统发生灾难恢复,将有可能不能将系统恢复到灾难发生时的状态,磁盘和数据谁更重要,管理员自己要考虑考虑了。 五、ESE与IS服务的启动和关闭 ESE引擎在加载数据库文件时,会去检查数据库文件的标志。这个标志保留了上次关闭数据库的状态,当状态为正常关闭说,系统将直接加载该数据库,当数据库标志为非正常关闭时,系统将先进行一个软恢复过程(你可以在事件里看到它),然后再加载。 那么,正常关闭和非正常关闭有什么区别呢?一个正常关闭的数据库,表示所有的日志信息都已经正确的写入数据库了。反之一个非正常关闭的数据库,则表示至少有一部分数据未能正确的从日志写入数据库。要注意的是,非正常关闭的数据库并不等于已经被破坏的数据库。只表示有数据没有提交到数据库文件。 使用ESEUTIL/MH命令可以看到数据库的该状态,其中的STATE字段标记的就是这个状态,“CLEANSHUTDOWN”表示数据库正常关闭。当系统加载处于非正常关闭的数据库时,就会根据检查点文件确定日志文件的位置,并做重放操作。当检查点文件丢失或损坏时,系统将从最早的日志文件开始处理。有的时候,系统不能自动的修复数据库,这时我们也可以用“ESEUTIL /R”命令手工的恢复处于非正常关闭状态的数据库。强烈推荐在系统异常关闭后执行此命令。在执行前最好前确定数据库文件的状态确实为非正常关闭,不要对正常关闭的数据库执行该恢复命令! 由此可见,EXCHANGE系统对数据库有自我修复能力,能确保系统在发生意外后恢复正确的状态。但这并不是说我们可以随意的关闭系统,仍要UPS等必要的保护措施。 六、关于M盘 在EX2000里,有一个M盘的映射。这个映射只是提供开发人员通过API访问邮箱和邮件用的。因此对M盘的手工操作都可能带来数据库的破坏,请注意,另外,有一种观点认为备份了M盘就备份了邮件,这是绝对错误的。M盘虽然是数据库的映射,但已经去掉了很多的关联和内在联系。因此备份M盘是不能恢复数据库的。所有的EXCHANGE管理员必须按规定认真的备份系统状态和SG。切不可偷懒哦。 看了上面的描述,你还认为日志文件是多余的吗?EXCHANGE管理员,赶快取消循环日志,建立健全备份制度吧,为了你的前途,学会备份操作吧。
上一篇:图解Web和FTP服务器安全管理配置 下一篇:使用KWF工具打造与众不同的VPN服务器 更多相关文章
|
推荐文章
精彩文章
|