使用传输服务器上的队列数据库

 

适用于: Exchange Server 2007 SP3, Exchange Server 2007 SP2, Exchange Server 2007 SP1, Exchange Server 2007

上一次修改主题: 2007-08-21

队列是临时存放等待进入下一个处理阶段的邮件的位置。每个队列代表一个 Exchange 传输服务器按照特定顺序处理的邮件的逻辑组。队列只存在于安装了集线器传输服务器角色或边缘传输服务器角色的计算机上。

Microsoft Exchange Server 2007 使用单个可扩展存储引擎 (ESE) 数据库存储队列邮件。ESE 以前称为 JET,该方法定义 Exchange Server 中基础数据库结构的低级 API。

以下方案可能导致包含未传递邮件的队列数据库所在的集线器传输服务器或边缘传输服务器无法响应。

  • 当队列中存在未传递的邮件时,Exchange 传输服务器失败。而且,不能及时使服务器重新进入联机状态。

  • Exchange 传输服务器的队列数据库具有很多碎片,该数据库会变得很大,从而占用所有可用的硬盘驱动器空间。

可以将该队列数据库及其关联的事务日志文件移动到目标 Exchange 传输服务器上的临时位置,修复队列数据库,并替换目标 Exchange 传输服务器上的现有队列数据库,然后启动目标 Exchange 传输服务器上已修复的队列数据库。此目标 Exchange 传输服务器可位于 Exchange 组织中,也可位于不同的 Active Directory 目录服务林中。

开始之前

若要执行下列步骤,必须为您使用的帐户委派下列角色:

  • Exchange Server 管理员角色

若要在安装了边缘传输服务器角色的计算机上执行以下步骤,必须使用作为该计算机上的本地 Administrators 组成员的帐户进行登录。

有关管理 Microsoft Exchange Server 2007 所需的权限、角色委派以及权利的详细信息,请参阅权限注意事项

对队列数据库及其关联文件执行任务时,例如,将队列数据库移动到目标服务器或执行脱机修复和碎片整理时,请确保您对队列数据库所在的目录拥有以下列表中的权限:

  • Network Service:完全控制

  • System:完全控制

  • Administrators:完全控制

选择用于接收已恢复的队列数据库的目标 Exchange 传输服务器应该与源 Exchange 服务器安装了相同的 Exchange 2007 Service Pack 和安全更新。

如果能满足此条件,则应该选择一个与源服务器具有相同传输服务器角色的目标 Exchange 传输服务器来接收已恢复的队列数据库。如果存在下列任一情况,则可能发生意外的邮件传递行为:

  • 在与源服务器具有不同的服务器角色的 Exchange 传输服务器上启动已恢复的队列数据库。

  • 在位于不同 Active Directory 林中的 Exchange 传输服务器上启动已恢复的队列数据库。

例如,在邮箱传递队列中等待传递的邮件现在要求使用远程传递队列传递。以前的远程地址现在可能是本地地址,而以前的本地地址可能是远程地址。准备好处理在无法访问的队列中出现邮件。可能必须通过分类程序手动重新提交邮件。有关信息,请参阅如何重新提交队列中的邮件

恢复目标 Exchange 传输服务器上的队列数据库

恢复队列数据库的基本步骤如下:

  1. 将队列数据库移动到目标 Exchange 传输服务器上的临时位置。

  2. 使用 Exchange Server 数据库实用程序 (Eseutil.exe) 执行队列数据库的恢复。

  3. 使用 Eseutil 执行队列数据库的脱机碎片整理。

  4. 准备由已恢复的队列数据库替换目标 Exchange 传输服务器上的现有队列数据库。

  5. 在目标 Exchange 传输服务器上启动已修复的队列数据库。

将队列数据库移动到目标传输服务器上的临时位置

