内容分发的高级故障排除提示

本文提供了一些高级故障排除提示,可帮助你识别和解决内容分发问题。

原始产品版本:Configuration Manager Current Branch、Microsoft System Center 2012 Configuration Manager、Microsoft System Center 2012 R2 Configuration Manager

启用详细日志记录

  • PkgXferMgr.log

    对于包传输管理器,详细日志记录在日志中提供有关内容复制过程、文件哈希和作业计划的详细信息。 通过将以下注册表值设置为 0,可以启用详细日志记录:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Tracing\SMS_PACKAGE_TRANSFER_MANAGER\LoggingLevel

    对于包传输管理器,调试日志记录提供有关内容复制过程的详细信息。 可以通过将以下注册表值设置为 1 来启用调试日志记录:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Tracing\SMS_PACKAGE_TRANSFER_MANAGER\DebugLogging

    注意

    这些注册表更改 () 不需要重启 SMS_Executive 服务。

  • 客户端日志 (包括拉取 DP 和管理点日志)

    通过将以下注册表值设置为 0,可以启用详细日志记录:

    HKEY_LOCAL_MACHINE\Software\Microsoft\CCM\Logging\@GLOBAL\LogLevel

    可以通过将以下注册表值设置为值为 True 的REG_SZ来启用调试日志记录:

    HKEY_LOCAL_MACHINE\Software\Microsoft\CCM\Logging\DebugLogging\Enabled

    通过将以下注册表值设置为 5242880 ( 十进制) ,CCM 日志大小可以增加到 5M

    HKEY_LOCAL_MACHINE\Software\Microsoft\CCM\Logging\@GLOBAL\LogMaxSize

    此外,可以编辑以下注册表值的 DWORD 值,以增加要保留的历史记录日志文件数:

    HKEY_LOCAL_MACHINE\Software\Microsoft\CCM\Logging\@GLOBAL\LogMaxHistory

    注意

    这些注册表更改 () 需要重启 SMS Agent Host 服务。

  • StateSys.log

    通过将以下注册表值设置为 1,可以启用StateSys.log的详细日志记录:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\COMPONENTS\SMS_STATE_SYSTEM\Verbose logging

    注意

    此注册表项更改不需要重启 SMS_Executive 服务。

  • (全局 - 仅站点服务器) SQL 查询

    若要获取有关组件执行的 ConfigMgr SQL 查询的信息,可以通过将以下注册表值设置为 1 来启用 SQL 跟踪:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Tracing\SqlEnabled

    此注册表值会为所有站点服务器日志添加 SQL 跟踪日志记录。 这只能在故障排除时暂时完成,并且应在获取相关日志后禁用。

    注意

    此注册表更改不需要重启 SMS_Executive 服务。

  • (全局 - 仅站点服务器) 启用日志存档

    在某些情况下,问题不会按需重现,并且等待问题重现时,存在日志滚动的风险。 在这些情况下,启用日志存档非常有用,因为它允许你拥有更多的历史日志。 这仅与站点服务器日志相关。

    可以通过设置以下注册表值来启用日志存档:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Tracing\ArchiveEnabled = 1

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Tracing\ArchivePath = <ArchiveLocation>

    启用日志存档后,ConfigMgr会将滚动更新的日志存档到 <ArchiveLocation>,并保留每个日志的 10 个副本。

    若要在启用日志存档时增加为特定组件维护的副本数,请将以下注册表值设置为 20

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Tracing\COMPONENT_NAME\LogMaxHistory

    注意

    这些注册表更改 () 需要重启 SMS_Executive 服务。

  • 每个日志 (- 仅站点服务器) 增加日志文件大小

    若要将单个日志的日志文件大小增加到 50 MB,请将特定于组件的注册表值设置为 52428800 (十进制) :

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Tracing\COMPONENT_NAME\MaxFileSize

    注意

    此注册表更改需要重启 SMS_Executive 服务。

将包的压缩副本重新发送到站点

首次将包分发到站点时,DistMgr 会将包的压缩副本发送到站点。 在站点上的内容库中提取包后,只要将同一个包版本分发到站点中的 DPs,内容本地副本就用于将包发送到 DP。

