交叉匹配 Exchange Server 2003 中的 Exchange 数据库和日志文件

 

上一次修改主题: 2005-05-23

前面几节中强调了需要收集用于事务日志重播的所有需要的日志文件,并且仅收集所需要的日志文件。本节将说明如何确定其中包含哪些文件。

并不是在每次运行恢复时都需要执行此处介绍的步骤。在典型的还原和恢复方案中,所有日志文件都存在。但是,在手动将日志文件或数据库从一个位置移动到另一个位置的复杂恢复方案中,可以使用以下步骤来确保已正确地匹配了日志和数据库。

匹配日志文件和数据库的关键是签名。可以通过使用 Exchange Server 数据库实用程序 (Eseutil.exe) 工具以及使用 Eseutil /ml [日志文件名] 命令查看日志文件头来查看日志文件签名。可以通过使用 Eseutil /mh [数据库文件名].edb 查看文件头来查看数据库 (.edb) 和流式数据库 (.stm) 文件签名。

典型的日志文件或数据库文件签名如下所示:

Signature: Create time:12/17/2002 18:1:44 Rand:81060559 Computer:

在 Microsoft® Exchange Server 2003 创建新的日志文件系列(以日志文件编号 1 为开始)时,就会生成新的签名。在该系列中所有后续日志文件的签名与第一个日志文件的相同。通过此签名,您可以迅速识别出两个日志文件是否属于同一个系列。除非删除所有日志文件,并以日志文件编号 1 为开始重新创建,否则签名不会发生更改。

创建新的数据库文件集(.edb 和 .stm 文件)时,Exchange 会再次生成一个新的签名。此签名与日志文件的签名不同。.edb 和 .stm 文件共享同一签名。

在装入数据库时,会随之将此数据库附加到特定的日志流,Exchange 会将数据库签名写入日志文件,然后将日志文件签名写入数据库头。可以断开与数据库的连接,从而使数据库与日志流相分离,再将其装入到另一台服务器,或者另一个存储组中。在当前日志下次填满时,会生成一个新的日志,但已分离的数据库不会出现在新日志文件的头中。相反,数据库头反映的是数据库当前附加到的日志流的签名。

note注意:
在创建新的日志系列时, Enn000001.log 日志不会在其头中列出任何数据库签名。Enn000002.log 才是在其头中列出数据库的第一个日志。将数据库附加到现有日志文件时,Exchange 不会将该数据库签名写入到日志文件头,而会将其列在日志文件中间部分的附加记录中。Exchange 在创建日志文件时生成日志文件头,此后再不对其进行更新。因为 Exchange 仅在日志头中记录创建新日志时所附加的数据库签名,所以新附加的数据库会出现在下一个日志文件头中。

在不同时间附加到单个日志文件流的数据库可能有多个。无论有多少个数据库附加到日志系列,日志签名都保持不变。通常,Exchange 会在给定的事务日志文件中交替记录面向多个数据库的操作。在日志文件重播期间,每个数据库将仅应用那些适用于自身的事务。

不像日志签名,数据库签名可以在数据库生存期内发生更改。如果对数据库进行修复 (Eseutil/p) 或者执行脱机碎片整理 (Eseutil/d),则数据库的签名将发生更改。执行这些操作后,会特意更改签名以防止重播与旧数据库签名关联的日志文件。就日志文件重播而言,用 Eseutil.exe 对数据库进行修复或碎片整理会导致生成一个与操作前已存在的数据库不同的数据库。


现在假设您有一个数据库和一个日志文件集。要了解这些日志是否与该数据库关联,请执行以下操作:

  1. 使用 Eseutil/mh 检查数据库头,要特别注意以下三行:
    • DB 签名
    • 日志签名
    • 所需日志
  2. 使用在步骤 1 中找到的信息来确定哪个日志文件最可能是重播所需的第一个日志文件。如果无法找到编号相匹配的日志文件,则检查 Enn.log 文件的 lGeneration 值来确定其是否匹配。
    将此日志文件的签名与数据库头中的 Log Signature 值进行匹配。如果匹配,则该日志文件很可能是所需的日志文件。(这并不是一种完全可靠的测试,但几乎总是奏效。如果管理员要装入多个相互排斥的日志文件备份和数据库,然后以正确方式,将这些文件集混合在一起,则可能产生不匹配的日志文件通过测试的情况。)
  3. 验证后续可用日志是否都属于同一系列。使用 Eseutil /ml Enn 命令对当前文件夹进行扫描以查找所有其名称以 Enn 开头的日志文件,并报告已损坏的日志、creation time/prev gen time 不匹配项以及丢失的日志文件。
    另外一种方法是,检查每个日志头并验证所有日志中的所有签名是否匹配,也就是日志头中的 lGeneration 值是否是连续序列,以及每个日志头中的 Creation Time 值与每个后续日志的 Prev Gen Time 是否相匹配。