Exchange Server灾难恢复的真实记录

12/3/2006来源:Exchange Server人气:7208

一、Alarm! Disaster is Fall……

糟糕的事情总是在人们最不想它出现的时候出现。这天,那台4400的服务器,就这样忽然死亡了……

据在现场的同事描述,服务器忽然变慢,停止了网络服务,直到停止一切响应。

为了恢复服务,他们只有重新启动该服务器。强制重新启动服务器后,出现蓝屏,系统报告stop: 0x0000007b错误,inaccessable_boot_device。一开始我以为只是MBR坏了或者ntldrNTdetect.com坏了,那样的话我只需要在故障恢复台里面使用fixmbrfixboot来修复。由于服务器使用的是硬件RAID,只能在光盘启动时使用F6加载RAID的启动,然后进入故障恢复台,看看是否能否访问系统分区。进去后大惊,用diskpart可以看到系统分区,但是系统分区不再可读了,dir命令无法枚举任何文件和目录。

说到这里,要介绍一下该服务器的环境了。这台Windows 2000 Advanced Server是这个域(下文使用domian.com命名)的第一台Domain Controller,五个操作主机角色(FSMO)都在上面。限于条件,上面运行了Exchange Server 2000,也用作了File Server/PRinter Server。另外还有DHCP/WINS/DNS。备份的磁带,容量不足以完成完整备份……所以说,服务器的退出服务,对于我们是一场真正的灾难。如果没有其他的Domain Controller,可能我们要忙上好长时间了。就是因为还有其他Domain Controller,我们还有一线希望!

二、Mission Impossible? Impossible is Nothing!

0、使用其它服务器替代网络服务

客户所受的影响必须降到最小。由于网络中使用DHCP服务器为客户机分配地址和提供网络信息,我们必须先解决客户机DHCP租约到期更新的问题。

原先我们只有这一台DHCP服务器,而现在它坏掉了。于是我们在另外的Server上安装了DHCP,划分的地址范围是原先的20%。这样做的理由是到期更新租约的客户机毕竟不是很多,当然也可以根据租约时间长短和客户机的数量自行调整,更新越快,划分的地址越多。

同时,我们安装了WINSDNS,并且为DNS添加了原先手动设置的区域和记录。

1、恢复域控制器

Active Directory是基于Windows 2000网络环境的基石。有太多的信息保存在这里,有了Active Directory,我们可以恢复相当多的服务器配置信息,比如DNS的配置之类。所以我们首先要考虑的,就是恢复主机角色。

顺便介绍一下主机角色。Active Directory 定义了五种操作主机角色(FSMO):

架构主机 schema master

域命名主机 domain naming master

相对标识号(RID)主机 RID master

主域控制器模拟器 PDCE

基础结构主机 infrastructure master

架构主机是可以更新目录架构的唯一域控制器。架构更新会从架构主机复制到活动目录森林中的所有其它域控制器。整个森林中只有唯一一台架构主机。

域命名主机是可以执行以下任务的唯一域控制器:在森林中添加或删除域,添加或删除描述外部目录的交叉引用对象。

相对标识号(RID)主机是负责向其它域控制器分配RID池的唯一一台服务器。在创建安全主体(例如用户、组或计算机,也可以理解成账号)时,需要将RID与域内的标识符结合来创建唯一的安全标识符(SID)。每一个域控制器都会收到用于创建对象的RID池(默认为512)。RID主机通过分配不同的池来确保这些ID在每一个域控制器上都是唯一的。通过RID主机,还可以在同一森林中的不同域之间移动对象。

域命名主机是基于森林的,整个森林中只有一个域命名主机。相对标识号(RID)主机是基于域的,森林中的每个域都有自己的相对标识号(RID)主机。

主域控制器模拟器(PDCE)主要实现向后兼容低级客户端和服务器,也就是允许在Windows 2000域中使用Windows NT备份域控制器(BDC)。本机模式Windows 2000环境里会将密码更改转发到PDCE。域控制器验证密码失败后,会与PDCE联系,以检查该密码是否可以通过验证。因为也许密码的更改还没有被复制到当前验证登录的域控制器中。森林中各个域的PDCE都会与森林的根域中的PDCE进行同步。PDCE是基于域的,森林中的每个域都有自己的PDCE