在某些情况下,需要强制站点将包的压缩副本重新发送到指定站点。 最值得注意的是,这在以下情况下是必需的:

  1. 主要或FileLib辅助站点服务器本身上的内容库中缺少内容 (PkgLibDataLib或) 。
  2. DistMgr.log 一直抱怨没有从父网站 (内容,例如:“包CS100026尚未从站点 CS1 到达,稍后将重试”) 。

在大多数情况下,在传输包内容时,会暂时记录消息“包CS100026尚未从站点 CS1 到达,稍后将重试”。 看到此消息时,请查看发件人/后台处理程序日志,确保站点通信没有问题。 查看 跨站点将包分发到 DP 以了解日志流。

DistMgr 如何知道当前站点是否安装了包的副本

DistMgr 检查是否有类型 1 行 PkgStatus 作为包版本的包。 如果站点有“安装 状态 = 的“类型 1”行,则会使用包内容的本地副本发送到 DP。 如果 中 PkgStatus没有 Type 1 行,则表示尚未在站点服务器上安装包内容。

将包重新分发到站点服务器上并置的 DP 是否会导致重新输入包的压缩副本

否。 重新分发包依赖于包源目录中已有包内容的站点。 如果包在某个时间点发送到站点并标记为 “已安装”,则站点服务器上并置的 DP 上的重新分发操作不会执行任何操作,因为 DistMgr 认为内容已安装,并且以下行将 记录DistMgr.log

分发点位于站点服务器上,包是内容类型包。 没有任何内容可复制。

如果包源站点上的内容库中缺少内容,该怎么办

如果包源站点上的内容库中缺少内容,则重置 SourceVersion 将无济于事。 重新填充缺失内容的唯一方法是更新包。 更新包会导致包源站点从包源位置获取包快照,并将内容写入内容库。

如何实现强制包源站点将包的压缩副本重新发送到特定站点

确认包源站点具有所需内容后,可以通过将受影响网站的“类型 1”行PkgStatus设置为 SourceVersion 0 来强制包源站点将包 PCK 文件重新发到特定站点。 在替换所需包和站点的 PACKAGEIDSITECODE 后,可以通过在包源站点的数据库上运行以下 SQL 查询来标识此行:

SELECT * FROM PkgStatus WHERE Type = 1 AND ID = 'PACKAGEID' AND SiteCode = 'SITECODE'

确认此查询返回唯一且正确的行后,运行以下查询将为此行重置 SourceVersion 为 0:

UPDATE PkgStatus SET SourceVersion = 0 WHERE Type = 1 AND ID = 'PACKAGEID' AND SiteCode = 'SITECODE'

将 Type 1 行的 重置 SourceVersion0 后,将包重新分发到受影响站点中的任何 DP 将强制包源站点将包的压缩副本重新发送到受影响的站点。

注意

在拥有包的网站(即包源站点)上运行上述查询非常重要。