默认情况下,队列数据库和事务日志位于 C:\Program Files\Microsoft\Exchange Server\TransportRoles\data\Queue 中。队列数据库位置和事务日志位置在 EdgeTransport.exe.config 应用程序配置文件中配置,该配置文件位于 C:\Program Files\Microsoft\Exchange Server\Bin 中。QueueDatabasePath 参数控制数据库文件的位置,QueueDatabaseLoggingPath 参数控制事务日志的位置。

队列数据库由下列文件组成:

  • Mail.que   队列数据库文件。

  • Trn.chk   检查点文件。

事务日志由下列文件组成:

  • Trn.log   当前事务日志文件。

  • Trntmp.log   提前创建的下一个提供的事务日志文件。

  • Trnnnn.log   其他事务日志文件,它们是在 Trn.log 达到 EdgeTransport.exe.config 应用程序配置文件中的 QueueDatabaeLoggingFileSize 参数指定的最大大小时创建的。默认为 5 MB。

  • Trnres00001.jrs   占位符日志文件。

  • Trnres00002.jrs   占位符日志文件。

  • Temp.edb   虽然此队列数据库架构验证文件不是事务日志文件,但它却与事务日志文件位于同一个位置。

将队列数据库移动到集线器传输服务器或边缘传输服务器

  1. 停止具有受影响的队列数据库的 Exchange 传输服务器上的 Microsoft Exchange 传输服务。

    • 在命令提示符下或 Exchange 命令行管理程序中键入以下命令:

      Net Stop MSExchangeTransport
      
  2. 将所有队列数据库和事务日志文件移动到目标集线器传输服务器或边缘传输服务器上的临时目录。对于此示例,该目录将是:C:\QueueRecovery。

  3. 修复受影响的 Exchange 2007 传输服务器后,重新启动 Microsoft Exchange 传输服务时会新建队列数据库。在完成将队列数据库文件复制到目标传输服务器后,随时可能发生此类情况。

有关队列数据库文件的详细信息,请参阅管理队列数据库

使用 Eseutil 执行队列数据库的恢复

在尝试启动目标传输服务器上的队列数据库之前,应该使用 Eseutil 执行数据库恢复。由于队列数据库使用循环日志记录,所以无法使用 Eseutil /C 还原模式将旧的事务日志重播到数据库中。但是,可以使用 Eseutil /R 恢复模式执行数据库恢复。可以使用 Eseutil 脱机维护和修复队列数据库。

note注意:
Eseutil 位于 C:\Program Files\Microsoft\Exchange Server\Bin 中。此目录在该路径中定义。因此,可以键入命令而无需指定完整的路径。

恢复过程读取检查点文件并将事务日志中未提交的事务提交到队列数据库。如果不存在检查点文件,则从事务日志中可用的最早日志文件条目开始重播。

使用 Eseutil 执行队列数据库恢复

  1. 在命令提示符下或 Exchange 命令行管理程序中,打开 C:\QueueRecovery 目录。

  2. 运行以下命令:

    Eseutil /r Trn /d. /8
    

    Trn 指示由 3 个字符组成的日志基文件名称。/8 设置 8 KB 数据库页面大小以更快恢复。/d. 指示要恢复的数据库存在于当前目录中。

    note注意:
    对于大型队列数据库,数据库恢复可能花费很长时间。

有关如何使用 Eseutil 恢复数据库的详细信息,请参阅 Eseutil /R 恢复模式

使用 Eseutil 执行队列数据库的脱机碎片整理

执行队列数据库的恢复后,建议还使用 Eseutil /D 碎片整理模式对数据库运行脱机碎片整理,以改善队列数据库的整体运行状况和性能。ESE 数据库的脱机碎片整理可以回收空数据库空白空间,并能减少数据库文件的大小。

使用 Eseutil 执行队列数据库的脱机碎片整理

  1. 在命令提示符下或 Exchange 命令行管理程序中,打开 C:\QueueRecovery 目录。

  2. 运行以下命令:

    Eseutil /d mail.que
    
    note注意:
    对于大型队列数据库,脱机数据库碎片整理可能花费很长时间