基础结构主机确保所有域间操作对象的一致性。当引用另一个域中的对象时,此引用包含该对象的全局唯一标识符(GUID)、安全标识符(SID)和可分辨的名称(DN)。如果被引用的对象移动,则在域中担当结构主机角色的域控制器会负责更新该域中跨域对象引用中的SIDDN。基础结构主机是基于域的,目录林中的每个域都有自己的基础结构主机

默认的,这五种FSMO存在于森林根域的第一台域控制器(主域控制器)上,而子域中的相对标识号(RID)主机、PDCE 、基础结构主机存在于子域中的第一台域控制器。

[1] 清除原有Domain Controller的信息

因为这台服务器已经不再可用,我们必须重新安装,所以需要将原来的服务器的数据从ACTIVE DIRECTORY中删除。

完成这个目标,需要使用ntdsutil这个工具。(为便于阅读,这些命令已折行,粗斜体为输入内容)

c:\>ntdsutil

ntdsutil: metadata cleanup

metadata cleanup: select Operation target

select operation target: connections

server connections: connect to domain domain.com

select operation target: list sites

Found 1 site(s)

0 - CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=domain,DC=com

select operation target: select site 0

Site - CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=domain,DC=com

No current domain

No current server

No current Naming Context

select operation target: list domains in site

Found 1 domain(s)

0 - DC=domain,DC=com

select operation target: select domain 0

Site - CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=domain,DC=com

Domain - DC=domain,DC=com

No current server

No current Naming Context

select operation target: list servers for domain in site

Found 2 server(s)

0 - CN=DC1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,

DC=domain,DC=com

1 - CN=DC2,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,

DC=domain,DC=com

select operation target: select server 0

select operation target: quit

metadata cleanup: remove selected server

出现对话框,询问你是否确定删除该DC。按“确定”删除DC1主控服务器。

metadata cleanup: quit

ntdsutil: quit

Active Directory users and computers中删除Domain controllersDC1服务器对象,可以使用ADSI EDIT工具。ADSI EDITWindows 2000 support tools中的工具,你需要安装Windows 2000 support tool,安装程序在windows 2000光盘中的support\tools目录下。在DC2上打开ADSI EDIT工具,展开Domain NC[DC2.domain.com],展开OU=Domain controllers,右击CN=DC1,然后选择Delete,把DC1服务器对象删除。

Active Directory Sites and Service中删除DC1服务器对象,可以打开Administrative tools中的Active Directory Sites and Service,展开Sites,展开Default-First-Site-Name,展开Servers,右击DC1,选择Delete,单击“确认”按钮确认。

[2] 在额外域控制器上通过ntdsutil.exe工具夺取五种FMSO

(为便于阅读,这些命令已折行,粗斜体为输入内容)

c:\>ntdsutil

ntdsutil: roles

fsmo maintenance: select operation target

select operation target: connections

server connections: connect to domain domain.com

select operation target: list sites

Found 1 site(s)

0 - CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=domain,DC=com

select operation target: select site 0

Site - CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=domain,DC=com

No current domain

No current server

No current Naming Context

select operation target: list domains in site

Found 1 domain(s)

0 - DC=domain,DC=com

select operation target: select domain 0

Site - CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=domain,DC=com

Domain - DC=domain,DC=com

No current server

No current Naming Context

select operation target: list servers for domain in site

Found 1 server(s)

0 - CN=DC2,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,

DC=domain,DC=com

select operation target: select server 0

select operation target: quit

fsmo maintenance: seize domain naming master

出现对话框,按“确定”

fsmo maintenance: seize infrastructure master

出现对话框,按“确定”

fsmo maintenance: seize PDC

出现对话框,按“确定”

fsmo maintenance: seize RID master

出现对话框,按“确定”

fsmo maintenance: seize schema master

出现对话框,按“确定”

fsmo maintenance: quit

ntdsutil: quit

(注:Seize用于原FSMO不在线时操作,如果原FSMO在线,则需要使用Transfer操作)

[3] 设置额外控制(DC2.domain.com%26, , amp;, , lt;, , /SPAN>)为GC(全局编录)

打开Administrative Tools中的Active Directory Sites and Services,展开Sites,展开Default-First-Site-Name,展开Servers,展开DC2.domain.com(额外控制器),右击NTDS Settings选择Properties,然后在“Global Catalog”前面打勾,单击“确定”按钮,然后重新启动服务器。

[4] 重新安装并恢复损坏的主域控制器

