配置 SQL Server Analysis Services 以生成内存转储文件

本文介绍如何配置 SQL Server Analysis Services 以自动生成内存转储文件。

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

简介

本文介绍如何配置 Microsoft SQL Server Analysis Services (SSAS) 2012 或更高版本,以在遇到异常时自动生成不同类型的内存转储文件。 本文还概述了如何使用 Sqldumper.exe 实用工具手动获取 SQL Server Analysis Services 进程的内存转储文件。

详细信息

默认情况下,SQL Server Analysis Services 会在发生异常时自动生成小型转储文件。 对于默认安装,小型转储文件将写入默认位置:

Analysis Services 版本 位置
2019 %ProgramFiles%\Microsoft SQL Server\MSAS15.InstanceName\OLAP\log
2017 %ProgramFiles%\Microsoft SQL Server\MSAS14.InstanceName\OLAP\log
2016 %ProgramFiles%\Microsoft SQL Server MSAS13.InstanceName\OLAP\log
2014 %ProgramFiles%\Microsoft SQL Server MSAS12.InstanceName\OLAP\log
2012 %ProgramFiles%\Microsoft SQL Server MSAS11.InstanceName\OLAP\log

注意

InstanceName 是 SQL Server Analysis Services 版本的相应值的占位符。

安装后可以更改 SQL Server Analysis Services 实例日志位置,因此可以通过查看已安装 SQL Server Analysis Services 的msmdsrv.ini文件来验证日志位置。

若要确定系统的相应值,请确定 ImagePath 注册键的值,它应包含包含msmdsrv.ini的 Config 路径的路径。

Analysis Services 版本 注册表子项
默认实例 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQLServerOLAPService\ImagePath
命名实例 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSOLAP$InstanceName\ImagePath

小型转储文件将包含以下信息:

  • 所有线程堆栈

  • 堆栈上的指针引用的二阶内存

  • 有关进程环境块(PEB)的信息

  • 有关线程环境块(TEB) 的信息

  • 有关最近卸载的模块的信息

  • 线程状态信息

Msmdsrv.ini文件中的“异常”部分控制内存转储文件生成。 默认情况下,该文件位于 %ProgramFiles%\Microsoft SQL Server\MSASxx.InstanceName\OLAP\Config 文件夹中。 MSASxx 是 SQL Server Analysis Service 的相应版本的占位符。 在记事本中打开文件时,你会注意到异常 XML 标记中的一个部分,如下所示:

<Exception>
<CreateAndSendCrashReports>1</CreateAndSendCrashReports>
<CrashReportsFolder/>
<SQLDumperFlagsOn>0x0</SQLDumperFlagsOn>
<SQLDumperFlagsOff>0x0</SQLDumperFlagsOff>
<MiniDumpFlagsOn>0x0</MiniDumpFlagsOn>
<MiniDumpFlagsOff>0x0</MiniDumpFlagsOff>
<MinidumpErrorList>0xC1000000, 0xC1000001, 0xC1000016, 0xC11D0005, 0xC102003F</MinidumpErrorList>
<ExceptionHandlingMode>0</ExceptionHandlingMode>
<CriticalErrorHandling>1</CriticalErrorHandling>
</Exception>

可以通过修改本节中的设置来控制生成内存转储文件的行为。 还可以在 SQL Server Management Studio 中修改这些设置。 有关这些设置的详细信息,请访问 SQL Server Management Studio 下载网站: 日志属性

禁用 Analysis Services 的自动内存转储文件

CreateAndSendCrashReports 设置的值确定是否将生成内存转储文件。 此设置可以包含下表中列出的值之一。

说明
0 此值指定 Analysis Services 不生成任何内存转储文件。 此外,“异常”部分下的其他设置的值将被忽略。
1 此默认值启用内存转储文件。 但是,SQL Server Analysis Services 不会将错误报告发送到Microsoft。
2 此值指定 SQL Server Analysis Services 生成内存转储文件,并将错误报告发送到Microsoft。

当 CreateAndSendCrashReports 设置设置为 1 或 2 时,Exception 节中的其他设置可以控制内存转储文件的类型以及要包含在内存转储文件中的信息。

配置 SQL Server Analysis Services 以自动生成完整转储文件