有关如何使用 Eseutil 进行脱机数据库碎片整理的详细信息,请参阅Eseutil /D 碎片整理模式

准备由已恢复的队列数据库替换目标 Exchange 传输服务器上的现有队列数据库。

可以使用已恢复的队列数据库覆盖目标 Exchange 传输服务器上的队列数据库。但是,这将删除目标 Exchange 传输服务器上队列中的所有现有邮件。要安全地启动已恢复的队列数据库,必须首先在目标 Exchange 传输服务器上执行下列步骤:

  1. 停止到队列中的新邮件流并允许传递现有邮件。

  2. 监视邮箱传递队列和远程传递队列,直到传递了所有邮件。

  3. 重新提交或挂起并导出要保存的无法访问的队列中的所有邮件。

  4. 恢复或导出要保存的带毒邮件队列中的所有邮件。

  5. 修改 Exchange 传输服务器上的邮件过期超时,以便保留已恢复的队列数据库中的邮件。

停止到目标 Exchange 传输服务器上的队列的新邮件流并允许传递现有邮件

  • 在命令提示符下或 Exchange 命令行管理程序中,运行以下命令:

    Net Pause MSExchangeTransport
    

监视目标 Exchange 传输服务器上的邮箱传递队列和远程传递队列,直到传递了所有邮件

  • 使用队列查看器或 Exchange 命令行管理程序中的 Get-Queue cmdlet 监视目标 Exchange 传输服务器上的传递队列。等待,直到服务器上的所有传递队列中都没有剩余邮件,即邮件数为 0。

重新提交或挂起并导出要保存的目标 Exchange 传输服务器上无法访问的队列中的所有邮件

  1. 要重新提交无法访问的队列中存在的邮件,请在目标 Exchange 传输服务器上的 Exchange 命令行管理程序中运行以下命令:

    Retry-Queue -Identity "Unreachable" -Resubmit $True
    
  2. 使用队列查看器挂起要从无法访问的队列导出的所有邮件。

  3. 要将所有挂起的邮件从无法访问的队列导出到某个目录,并使用 InternalMessageID.eml 格式自动命名邮件文件,请在 Exchange 命令行管理程序中运行以下命令:

    Get-Message -Queue "Unreachable" | Export-Message -Path "<ExistingLocalDirectory>"
    

有关如何重新提交邮件的详细信息,请参阅如何重新提交队列中的邮件

有关如何挂起邮件的详细信息,请参阅如何挂起邮件

有关如何导出邮件的详细信息,请参阅如何从队列中导出邮件

恢复或导出要保存的目标 Exchange 传输服务器上带毒邮件队列中的所有邮件

  1. 要恢复带毒邮件队列中的邮件,请执行下列步骤之一:

    • 在队列查看器中,选择带毒邮件队列,选择一个邮件,并在操作窗格中选择“恢复”。

    • 在 Exchange 命令行管理程序中,运行下列命令:

      Get-Message -Queue "Poison" | ft Identity
      Resume-Message <IdentityofPoisonMessage>
      
  2. 要将所有挂起的邮件从带毒邮件队列导出到某个目录,并使用 InternalMessageID.eml 格式自动命名邮件文件,请在 Exchange 命令行管理程序中运行以下命令:

    Get-Message -Queue "Poison" | Export-Message -Path "<ExistingLocalDirectory>"
    
note注意:
带毒邮件队列包含确定在服务器出现故障后对 Exchange 2007 系统有害的邮件。这些邮件可能在其内容或格式上的确具有危害,或者可能是编写不严谨的代理的受害者,这些代理导致 Exchange 服务器在处理被当作有害的邮件时出现故障。如果您不能确定带毒邮件队列中邮件的安全,则将邮件导出到文件以便对其进行检查。如果您决定从带毒邮件队列删除邮件,则删除邮件而无需发送未送达报告 (NDR)。NDR 可能包含原始邮件的内容。带毒邮件队列中的邮件已处于挂起状态。因此,在导出邮件之前不必挂起它们。不能使用带有 Resubmit 参数的 Retry-Queue cmdlet 重新提交带毒邮件队列。要重新提交带毒邮件队列中的邮件,请使用队列查看器恢复邮件,或使用 Resume-Message cmdlet。