内容分发的相关表

  • SMSPackages - 包含所有包的列表

    有趣的列:

    Column
    操作 0 - NONE
    1 - 更新
    2 - ADD
    3 - DELETE
    4 - VALIDATE
    5 - CANCEL
    PackageType 0 - 常规包
    3 - 驱动程序包
    4 - 任务序列
    5 - 软件汇报包
    6 - 设备设置包
    7 - 虚拟应用包
    8 - 应用程序) (内容包
    257 - 操作系统映像
    258 - 启动映像
    259 - OS 安装包
    260 - VHD 包
  • PkgServers - 包含所有包的列表以及它们当前的目标的 DP。

    有趣的列:

    Column
    操作 0 - NONE
    1 - 更新
    2 - ADD
    3 - DELETE
    4 - VALIDATE
    5 - CANCEL
  • PkgStatus - 包含每个 DP 的每个包的当前包状态的列表。

    有趣的列:

    Column
    类型 1 - 站点 (主)
    2 - DP (COPY)

    类型 1 为包目标的每个站点创建行。 此行的 PkgServer 是站点服务器 FQDN。

    类型 2 为包所针对的每个 DP 创建行。 PkgServer 是 DP NALPATH。
    状态 0 - NONE
    1 - SENT
    2 - RECEIVED
    3 - 已安装
    4 - 重试
    5 - 失败
    6 - 已删除
    7 - PENDING REMOVE (未使用)
    8 - 删除失败
    9 - 重试删除
  • DistributionJobs - 包含包传输管理器作业及其当前状态的列表。

    有趣的列:

    Column
    操作 0 - NONE
    1 - 更新
    2 - ADD
    3 - DELETE
    4 - VALIDATE
    5 - CANCEL
    状态 0 - PENDING
    1 - 就绪
    2 - 已启动
    3 - INPROGRESS
    4 - 挂起重启
    5 - 完成
    6 - 失败
    7 - 已取消
    8 - 已暂停
  • DistributionPoints - 包含所有分发点的列表。

    有趣的列:

    Column
    操作 0 - NONE
    1 - 更新
    2 - ADD
    3 - DELETE
    4 - VALIDATE
    5 - CANCEL
  • PullDPResponse - 暂时包含从拉取 DP 发送的包状态响应。 DistMgr 处理响应并更新 PkgStatus

    有趣的列:

    Column
    ActionState 1 - 成功
    2 - 警告
    4 - 错误
    8 - 下载已启动
    16 - 正在下载
    32 - 已下载
    64 - 已取消
    128 - 请求取消
  • PkgNotification - 由 SMSDBMON 监视的通知表,用于触发 DistMgr 来处理包。 类型列定义包通知的类型。 SMSDBMON 触发 DistMgr 后,将删除此表中的行。

    有趣的列:

    Column
    类型 0 - 未知
    1 - 包
    2 - 程序
    4 - PACKAGE SERVER (DP)
    8 - 包访问帐户
    15 - ALL
  • 拉取 DP 状态消息 - 请求 DP 引发的状态消息 ID 列表

    有趣的列:

    Column
    状态 ID 1 - 成功
    2 - 警告
    4 - 失败
    8 - 下载已启动
    16 - 正在下载
    32 - 已下载
    64 - 已取消

    示例状态消息报告:

        <Report>
         <ReportHeader>
            <Identification>
               <Machine>
                  <ClientInstalled>0</ClientInstalled>
                  <ClientType>1</ClientType>
                  <Unknown>0</Unknown>
                  <ClientID IDType="0" IDFlag="1">925b0ab0-247b-466b-be0f-93d7cb032c87</ClientID>
                  <ClientVersion>5.00.0000.0000</ClientVersion>
                  <NetBIOSName>P01PDP1.CONTOSO.COM</NetBIOSName>
                  <CodePage>437</CodePage>
                  <SystemDefaultLCID>1033</SystemDefaultLCID>
               </Machine>
            </Identification>
            <ReportDetails>
               <ReportContent>StateMessage</ReportContent>
               <ReportType>Full</ReportType>
               <Date>20190107200618.000000+000</Date>
               <Version>1.0</Version>
               <Format>1.1</Format>
            </ReportDetails>
         </ReportHeader>
         <ReportBody>
            <StateMessage MessageTime="20190107200618.000000+000" SerialNumber="3">
               <Topic ID="P010000F" Type="902" IDType="0"/>
               <State ID="1" Criticality="0"/>
               <UserParameters Flags="0" Count="4">
                  <Param>P010000F</Param>
                  <Param>["Display=\\P01PDP1.CONTOSO.COM\"]MSWNET:["SMS_SITE=P01"]\\P01PDP1.CONTOSO.COM\</Param>
                  <Param>{04AD1BB3-5E54-457A-9873-DFB2E8035090}</Param>
                  <Param/>
               </UserParameters>
            </StateMessage>
         </ReportBody>
      </Report>
    

有用的 SQL 查询

下面是一些 SQL 查询,在排查各种内容分发相关问题时可能会有所帮助。

包/DP 状态查询

  • 所有 失败的 包/DP

    SELECT distinct DPSD.DPName, DPSD.PackageID, SP.Name, DPSD.MessageState, DPSD.LastStatusTime, DPSD.SiteCode
    FROM vSMS_DPStatusDetails DPSD
    JOIN SMSPackages_All SP ON DPSD.PackageID = SP.PkgID
    WHERE MessageState = 4
    
  • 所有 正在进行的 包/DP

    SELECT distinct DPSD.DPName, DPSD.PackageID, SP.Name, DPSD.MessageState, DPSD.LastStatusTime, DPSD.SiteCode
    FROM vSMS_DPStatusDetails DPSD
    JOIN SMSPackages_All SP ON DPSD.PackageID = SP.PkgID
    WHERE MessageState = 2
    
  • 所有 成功 包/DPs

    SELECT distinct DPSD.DPName, DPSD.PackageID, SP.Name, DPSD.MessageState, DPSD.LastStatusTime, DPSD.SiteCode
    FROM vSMS_DPStatusDetails DPSD
    JOIN SMSPackages_All SP ON DPSD.PackageID = SP.PkgID
    WHERE MessageState = 1
    
  • 所有处于 “正在进行” 状态的包/DP 超过三天

    SELECT distinct DPSD.DPName, DPSD.PackageID, SP.Name, DPSD.MessageState, DPSD.LastStatusTime, DPSD.SiteCode
    FROM vSMS_DPStatusDetails DPSD
    JOIN SMSPackages_All SP ON DPSD.PackageID = SP.PkgID
    WHERE DPSD.LastStatusTime < DATEAdd(dd,-3,GETDate())  
    AND MessageState = 2
    
  • 所有处于 “失败” 状态的包/DP 超过三天

    SELECT distinct DPSD.DPName, DPSD.PackageID, SP.Name, DPSD.MessageState, DPSD.LastStatusTime, DPSD.SiteCode
    FROM vSMS_DPStatusDetails DPSD
    JOIN SMSPackages_All SP ON DPSD.PackageID = SP.PkgID
    WHERE DPSD.LastStatusTime < DATEAdd(dd,-3,GETDate())
    AND MessageState = 4
    
  • 所有状态的计数

    SELECT MessageState,
    COUNT(MessageState) AS [Count]
    FROM vSMS_DPStatusDetails
    WHERE PackageID <> ''
    GROUP BY MessageState
    
  • 每个 DP 的包状态计数

    SELECT DPName,
    CASE
        WHEN MessageState = 1 THEN 'Success'
        WHEN MessageState = 2 THEN 'InProgress'
        WHEN MessageState = 4 THEN 'Failed'
    END AS [State],  
    COUNT(MessageState) AS [Count]
    FROM vSMS_DPStatusDetails
    WHERE PackageID <> ''
    AND DPName = 'PS1DP1.CONTOSO.COM'
    GROUP BY DPName, MessageState
    ORDER BY DPName
    
  • 给定包的所有 DPS 的状态

    SELECT DPName,
    CASE
        WHEN MessageState = 1 THEN 'Success'
        WHEN MessageState = 2 THEN 'InProgress'
        WHEN MessageState = 4 THEN 'Failed'
    END AS [State]
    FROM vSMS_DPStatusDetails
    WHERE PackageID = '<PackageID>'
    GROUP BY DPName, MessageState
    ORDER BY State
    
  • 每个包的 DP 状态计数

    SELECT  
    CASE
        WHEN MessageState = 1 THEN 'Success'
        WHEN MessageState = 2 THEN 'InProgress'
        WHEN MessageState = 4 THEN 'Failed'
    END AS [State],
    COUNT(MessageState) AS [Count]
    FROM vSMS_DPStatusDetails
    WHERE PackageID = '<PackageID>'
    GROUP BY MessageState
    
  • 包/DP 当前状态

    SELECT distinct DPSD.DPName, DPSD.PackageID, SP.Name, DPSD.LastStatusTime, DPSD.SiteCode, DPSD.MessageState,
    CASE
        WHEN MessageState = 1 THEN 'Success'
        WHEN MessageState = 2 THEN 'InProgress'
        WHEN MessageState = 4 THEN 'Failed'
    END AS [State]
    FROM vSMS_DPStatusDetails DPSD
    JOIN SMSPackages_All SP ON DPSD.PackageID = SP.PkgID
    WHERE DPName = 'PS1DP1.CONTOSO.COM'
    AND DPSD.PackageID = '<PackageID>'
    

查找孤立的 DP 引用

下面的查询可用于确定数据库中是否存在不再位于环境中的 DP 的任何孤立行。 如果未正确删除 DP,则可能存在孤立行。

DECLARE @DPName NVARCHAR(100)
SET @DPName = 'PS1DP.CONTOSO.COM'
SELECT * FROM ContentDPMap WHERE ServerName = @DPName
SELECT * FROM DistributionPoints WHERE ServerName = @DPName
SELECT * FROM DPInfo WHERE ServerName = @DPName
SELECT * FROM PkgServers_G WHERE NALPath like '%' + @DPName + '%'
SELECT * FROM PkgServers_L WHERE NALPath like '%' + @DPName + '%'
SELECT * FROM PkgStatus_G WHERE PkgServer like '%' + @DPName + '%'
SELECT * FROM PkgStatus_L WHERE PkgServer like '%' + @DPName + '%'
SELECT * FROM SysResList WHERE RoleName = 'SMS Distribution Point' AND ServerName = @DPName
SELECT * FROM SC_SysResUse WHERE NALPath like '%' + @DPName + '%' AND RoleTypeID = 3

特定站点中特定 DP 的类似查询:

DECLARE @DPName NVARCHAR(100)
DECLARE @DPSiteCode NVARCHAR(3)
SET @DPName = 'DPNAME.CONTOSO.COM'
SET @DPSiteCode = 'PS1'

SELECT * FROM ContentDPMap WHERE ServerName = @DPName AND SiteCode = @DPSiteCode
SELECT * FROM DistributionPoints WHERE ServerName = @DPName AND SMSSiteCode = @DPSiteCode
SELECT * FROM DPInfo WHERE ServerName = @DPName AND SiteCode = @DPSiteCode
SELECT * FROM PkgServers_L WHERE NALPath like '%' + @DPName + '%' AND SiteCode = @DPSiteCode
SELECT * FROM PkgServers_G WHERE NALPath like '%' + @DPName + '%' AND SiteCode = @DPSiteCode
SELECT * FROM PkgStatus_L WHERE PkgServer like '%' + @DPName + '%' AND SiteCode = @DPSiteCode
SELECT * FROM PkgStatus_G WHERE PkgServer like '%' + @DPName + '%' AND SiteCode = @DPSiteCode
SELECT * FROM SysResList WHERE RoleName = 'SMS Distribution Point' AND ServerName = @DPName AND SiteCode = @DPSiteCode
SELECT * FROM SC_SysResUse WHERE NALPath like '%' + @DPName + '%SMS_SITE=' + @DPSiteCode +  '%' AND RoleTypeID = 3

站点控制文件 (SCF) 属性

  • 当前站点 DistMgr 的 SCF 属性

    SELECT SD.SiteCode, SC.ComponentName, SCP.Name, SCP.Value1, SCP.Value2, SCP.Value3
    FROM SC_Component SC
    JOIN SC_SiteDefinition SD ON SD.SiteNumber = SC.SiteNumber
    JOIN SC_Component_Property SCP ON SCP.ComponentID = SC.ID
    WHERE SD.SiteCode = dbo.fnGetSiteCode() AND SC.ComponentName = 'SMS_DISTRIBUTION_MANAGER'
    
  • DP 的 SCF 属性

    SELECT SRU.RoleName, SRU.ServerName, SRUP.* FROM vSMS_SC_SysResUse SRU
    JOIN vSMS_SC_SysResUse_Properties SRUP ON SRU.ID = SRUP.ID
    WHERE SRU.RoleName = 'SMS Distribution Point'
    AND SRU.ServerName = 'PS1DP1.CONTOSO.COM'
    

包含指定软件更新的包

列出包含给定更新唯一 ID 的所有包。

SELECT distinct UI.ArticleID, CI.CI_UniqueID, CP.PkgID, P.Name FROM v_UpdateInfo UI
JOIN v_ConfigurationItems CI ON UI.CI_ID = CI.CI_ID
JOIN v_CIContents_All CIC ON CI.CI_ID = CIC.CI_ID
JOIN CI_ContentPackages CP ON CP.Content_ID = CIC.Content_ID
JOIN v_Package P ON CP.PkgID = P.PackageID
WHERE CI.CI_UniqueID = '<UniqueID>'