了解命名属性和副本标识符限制对 Exchange 数据库的影响

 

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

上一次修改主题: 2012-03-26

Microsoft 将消息 API (MAPI) 作为连接不同消息传输组件的方式。MAPI 规范将大多数对象作为属性的形式呈现。若要标识这些属性,MAPI 使用标识符(称为属性标识符或 PropID)。

属性标识符是一组范围从 1 到 0xFFFF 的十六进制值。这样允许使用 65,534 个属性。这些属性分为以下组(称为范围):

  • 可传输属性 - 此范围由 Exchange 可以随邮件一起发送的属性组成。

  • 内部属性 - 此范围由仅可能由 Exchange 设置的属性组成。

  • 不可传输属性 - 此范围代表 Exchange 传递邮件时未在组织外部传递的属性。

这些范围中的属性称为标准属性。标准 MAPI 属性具有固定的 ID 并代表所有低于 0x8000 的属性。

除了这些范围以外,还有其他范围。此范围是最大的范围并代表所有等于或高于 0x8000 的属性。此范围中的属性称为命名属性。命名属性为供应商提供一种扩展标准 MAPI 属性集的方式,方法是添加其自己的属性。

命名属性由以下两个主要类型组成:

  • 具有名称的数目的属性。这些是程序(如 Microsoft Outlook)使用的属性。这些属性名称通常在源文件中定义。

  • 具有名称的字符串值的属性。这些属性称为“字符串命名属性”。除了名称以外,这些属性中的每个属性都有相关联的 GUID。这允许开发人员将命名属性划分成属性集。

由于没有为命名属性分配特定的 ID,MAPI 提供了一个工具,可以动态为命名属性创建唯一 ID 并保持命名属性与其唯一 ID 之间的持久映射。但是,动态创建这些 ID 意味着命名属性的属性 ID 会由于计算机的不同而有所不同。

Microsoft Exchange 信息存储服务可以维护每个数据库的命名属性表。信息存储处理包含自定义信息的邮件时,对于以前未处理过的任何自定义属性,该存储会自动向命名属性表中添加条目。

通过 Internet 发送的邮件以称为 Message/RFC822 的格式传输。这个文本格式包含纯文本邮件和含有一组密钥和值对的头。RFC822 包括支持一组称为 X-header 的属性。

为将邮件从 Message/RFC822 格式转换到 MAPI 格式,Exchange 使用称为 Imail 的组件。Imail 从 RFC822 邮件中取出密钥值对,并且,如果可能,将密钥值对转换为 MAPI 属性。Imail 也提供互逆转换,采用 MAPI 属性并将其转换为 RFC822 密钥值对。

从 Microsoft Exchange 2000 Server 开始,Imail 组件包括支持称为“Ad-hoc”头的头。这些是 Exchange 保留用于以后可能使用的头。临时头定义中包含的一个头类型是 X-header。因此,Exchange 存储 X-header 信息以备以后使用。

例如,如果某家公司执行的新应用程序与 Exchange 集成并使用 SMTP X-header,则 Microsoft Exchange 信息存储服务在处理包含 X-header 的第一封邮件时,会为该自定义信息创建命名属性。

note注意:
包含同一 X-header 的任何后续邮件都不会导致 Exchange 创建其他命名属性。

Exchange 将包含该特定 X-header 的邮件与这些命名属性存储在一起。Microsoft 已发布 PS_INTERNET_HEADERS 命名空间将通过 Internet 接收的邮件中的 X-header 进行分组。

命名属性限制

下表总结了有关命名属性的一些要点:

  • X-header 是承载某些重要值的 Message/RFC822 邮件中的字段。

  • 命名属性是 Exchange 用于为特定值保留 ID 的方法。

  • 命名属性属于范围从 0x8000 到 0xFFFF 的属性标识符。因此,对于可能在消息数据库 (MDB) 中创建的命名属性,存在数量上的限制。

  • 命名属性在分配后不可取消分配。该属性仍然保留用于特定名称和 GUID 组合。

    note注意:
    从技术上来说,可以恢复已分配的命名属性。但是,该过程不可实现并且要求卸除 MDB,因为该过程用于检查每封邮件以确定哪些属性未被使用。

由于可用命名属性的数量为固定数量,因此 Exchange 使用配额系统跟踪已分配命名属性的数量。在此系统中,当可用命名属性 ID 接近用尽时,Store.exe 进程会向您发出警告。当达到另一阈值时,Store.exe 进程不再分配命名属性 ID。

命名属性用尽

尽管许多程序都使用命名属性,但 Microsoft Outlook 是使用命名属性最大的用户。当命名属性 ID 用尽时,Outlook 无法映射命名属性。在此方案中,您会遇到类似于以下内容的症状:

  • 事件 ID 9666 和 9667 记录在应用程序日志中。有关详细信息,请参阅Exchange 数据库用尽命名属性或副本标识符时收到事件 9666、9667、9668 和 9669

  • 不会传递所包含属性无法被映射的邮件。检查受影响邮件的邮件跟踪信息时,您会注意到类似于以下内容的信息:

    550 5.2.0 STOREDRV.Deliver:Microsoft Exchange 信息存储服务报告错误。下列信息应有助于识别导致此错误的原因:

  • 当在 Outlook 中安装将命名属性或 X-header 添加到消息的外接程序时,某些邮件可能不会被发送到组织中的其他用户。在此方案中,发送用户收到类似于以下内容的未送达报告 (NDR):

    该邮件到达收件人的电子邮件系统,但是拒绝传递。试图重新发送该邮件。如果发送仍然失败,请与系统管理员联系。

副本标识符