有关如何恢复邮件的详细信息,请参阅如何恢复邮件

修改目标 Exchange 传输服务器上的邮件过期超时以保留已恢复的队列数据库中的邮件

  • 在 Exchange 命令行管理程序中运行以下命令:

    Set-TransportServer -MessageExpirationTimeout <LongerTimeOutIntervalIndd.hh:mm:ssFormat>
    

    默认情况下,任何未传递的邮件将连同 NDR 一起返回给发件人,并从队列中删除。如果出现下列任一情况,则必须增加邮件过期超时间隔:

    • 试图恢复的队列数据库脱机时间已达两天以上。

    • 队列数据库在其恢复后的两天内未完成邮件传递。

    这会阻止启动队列数据库后或重新启动的数据库传递旧邮件时立即删除邮件。

有关邮件过期的详细信息,请参阅管理邮件重试间隔、重新提交间隔和过期间隔

启动目标 Exchange 传输服务器上已修复的队列数据库

启动目标 Exchange 传输服务器上已恢复的队列数据库

  1. 在命令提示符下或 Exchange 命令行管理程序中,对目标 Exchange 传输服务器运行以下命令:

    Net Stop MSExchangeTransport
    
  2. 使用“C:\QueueRecovery”中的所有文件覆盖目标 Exchange 传输服务器上所有的现有空队列数据库文件和事务日志文件。默认情况下,队列数据库和事务日志存在于 C:\Program Files\Microsoft\Exchange Server\TransportRoles\data\Queue 中。

  3. 在命令提示符下或 Exchange 命令行管理程序中,运行以下命令:

    Net Start MSExchangeTransport
    

恢复之后的配置任务

在目标 Exchange 传输服务器上启动已恢复的队列数据库时,邮件应该开始流动。以下列表说明可能遇到的潜在问题:

  • 如果已恢复的队列数据库来自出现故障的 Exchange 2007 服务器,则准备处理带毒邮件队列中的邮件。对于带毒邮件队列中的每个邮件,您必须决定该邮件是否的确导致了 Exchange 2007 服务器失败或该邮件是否不必要地放入了带毒邮件队列。您可以决定是恢复邮件还是将其导出以进行检查。如果您不能确定带毒邮件队列中邮件的安全,应将邮件导出到文件以便对其进行检查。如果决定从带毒邮件队列删除邮件,则删除邮件而无需发送未送达报告 (NDR)。NDR 可能包含带毒邮件的内容。

  • 准备处理无法访问的队列和传递队列中滞留在重试状态的邮件。您应该手动重新提交这些邮件。

  • 如果决定删除存在传递问题的邮件,则必须决定删除邮件时是否发送 NDR。如果删除邮件并发送 NDR,则 NDR 邮件本身需要传递。另外,NDR 邮件本身可能具有自己的传递问题。您可以决定删除问题邮件而无需发送 NDR。有关如何删除邮件的详细信息,请参阅如何从队列中删除邮件

  • 您应该考虑是永久保留目标 Exchange 传输服务器上已恢复的队列数据库还是在传递所有受限制的邮件后用新队列数据库替换该数据库。只要启动已恢复的队列数据库,新邮件就在 Exchange 传输服务器的定期邮件传递活动中进入队列。如果决定使用新的副本替换该队列数据库,则必须按以下步骤操作:

    1. 暂停 Microsoft Exchange 传输服务以将现有邮件全部发出。在暂停期间,将不接受新邮件。

    2. 停止 Microsoft Exchange 传输服务。

    3. 删除所有队列数据库文件和事务日志文件。

    4. 启动 Microsoft Exchange 传输服务。

详细信息

有关详细信息,请参阅下列主题: