将许多复制代理配置为在服务器上运行时,某些 SQL Server 复制代理无法运行

本文可帮助你解决在将许多 SQL Server 复制代理配置为在服务器上运行时无法运行某些复制代理的问题。

原始产品版本:SQL Server
原始 KB 数: 949296

现象

假设出现了下面这种情景:

  • 将许多Microsoft SQL Server 复制代理配置为在服务器上运行。 例如,将 200 多个复制代理配置为在服务器上运行。

在此方案中,某些复制代理无法运行。 此外,系统日志中记录了以下错误消息:

应用程序错误:应用程序无法正确初始化(0xc0000142)。
单击“确定”以终止应用程序。

原因

之所以出现此问题,是因为桌面堆已用。

解决方法

若要解决此问题,请使用以下方法之一:

为不同数据库创建的复制代理使用单独的帐户

可以在创建复制代理时指定此值。 必须确保处理所有权限触摸点。 可以在“查看”和修改复制安全设置中找到 更改已创建的复制代理的安全设置的过程。

使用注册表设置增加桌面堆大小

可以更改以下注册表项:

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\SessionViewSize (例如,将值从 48 增加到 64)。

  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows (例如,将第三个值 SharedSection 增加 256 千字节)

必须在这两个节点上应用更改。 必须在更改之前保存注册表项,在应用更改后必须重启服务器。

将复制代理从连续运行更改为按计划运行

这可确保复制代理仅在必要时运行,而不是持续保持空闲状态(因为这会浪费资源)。

有关如何更改复制代理计划的说明可在指定同步计划中使用

更改复制代理正在运行的服务器位置

可以评估发布服务器-订阅者对,并查看是否可以更改某些订阅服务器以拉取,以使分发/合并代理在订阅服务器上运行,而不是在发布服务器上运行。 这有助于减少服务器上必须运行的并发代理数。

状态

此行为是特意这样设计的。

使用 LiveKD 枚举桌面堆值的步骤

  1. 作为 SDK 的一部分下载适用于 Windows 的调试工具。

  2. 运行 Sdksetup.exe,然后安装适用于 Windows 的调试工具。

  3. 下载 LiveKD

  4. 创建 C:\debugger 文件夹。

  5. 将所有文件从安装调试工具的位置复制到 C:\debugger。 默认路径为 C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x64

  6. 将 LiveKD 提取到 C:\debugger.

  7. 打开具有提升权限的命令提示符。

  8. 从命令提示符处运行以下命令:

    livekd -y srv*http://msdl.microsoft.com/download/symbols
    
  9. 应会收到如下所示的输出:

    LiveKd v5.3 - Execute kd/windbg on a live system
    Sysinternals -[www.sysinternals.com](http://www.sysinternals.com/) 
    Copyright (C) 2000-2012 Mark Russinovich and Ken Johnson
    Launching C:\Debugger\kd.exe:
    Microsoft (R) Windows Debugger Version 6.2.9200.20512 AMD64
    Copyright (c) Microsoft Corporation. All rights reserved.
    Loading Dump File [C:\Windows\livekd.dmp]
    Kernel Complete Dump File: Full address space is available
    Comment: 'LiveKD live system view'
    Symbol search path is: srv*http://msdl.microsoft.com/download/symbols
    Executable search path is:
    Product: Server, suite:
    Built by:
    Machine Name:
    Kernel base =
    Debug session time:
    System Uptime:
    Loading Kernel Symbols
    ...............................................................
    Loading User Symbols
    ...................................................
    Loading unloaded module list
    ......Unable to enumerate user-mode unloaded modules, NTSTATUS 0xC0000147
    
  10. 运行 !dskheap 以接收以下输出:

    kd> !dskheap
    *** ERROR: Module load completed but symbols could not be loaded for LiveKdD.SYS
    Winstation\Desktop            Heap Size(KB)   Used Rate(%)
    ------------------------------------------------------------
    WinSta0\Default                  20480                 0%
    WinSta0\Disconnect                  96                 4%
    WinSta0\Winlogon                   192                 2%
    Service-0x0-3e7$\Default           768                 1%
    Service-0x0-3e4$\Default           768                 0%
    Service-0x0-3e5 $\Default           768                 0%
    Service-0x0-10a75$\Default         768                 0%
    ------------------------------------------------------
    Total Desktop: (23840 KB - 7 desktops)
    Session ID:  0
    ============================================================
    
  11. 通过执行以下操作解码加密登录:

    1. "3e5$Service-0x0- 3e5 $\Default" -> 0x3e5 == 997

    2. 从 Windows 中的“运行”命令打开 wbemtest

    3. 连接到 root\cimv2 命名空间。

    4. 选择 “查询”,然后键入 select * from win32_logonsession

    5. 双击包含 997 的条目。

    6. 对象编辑器中选择 UUID,然后单击“关联器以显示实际登录名。 请参阅以下屏幕截图:

      查找实际登录名的步骤的屏幕截图。

如果使用远程桌面协议,注意事项

如果使用远程桌面协议(RDP)连接到服务器,请确保使用 /console 交换机创建控制台会话。 如果不使用该 /console 开关,则看不到桌面。 这是因为启动SQL Server 代理服务的帐户与会话 0 相关联。

Win32k.sys驱动程序为桌面堆分配 48 MB 的缓冲区地址空间。 请确保没有占用整个 48 MB 缓冲区地址空间的桌面。

如果未将服务器配置为终端服务器,则所有桌面堆共享 48 MB 的缓冲区地址空间。 这会限制可在服务器上运行的服务进程数。

如果服务器配置为终端服务器,Win32k.sys驱动程序将为桌面堆分配 20 MB 的缓冲区地址空间。 Win32k.sys驱动程序还会为其自己的分页池分配 16 MB 的会话空间。

终端服务器与终端服务与桌面堆之间的差异

终端服务器和终端服务不同。 在添加或删除程序中安装终端服务器组件。 安装终端服务器组件后,服务器将成为终端服务器。 终端服务是服务Microsoft管理控制台(MMC)管理单元中存在的服务。 如果从服务器中删除终端服务器组件,客户端计算机仍可使用 RDP 连接到服务器。 因此,请考虑删除终端服务器组件以获取桌面堆的 48 MB 缓冲区地址空间。

SQL Server 中的作业如何影响桌面堆

在 SQL Server 中,你可能具有在不同代理帐户下运行的不同作业。 对于每个代理帐户,将分配该代理帐户的非交互桌面堆。 例如,SharedSection 参数的第三个值为 512。 如果使用代理帐户启动作业,则会分配 512 KB 桌面堆,即使作业本身仅使用 10 KB 的桌面堆。

注意

使用同一代理帐户的其他作业仍将使用此桌面堆。

启动SQL Server 代理服务时,这可能会导致许多桌面。 因此,可能会占用 48 MB 的缓冲区地址空间。 如果使用桌面堆监视器工具检查桌面堆的使用,你会注意到,一个桌面对应于运行作业使用的一个代理帐户。 建议使用更少的代理帐户来避免达到 48 MB 的限制。

参考

有关参数值 SharedSection 的详细信息,请参阅 User32.dll或Kernel32.dll无法初始化