限制命名属性可用性的问题也会影响公用文件夹副本标识符。每个数据库最多可拥有 32,767 个属性 ID。如果特定的数据库达到此限制,则 Exchange 无法再创建任何新的属性 ID。

如果邮箱数据库中出现此问题,则必须创建一个新的邮箱数据库,将所有邮箱移动到新的数据库中,并删除已达到属性 ID 限制的邮箱数据库。然后,可以创建一个新的邮箱数据库,并将邮箱移回该邮箱数据库。

如果公用文件夹数据库中出现该问题,则恢复过程会比较复杂。在此方案中,必须将所有公用文件夹复制到另一台服务器并删除该受影响的公用文件夹数据库。然后,可以将内容复制回原始服务器。但是,如果已经为公用文件夹配置复制,组织中的其他公用文件夹数据库很可能也包含用尽命名属性的项目。这些数据库也有可能达到配置的 ID 限制。要解决此问题,您需要为公用文件夹配置期限,以便清除当前未访问并且可能正在占用命名属性的旧内容。此外,还可以在多个公用文件夹数据库之间分发公用文件夹数据库的内容。

默认情况下,在 Microsoft Exchange Server 2007 中,经过身份验证的用户创建的命名属性以及副本标识符的配额是 16,384。未经过身份验证的用户创建的命名属性的默认配额是 8,192。通过这些默认配额,您可以提前收到属性 ID 可能会用尽的通知。然后,可以在达到上限因而使数据库无法运行之前采取对策。因此,配额有助于尽可能地降低应用程序故障或拒绝服务恶意攻击所带来的影响。还可以配置命名属性和副本标识符数的配额。有关配置配额的详细步骤,请参阅如何为 Exchange 2007 数据库配置命名属性和副本标识符配额

Exchange 2007 SP1 和 Exchange 2007 SP2 的更新汇总 8 中的 X-Header 更改

从 Exchange Server 2007 SP1 的更新汇总 8 开始,以 Exchange 支持 X-header 的方式进行更改。

note注意:
这些更改也包括在 Microsoft Exchange 2007 Service Pack 2 (SP2)。

在早期的 Exchange 内部版本中,将 X-headers 提升到数据库级别。因此,如果特定用户将命名属性映射到数据库,则在该数据库上的其他用户会收到名称和 GUID 组合的同一属性 ID。更新汇总 8 及更高版本更新实施活动可能占用命名属性以存储 X-header 值方面的新规则。

note注意:
如果特定 X-header 值的命名属性已经提升到数据库,则更新汇总 8 及更高版本的更新将不会将其删除。保留现有的 X-header 映射。但是,如果 Exchange 收到的邮件包含从未提升到数据库的 X-header,则新 X-header 提升规则将起作用。

使用新的 X-header 提升规则,许多会导致占用新命名属性以保留 X-header 数据的方案将不再起作用。下列各部分介绍其中的某些方案。

不再占用命名属性以保留 X-headers 的方案

匿名提交

来自 Internet 的匿名电子邮件不再占用 X-header 的命名属性。尽管来自匿名电子邮件的现有 X-header 信息被保留,但 X-header 的值不再作为电子邮件的属性保存。

嵌入邮件

将嵌入邮件功能作为 MAPI 应用程序的互操作性功能进行创建。使用此功能,您可以设置信封或顶级属性。嵌入邮件不再占用新的命名属性。

日记邮件

日记邮件代表 Exchange 中最大数量的 X-header 占用。以如下方案为例:

  • 在组织中您有 100 个数据库和一个日记数据库。

  • 每月通过 Internet 将每个消息数据库 (MDB) 暴露给 100 个新的 X-header。

在此方案中,每月日记 MDB 受 100 x 100 个新的 X-header 支配。因此,它不会花费更多的时间来用尽可用的命名属性。

note注意:
尽管日记邮件不再提升新的 X-header 映射,但日记内容仍然按预期进行保存。例如,仍然保存日记报告和邮件。

仍然占用命名属性以保存 X-headers 的方案

经过身份验证的用户

经过身份验证的用户仍然可以创建其 X-headers 将被提升的邮件。

MAPI 应用程序

MAPI 应用程序仍然可以创建命名属性。(位于 PS_INTERNET_HEADERS 命名空间的这些属性就是 X-header)。使用属性映射的 Exchange Web 服务应用程序也可以创建命名属性。这些属性也可能是 X-header。

note注意:
无须更改使用 MAPI 中 X-header 的应用程序。该应用程序应正确请求命名属性组合的 ID。例如,该应用程序应请求 PS_INTERNET_HEADERS 和“X-<HeaderString>”。

如果在请求中使用 MAPI_CREATE 标志,则该应用程序会自动将特定的 X-header 添加到保留在 MDB 中的 X-header 列表。同样,如果应用程序通过在 PS_INTERNET_HEADERS 命名空间中创建命名属性映射,设置 MAPI 中的 X-header,则其已为 X-header 创建映射。Exchange 将为传入邮件保留此映射并为传出邮件产生映射。

important要点:
如果应用程序请求命名属性 ID 时不使用 MAPI_CREATE,并且如果该应用程序请求属于 PS_INTERNET_HEADERS ID 命名空间的名称,并且另一客户端尚未请求此 ID,则此应用程序将不会运行。但是,已授权的客户端或 MAPI 客户端按名称请求 X-header 之后,应用程序将运行。

Exchange 2010 中的属性更改

Exchange Server 2010 包括解决此文档中所描述问题的其他改进。在 Exchange 2010 中,将命名属性资源移动到邮箱级别而不是数据库级别。

详细信息

有关管理数据库的详细信息,请参阅管理存储组和数据库

有关 Exchange 2007 中的安全性和保护功能的详细信息,请参阅安全和保护