若要将 SQL Server Analysis Services 配置为在发生异常时自动生成完整转储文件,可以将 SQLDumperFlagsOn 设置设置为0x34。 此外,如果要将 SQL Server Analysis Services 配置为生成包含句柄信息的完整转储文件,可以将 SQLDumperFlagsOn 设置设置为0x34,将 MiniDumpFlagsOn 设置设置为0x4。 例如,Msmdsrv.ini文件中的“异常”部分可能如下所示:

<Exception>
<CreateAndSendCrashReports>1</CreateAndSendCrashReports>
<CrashReportsFolder/>
<SQLDumperFlagsOn>0x34</SQLDumperFlagsOn>
<SQLDumperFlagsOff>0x0</SQLDumperFlagsOff>
<MiniDumpFlagsOn>0x4</MiniDumpFlagsOn>
<MiniDumpFlagsOff>0x0</MiniDumpFlagsOff>
<MinidumpErrorList>0xC1000000, 0xC1000001, 0xC1000016, 0xC11D0005, 0xC102003F</MinidumpErrorList>
<ExceptionHandlingMode>0</ExceptionHandlingMode>
<CriticalErrorHandling>1</CriticalErrorHandling>
</Exception>

生成包含手动处理信息的完整转储文件

若要排查停止响应(挂起)的服务器等问题,可能需要生成包含手动处理信息的完整转储文件。 为此,可以在命令提示符处运行 Sqldumper.exe 实用工具以及下列参数:

Sqldumper.exe PID 0 0x34:0x4 0 PathToDumpFile

注意

PID 表示 SQL Server Analysis Services 进程的进程 ID。 PathToDumpFile 表示将转储文件写入到的文件夹。

必须从安装了实例的共享目录运行此命令,或者必须在命令中指定Sqldumper.exe文件的完整路径。

Analysis Services 版本 位置
2019 %ProgramFiles%\Microsoft SQL Server\150\Shared
2017 %ProgramFiles%\Microsoft SQL Server\140\Shared
2016 %ProgramFiles%\Microsoft SQL Server\130\Shared
2014 %ProgramFiles%\Microsoft SQL Server\120\Shared
2012 %ProgramFiles%\Microsoft SQL Server\110\Shared

例如,要为 SQL Server Analysis Services 2019 运行sqldumper.exe的默认目录为 C:\Program Files\Microsoft SQL Server\1590\Shared

更多信息

可以使用 SQLDumperFlagsOn 设置指定各种 SQLDumper 标志。 下表列出了可以用作标志参数值的位掩码值。