修复DC1.domain.com之后,在DC1.domain.com服务器上重新安装Windows 2000 Server。基本上按照原来的服务器配置安装组件,但是先不要安装“证书服务”(安装“证书服务”后,无法进行有关改名和域的操作)。安装好Windows 2000 Server之后,再运行dcpromo升级为额外的域控制器;如果需要DC1.domain.com担任五种FMSO角色,通过ntdsutil工具进行角色转换,使用Transfer操作(注意:这时DC2在线,不能用Seize,只能Transfer)。完成后再安装“证书服务”。

通过Active Directory Sites and Services设置DC1.domain.comGC,而取消DC2.domain.comGC。至此,修复Active Directory部分。

(注:建议domain naming master同时必须作为GC,而不和RID master使用同一台Domain Controller

2、恢复邮件服务器

由于Exchange Server会扩展Active DirectorySchema,将配置信息保存在Active Directory中,所以我们不能简单地重新安装了事。那样会覆盖掉以前的所有配置信息,包括地址簿结构、邮件存储还有其他的非邮件存储数据。让我们一步一步地来尝试修复。

[1] 安装Exchange Server

为了适应灾难恢复环境下的安装,Exchange Server以及后面的Exchange Server Service Pack的安装文件都提供了 /disasterrecovery 参数来实现灾难恢复环境下的系统修复。

我们需要将系统恢复到崩溃前的状态,如果安装了SPPatch,新的系统也要安装相同的SPPatch

安装组件的选择也很重要,必须与崩溃时的系统所安装的组件一致。所以,日常维护中记录软件的安装配置也是一项很重要的工作。

在这个例子中,安装好邮件服务器后,依次安装SP3还有Rollout,恢复到崩溃之前的软件安装。

[2] 修复邮件存储

Exchange Server 2000 发生损坏时,信息存储是最容易受到影响的组件之一。实际上Windows家族的很多设计为永远在线工作的数据库,都使用了Exchange数据库引擎。信息存储由下列四个数据库文件组成:

Priv1.edb

Priv1.stm

Pub1.edb

Pub1.stm

Priv1.edb 数据库文件包含简单邮件传输协议 (SMTP) 邮件,其中包括正在传送的邮件和存储在服务器上的邮件。Priv1.stm 数据库文件包含正在传送的邮件和存储的非 SMTP邮件。Pub1.edb 数据库文件包含用于SMTP 格式信息的公用文件夹存储。Pub1.stm包含用于非SMTP格式数据的共用文件夹存储。

我们的邮件服务器是stand alone的,没有使用站点连接器,也没有安装密钥管理。所以,我们选择了KB313184的恢复流程。

由于我们的数据库是异常退出,所以需要确认数据库的一致性。如果数据库是一致的,则所有日志文件都已提交给信息存储。如果数据库不一致,则数据库可能未损坏。相反,日志文件可能丢失、被损坏或尚未提交到数据库。

我们运行下面的eseutil命令以检查公用和专用数据库的一致性(为便于阅读,这些命令已折行,粗斜体为输入内容)。

C:\Program Files\exchsrvr\BIN>eseutil /mh "C:\Program Files\exchsrvr

\MDBDATA\priv1.edb"
C:\Program Files\exchsrvr\BIN>eseutil /mh "C:\Program Files\exchsrvr

\MDBDATA\pub1.edb"

注意:这里假设正在从C盘上的Program Files\ExchSrvr\Bin文件夹中运行程序,并且.edb文件位于Program Files\ExchSrvr\Mdbdata文件夹中,如果执行了升级,这些数据库文件可能位于C:\Exchsrvr\Mdbdata文件夹中。如果优化了数据库,则这些文件可能位于另一驱动器上,可根据实际情况自行替换。

要验证.edb文件是否一致,请检查标有“State”的输出行。为了方便观察可以在前面的命令行后面分别加上“> mypriv.txt”和“> mypub.txt”,生成两个文本文件。或者使用| more”参数来逐屏输出。

在我们的例子里,服务器上的数据库state是“Dirty Shutdown”,所以需要对数据库进行软故障恢复,以检查 Mdbdata 文件夹中是否存储了日志文件的副本。

注意:以下步骤并不是按操作顺序排列的,也不是每一步都必须执行的,修复邮件存储,需要根据实际情况选择一步或者几部执行!

(a) 保存有日志文件的存储恢复

执行软故障恢复时,所有未提交的日志文件都将被提交给信息存储数据库。打开数据库和日志文件所驻留的文件夹,然后在命令提示符处键入下面的内容(为便于阅读,这些命令已折行,粗斜体为输入内容):

C:\Program Files\exchsrvr\MDBDATA>"C:\Program Files\exchsrvr

\BIN\eseutil.exe" /r E00

单击“”运行修复。实用工具将显示下面的消息:

Microsoft(R) Exchange Server(TM) Database Utilities

Version 6.0

Copyright (C) Microsoft Corporation 1991-2000. All right reserved.

Initiating RECOVERY mode...

Logfile base name:E00

Log Files:(current directory)

System files:(current directory)

Performing soft recovery...

完成软故障恢复之后,程序将显示下面的消息:

Operation completed successfully in x.xxx seconds.

可再次运行 eseutil /mh 命令。如果公用信息存储和专用信息存储的状态都更改为“一致”,表明数据库已经修复。

(b) 无日志文件或者日志文件损坏的存储恢复

如果eseutil /r 命令未恢复数据库到一致状态,请使用硬故障恢复(强制状态恢复)命令。(注意:该命令可能会丢失某些 Exchange 2000 数据,其中包括尚未提交给信息存储数据库的日志文件中所包含的消息。Microsoft 建议,只有在执行软故障恢复后公用信息存储或专用信息存储仍没有恢复到一致的状态时,才使用此命令。)

在命令提示符处,键入下列命令(为便于阅读,这些命令已折行,粗斜体为输入内容):

Priv1.edb 文件恢复到一致状态:

C:\Program Files\exchsrvr\MDBDATA>"C:\Program Files\exchsrvr\BIN\eseutil" /p priv1.edb

Pub1.edb 文件恢复到一致状态:

C:\Program Files\exchsrvr\MDBDATA>"C:\Program Files\exchsrvr\BIN\eseutil" /p pub1.edb

单击“”运行修复。实用工具将显示下面的消息:

Microsoft(R) Exchange Server(TM) Database Utilities

Version 6.0

Copyright (C) Microsoft Corporation 1991-2000. All right reserved.

Initiating REPAIR mode...

Database:priv1.edb

Streaming File:priv1.stm

Temp.Database:TEMPREPAIR1820.EDB

Checking database integrity.

Scanning Status (% complete)

0 10 20 30 40 50 60 70 80 90 100

|----|----|----|----|----|----|----|----|----|-----|

....................................................

修复过程中将自动包括.stm 文件。在完成此过程之后,程序将显示下面的消息:

Integrity check successful.

(c) 进行邮件存储的脱机碎片整理

建议对修复的数据库文件执行碎片整理。特别是磁盘空间不足的时候。可以在另外的机器上执行这种脱机碎片整理工作。如果对 Pub1.edb 文件和 Priv1.edb 文件都运行了软故障恢复过程,请分别对这两个文件运行下面的碎片整理命令(为便于阅读,这些命令已折行,粗斜体为输入内容)。

Priv1.edb 进行碎片整理:

C:\Program Files\exchsrvr\BIN>eseutil /d

C:\Program Files\exchsrvr\MDBDATA\priv1.edb

Pub1.edb 进行碎片整理:

C:\Program Files\exchsrvr\BIN>eseutil /d

C:\Program Files\exchsrvr\MDBDATA\pub1.edb

注意:如果存储数据库很大,整理需要一段时间。如果提示磁盘空间不足,请将 Program File\ExchSrvr\Bin 文件夹复制到更大的磁盘,然后尝试从该位置运行此命令。

删除 Mdbdata 文件夹中的所有.log 文件、.chk 文件,然后删除 Temp.edb 文件(如果存在)。 关闭所有收发信的服务,以避免用户在修复过程中访问邮件存储。将数据库装入一次,然后立即将其卸载(Dismount)。

建议对修复的数据库文件执行碎片整理。特别是磁盘空间不足的时候。可以在另外的机器上执行这种脱机碎片整理工作。如果对 Pub1.edb 文件和 Priv1.edb 文件都运行了软故障恢复过程,请分别对这两个文件运行下面的碎片整理命令(为便于阅读,这些命令已折行,粗斜体为输入内容)。

Priv1.edb 进行碎片整理:

C:\Program Files\exchsrvr\BIN>eseutil /d

C:\Program Files\exchsrvr\MDBDATA\priv1.edb

Pub1.edb 进行碎片整理:

C:\Program Files\exchsrvr\BIN>eseutil /d

C:\Program Files\exchsrvr\MDBDATA\pub1.edb

注意:如果存储数据库很大,整理需要一段时间。如果提示磁盘空间不足,请将 Program File\ExchSrvr\Bin 文件夹复制到更大的磁盘,然后尝试从该位置运行此命令。

使用<, SPAN lang=EN-US> Isinteg.exe实用工具可对Pub1.edb 数据库和 Priv1.edb 数据库的所有区域运行测试,并报告测试结果,而且还会尝试修复遇到的任何问题。(为便于阅读,这些命令已折行,粗斜体为输入内容):

C:\Program Files\exchsrvr\BIN>isinteg -s (servername) -fix -test alltests

系统会提示您选择要检查的数据库。

Index Status Database-Name

Storage Group Name:First Storage Group

1 Offline Mailbox Store (servername)

2 Offline Public Folder Store (servername)

Enter a number to select a database or press Return to exit.

注意:Exchange 2000 不再结合使用 -patch 选项来实现 Isinteg 实用工具。修补操作将在信息存储启动时由 Store.exe 自动执行。

只能检查标记为“Offline”(脱机)的数据库。在选择一个数据库后,将出现下面的消息,提示确认我们的选择:

"You have selected First Storage Group / Mailbox Store

Continue?(Y/N)"

Press Y and Enter to start checking the selected database.

重复修复的过程,直到不报告警告、错误或修复信息,报告内容类似于以下显示:

Test reference table construction result:

0 error(s); 0 warning(s); 0 fix(es); 0 row(s); time:0h:0m:0s

Test Folder Result:

0 error(s); 0 warning(s); 0 fix(es); 101 row(s); time:0h:0m:0s

Now in test 3 (reference count verification)of total 3 tests;

100% complete.

如果连续三次出现同样的警告、错误或修复信息,可以忽略。这些错误可能是由于损坏的电子邮件附件,或者不会阻止启动信息存储的类似情况造成的。

(d) 使用ExMerge移动邮件到新的邮件存储

如果多次运行 Isinteg.exe 后仍报告同样的错误和警告,但是存储服务可以正常启动。我们可以将所有用户邮箱导出为.pst文件。然后再将这些.pst文件合并为新的Priv1.edb文件。如果使用电子邮件的脱机存储(.ost文件),必须先将.ost文件移至.pst文件中。

限制:必须要运行存储服务。ExMerge只能移动用户邮箱,不能移动特定的Exchange 2000配置属性,如连接器设置、Outlook设置或客户端规则。也不能移动通讯组列表、通讯组列表中的成员或公用文件夹。可以将公用文件夹内容移动到用户的个人文件夹中,以便在合并的.pst文件中包括公用文件夹信息。如果您尝试此过程,则必须手动重新创建或重新配置通讯组列表。

确保当前没有用户正在访问服务器邮箱,运行ExMerge

使用两步合并中的第一步,然后输入所有用户。当ExMerge过程完成之后,停止Exchange 2000信息存储服务,找到并打开 ExchSrvr\Mdbdata 文件夹,然后重命名Pub1.edbPriv1.edb文件。删除此文件夹中的所有其他文件。在确信合并成功完成之前,请务必不要删除重命名的 Pub1.edbPriv1.edb文件,以留作备份。重新启动 Exchange 2000 信息存储服务。在客户机上启动 Outlook,然后向 Exchange 2000 全球通讯簿中的所有用户发送一封电子邮件。(注意:如果未完成此步骤,ExMerge 两步合并中的第二步将不显示任何可供还原的邮箱。)

使用两步合并中的第二步运行 ExMerge,然后输入所有用户。完成此过程后,以前存储在.pst文件中的电子邮件将被移至Exchange 2000邮箱,我们将得到一个包含所有电子邮件副本的新 Priv1.edb 文件。(注意:如果用户登录到空邮箱,则帐户可能未连接到新创建的邮箱。)

要恢复公用文件夹存储,需要在客户端(如Outlook)将公用文件夹复制到该客户端上用户的个人文件夹。停止信息存储服务,然后重命名现有的 Pub1.edb Pub1.stm 文件。要创建新的 Pub1.edb,请装入公用文件夹数据库。单击“确定”创建新的 Pub1.edb。将文件夹从客户端移回服务器上的新公用文件夹结构。

接下来重新启动信息存储。

注意:必须恢复公用存储上的所有权限。在能够访问电子邮件和公用文件夹后,应尽快执行备份并验证备份是否成功。此过程还将删除到此时间点为止收到的邮件的单一实例存储。结果,Exchange 2000 数据库可能会增长,并需要更多的磁盘空间。)