助记名称 十六进制值 说明
SQLDUMPER_DBGBREAK 0x0001 此标志会导致分析参数时,Sqldumper.exe实用工具在程序开始时运行 DebugBreak API 调用。 通常,Microsoft产品支持服务专业人员不会使用此标志,因为该标志仅用于调试Sqldumper.exe实用工具问题。
请注意 ,此标志会进入Sqldumper.exe进程。 此标志不会中断Sqldumper.exe实用工具正在调试的进程。
SQLDUMPER_NOMINIDUMP 0x0002 使用此标志时,Sqldumper.exe实用工具不会生成转储文件。 此标志用于测试Sqldumper.exe实用工具。
SQLDUMPER_NOWATSON 0x0004 通常,手动生成转储文件时会使用此标志。 此标志替代默认错误报告行为。 默认情况下,转储文件提交到注册表中配置的错误报告站点。
SQLDUMPER_REFERENCED_MEMORY 0x0008 此标志会导致Sqldumper.exe实用工具在调用 MiniDumpWritedump 函数时为 MiniDumpType 参数设置 MiniDumpWithIndirectlyReferencedMemory 标志。 基于堆栈的指针(仅一个级别)的内存(参数或局部变量)将存储在转储文件中。 测试显示,某些基于线程本地存储(TLS)数据的本地参数(例如概率签名方案(PSS)和 EC 结构似乎不起作用,即使设置了此标志也是如此。
SQLDUMPER_ALL_MEMORY 0x0010 当实用工具调用 MiniDumpWriteDump 函数时,此标志会导致Sqldumper.exe实用工具为 MiniDumpType 设置MiniDumpWithFullMemory 标志。 此行为与在调试器下使用 .dump /mf 命令相同。 但是,还必须将SQLDUMPER_DUMP_ALL_THREADS标志设置为打开,以确保包括所有线程堆栈。
SQLDUMPER_DUMP_ALL_THREADS 0x0020 手动运行 Sqldumper.exe 实用工具并指定 ThreadId 参数值 0 时,不需要此标志。 ThreadId 参数值为 0 表示应转储所有线程。 如果指定了特定的非零 ThreadId 参数值,但还使用此标志,则所有线程都会写入转储文件。 之所以存在此标志,是因为Sqlservr.exe进程中的典型行为是传入生成Sqlservr.exe进程的线程的当前 ThreadId 属性值。 发生此行为时,需要标记作为转储所有线程的选项。
SQLDUMPER_MATCH_FILE_NAME 0x0040 可以使用此标志尝试强制Sqldumper.exe实用工具生成类似于特定命名约定的转储文件名。 此特定命名约定可能基于现有文件名。 由于必须设置一个特殊的内存结构,该结构包含自己的程序中的现有文件名,然后将该指针作为 SqlInfoPtr 参数传递给 Sqldumper.exe 实用工具,因此在手动运行 Sqldumper.exe 实用工具时,此标志将无效。
SQLDUMPER_SKIP_DW_REG_READ 0x0080 此标志会导致Sqldumper.exe实用工具不使用注册表作为执行Dw15.exe程序的路径。 Dw15.exe程序用于将转储文件上传到错误报告站点。
SQLDUMPER_VERBOSE 0x0100 如果不确定Sqldumper.exe实用工具认为用作输入的参数,则此标志可能很有价值。 使用此标志时,Sqldumper.exe实用工具会显示参数值,以及从命令行指定了多少个参数值。
SQLDUMPER_WAIT_AT_EXIT 0x0200 可以使用此标志将调试器附加到Sqldumper.exe实用工具。 可以使用此调试器来排查Sqldumper.exe实用工具的任何问题。 当Sqlservr.exe或其他程序生成Sqldumper.exe实用工具时,可能会出现这些问题。 设置此标志时,Sqldumper.exe实用工具在Sqldumper.exe程序存在之前调用 SleepEx 函数 15 秒,并在完成所有其他操作之后调用 SleepEx 函数。
SQLDUMPER_FILTERED 0x0800 可以使用此标志生成筛选的转储文件。 SQL Server Analysis Services 尚不支持此标志。

可以使用 MiniDumpFlagsOn 设置来提供小型转储标志。 下表列出了可用的小型转储标志:

选项 说明
MiniDumpNormal 0x00000000 创建使用覆盖的典型微型转储文件。
MiniDumpWithDataSegs 0x00000001 包括所有已加载模块的数据段。 加载的模块检索全局变量的标志。
MiniDumpWithFullMemory 0x00000002 创建完整的用户转储文件。 设置标志时,将禁用筛选的转储文件。
MiniDumpWithHandleData 0x00000004 包括句柄信息。
MiniDumpFilterMemory 0x00000010 应扫描堆栈和后盾存储内存,以查找对模块列表中的模块的指针引用。 用户不应将此标志用于 SQL Server Analysis Services。
MiniDumpWithUnloadedModules 0x00000020 此标志提供有关最近卸载的模块的信息。 仅Microsoft Windows XP 和 Microsoft Windows Server 2003 支持此标志。 在 Windows Server 2003 Service Pack 1(SP1)和 Windows XP Service Pack 2(SP2)之前,操作系统不会维护卸载模块的信息。
MiniDumpWithIndirectlyReferencedMemory 0x00000040 包括包含局部变量或其他堆栈内存引用的数据的页面。
MiniDumpFilterModulePaths 0x00000080 如果模块路径从模块信息中剥离,请不要使用此标志。
MiniDumpWithProcessThreadData 0x00000100 此标志提供有关进程环境块(PEB)和线程环境块(TEB)的信息。
MiniDumpWithPrivateReadWriteMemory 0x00000200 扫描虚拟地址空间以查找要包含的其他类型的内存。
MiniDumpWithoutOptionalData 0x00000400 通过消除不需要的内存区域来减少转储的数据。 执行此操作以满足为转储文件指定的条件。 使用此标志可以避免转储内存,这些内存可能包含对用户专用的数据。 但是,这不能保证不会提供任何私人信息。 请勿使用此标志。
MiniDumpWithFullMemoryInfo 0x00000800 包括枚举的内存区域描述性信息。
MiniDumpWithThreadInfo 0x00001000 包括线程状态信息。
MiniDumpWithCodeSegs 0x00002000 包括所有已加载模块的代码和与代码相关的部分。

参考

如何使用 Sqldumper.exe 实用工具在 SQL Server 中生成转储文件