使用 Sqldumper.exe 工具在 SQL Server 中生成转储文件
本文提供了 SQL Server 随附的 Sqldumper.exe 工具的一般准则。 此工具用于生成不同类型的转储文件。
原始产品版本: SQL Server 2019、SQL Server 2017、SQL Server 2016、SQL Server 2014、SQL Server 2012、SQL Server 2008、SQL Server 2005
原始 KB 数: 917825
总结
Microsoft SQL Server 随附Sqldumper.exe工具。 它生成 SQL Server 的内存转储文件和用于调试的相关进程。 本文介绍如何使用Sqldumper.exe为 Watson 错误报告或调试任务生成转储文件。
本文还介绍了生成转储文件的其他两种方法:
- 附加的 PowerShell 脚本 自动执行SQLDumper.exe命令行选项。
- DBCC STACKDUMP Transact-SQL (T-SQL) 命令可用于在 SQL Server 中生成转储文件。
如何手动运行Sqldumper.exe
在 SQL Server 最初安装该工具的文件夹上下文下运行Sqldumper.exe工具。
默认情况下,Sqldumper.exe的安装路径为 <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\90\Shared\SQLDumper.exe。 请注意, <SQLServerInstall 驱动器> 是安装 SQL Server 的驱动器的占位符。
若要使用 Sqldumper.exe 工具生成转储文件,请执行以下步骤:
打开 <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\number>\<Shared 文件夹。
在此文件夹路径中, <数字> 是以下版本之一的占位符:
- 150 for SQL Server 2019
- 140 for SQL Server 2017
- 130 for SQL Server 2016
- 120 for SQL Server 2014
- 110 for SQL Server 2012
- 100 for SQL Server 2008
- 90 for SQL Server 2005
确保 Dbghelp.dll 文件位于此文件夹中。
选择“开始>运行”,键入 cmd,然后选择“确定”。
在命令提示符下,键入以下命令,然后按 Enter:
cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
注意
在此文件夹路径中, <数字> 与 SQL Server 版本更改的占位符相同,如前所述。
若要生成特定类型的转储文件,请在命令提示符处键入相应的命令,然后按 Enter:
完整转储文件:
Sqldumper.exe <ProcessID> 0 0x01100
微型转储文件:
Sqldumper.exe <ProcessID> 0 0x0120
包含间接引用内存的小型转储文件(这是推荐的选项,默认情况下,SQL Server 会在自动生成内存转储文件时使用):
Sqldumper.exe <ProcessID> 0 0x0128
筛选的转储文件:
Sqldumper.exe <ProcessID> 0 0x8100
注意
<ProcessID> 是要为其生成转储文件的 Windows 应用程序的进程标识符的占位符。
如果Sqldumper.exe成功运行,该工具会在安装该工具的文件夹中生成转储文件。
Sqldumper.exe生成的转储文件具有类似于 SQLDmpr<xxxx.mdmp> 的文件名模式。
在此模式中, <xxxx> 是基于同一文件夹中具有类似文件名的其他文件确定的数字。 如果文件夹中有与指定模式匹配的文件,请考虑比较其创建日期和时间以查找所需的文件。
如何获取Microsoft Windows 应用程序进程标识符
若要使用 Sqldumper.exe 工具生成转储文件,必须具有要为其生成转储文件的 Windows 应用程序的进程标识符。 下面介绍如何获取进程标识符:
- 按 Ctrl+Alt+Delete,然后选择“ 任务管理器”。
- 在 Windows 任务管理器 对话框中,选择“ 进程 ”选项卡。
- 在 “视图 ”菜单上,选择“ 选择列”。
- 在 “选择列 ”对话框中,选中 PID(进程标识符) 复选框,然后选择“ 确定”。
- 请注意要为其生成转储文件的 Windows 应用程序的进程标识符。 对于 SQL Server 应用程序,请注意Sqlservr.exe进程的进程标识符。
- 关闭“任务管理器”。
或者,使用 SQL Server 错误日志文件获取计算机上运行的 SQL Server 应用程序的进程标识符。 SQL Server 错误日志文件的一部分类似于以下示例:
2021-09-15 11:50:32.690 Server Microsoft SQL Server 2019 (RTM-CU12) (KB5004524) - 15.0.4153.1 (X64)
Jul 19 2021 15:37:34
Copyright (C) 2019 Microsoft Corporation
Enterprise Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 19043: ) (Hypervisor)
2021-09-15 11:50:32.690 Server UTC adjustment: -5:00
2021-09-15 11:50:32.690 Server (c) Microsoft Corporation.
2021-09-15 11:50:32.690 Server All rights reserved.
2021-09-15 11:50:32.690 Server Server process ID is 7028.
后显示Server process ID
的数字是Sqlservr.exe进程的进程标识符。
内存转储文件的输出路径
SQLDumper.exe主要在需要内存转储来解决特定问题(例如异常、断言或非生成计划程序)时为 SQL Server 进程生成内存转储文件。 在这种情况下,SQL Server 调用SQLDumper.exe以生成其进程的内存转储文件。 默认情况下,内存转储文件存储在 SQL 实例 MSSQL\LOG\ 目录中。
如何更改默认路径
例如,如果转储文件大小太大,可以按照以下步骤修改路径:
- 打开“SQL Server 配置管理器”。
- 在 SQL Server 服务下,找到正在调查的 SQL Server 实例。
- 右键单击该条目,选择“属性”,然后转到“高级”选项卡。
- 将转储目录更改为所需路径,然后选择“ 确定”。
- 重启 SQL Server(如果可能),使新设置生效。
当手动使用 Sqldumper.exe 工具为任何 Windows 应用程序生成转储文件时,转储文件可能与 Windows 应用程序当前正在使用的内存一样大。 确保Sqldumper.exe写入转储文件的驱动器上有足够的磁盘空间。
在命令中指定自定义输出文件夹
可以指定希望Sqldumper.exe工具写入转储文件的目录。 运行Sqldumper.exe之前,该目录必须已存在。 否则,Sqldumper.exe失败。 请勿使用 UNC(通用命名约定)路径作为转储文件的位置。 以下步骤提供了有关如何指定微型转储文件位置的示例:
选择“开始>运行”,键入 cmd,然后选择“确定”。
在命令提示符下,键入以下命令,然后按 Enter:
cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
在命令提示符下,键入以下命令,然后按 Enter:
Sqldumper.exe ProcessID 0 0x0128 0 <MdumpPath>
注意
<MdumpPath> 是希望Sqldumper.exe工具写入转储文件的目录的占位符。 默认情况下,该文件将写入当前文件夹。
如果指定要生成的完整转储文件或筛选的转储文件,Sqldumper.exe可能需要几分钟才能生成转储文件。 所花的时间取决于以下变量:
- Sqlservr.exe当前使用的内存量。
- 工具用于存储转储文件的驱动器的写入速度。
在此期间,Sqldumper.exe工具不处理命令。 你会注意到服务器停止响应。 此外,可能会发生群集故障转移。
权限要求
若要运行Sqldumper.exe,必须使用以下方法之一登录到 Windows:
- 使用属于计算机上的管理员组成员的帐户。
- 使用运行 SQL Server 服务的同一用户帐户。
若要使Sqldumper.exe工具通过远程桌面或终端服务成功工作,必须在控制台模式下启动远程桌面或终端服务。 例如,若要在控制台模式下启动远程桌面,请选择“启动>运行”,键入 mstsc /console,然后选择“确定”。 如果目标服务器运行 Windows 2000,则 以无提示方式忽略 /console 选项。 可以通过远程桌面连接到服务器,但不会使用控制台会话。
如果在运行Sqldumper.exe后发现当前文件夹中未生成转储文件,请检查该工具生成的命令行输出,以确定失败的潜在原因。 此信息也会记录在 当前目录中的 Sqldumper_errorlog.log 文件中。 下面是两条可能的错误消息及其原因:
消息 | 原因 |
---|---|
“OpenProcess 失败0x57 - 参数不正确” | 将无效的进程 ID 传递给Sqldumper.exe实用工具。 |
“线程 ID 的值无效 - <参数参数> 错误无效” | 将无效参数传递给 Sqldumper.exe 实用工具。 |
如果生成类似于以下内容之一的错误消息,则可以安全地忽略此消息:
- “小型转储 6 期间未知的回调类型”
- “小型转储 7 期间的未知回调类型”
转储生成的影响
当请求用户模式进程的转储文件(如本文所述,而不是超出我们范围的操作系统内核转储)时,目标进程(此处SQLServer.exe)将冻结,以便在将转储内容序列化为其文件目标所花费的时间。
冻结意味着该过程无法运行任何用户请求或任何内部操作,包括任何资源轮询机制,例如实现 Windows 群集的 IsAlive 和 Looks Alive(请参阅 群集故障转移上的内存转储部分 ,了解有关如何处理这种情况的详细信息)。 任何依赖于时钟时间的超时也可能因冻结而遭到破坏。
根据前面的语句,冻结持续时间是此处的关键因素,由以下因素驱动:
- 所选转储的类型。
- 内存中 SQL Server 进程的大小,在这种情况下,运行默认参数的单个活动实例通常接近服务器的总物理 RAM。
- 用作转储目标的磁盘的性能。
此外, 应计划磁盘上的转储文件 的大小,特别是如果有多个转储是可能的,并且选择了大型非默认转储类型。 请确保查看 转储类型 ,以了解预期内容。 默认情况下,某些转储方法在 SQL Server 实例的 \Log 文件夹中创建转储,在默认的简单配置中,该文件夹也是 SQL Server 的系统磁盘和数据+日志磁盘。 使该磁盘饱和对 SQL Server 和/或系统可用性产生严重影响。
管理对群集系统的影响
进程在转储生成期间暂时挂起。 这可能会影响 SQL Server 服务可用性,并在 AlwaysOn 上下文(故障转移群集实例和可用性组)中触发资源故障转移。 不同进程的转储生成会以不同的方式影响资源。 仔细阅读转储生成和转储类型部分的影响。
在故障转移群集实例或 SQL Server 的可用性组 (AG) 实例上捕获 SQL Server 转储时,如果转储需要很长时间才能完成,群集 SQL Server 或 AG 可能会故障转移到另一个节点。 在使用大量 RAM 的系统上,或者生成筛选的或完全内存转储时,这尤其有问题。 若要防止故障转移,在捕获转储文件之前,请使用以下设置。 执行转储文件后,可以还原更改:
- 对于故障转移群集实例(FCI):
- 右键单击群集管理员中的 SQL Server 资源,选择“如果资源失败”,请不要在“策略”选项卡上重启。
- 在 “属性 ”选项卡上,增加 HealthCheck 超时。 例如,将属性值设置为 180 秒或更高。 如果达到此超时,则策略 如果资源失败,则不忽略重启 ,并重启资源。
- 在 “属性 ”选项卡上,将 FailureConditionLevel 值更改为零。
- 对于 AG,请应用以下所有设置:
- 增加会话超时,例如,为所有副本增加 120 秒。 在 SQL Server Management Studio (SSMS)中,右键单击要配置的副本,然后选择“ 属性”。 将 会话超时(秒) 字段更改为 120 秒。 有关详细信息,请参阅 更改可用性副本(SQL Server)的会话超时期限。
- 将所有副本的自动故障转移更改为手动故障转移。 在 SSMS 中,右键单击副本,选择“属性”,并将所有副本的自动故障转移更改为“属性”选项卡上的手动故障转移。有关详细信息,请参阅更改可用性副本(SQL Server)的故障转移模式。
- 将 LeaseTimeout 增加到 60,000 毫秒(60 秒),并将 HealthCheckTimeout 更改为 90,000 毫秒(90 秒)。 在群集管理员中,右键单击 AG 资源,选择“属性”,然后切换到“属性”选项卡以修改这两个设置。 有关详细信息,请参阅 Configure HealthCheckTimeout Property Settings。
产品改进以减少对 SQL Server 的影响
向最新版本的 SQL Server 添加了四个主要改进,以减少转储文件的大小和/或生成内存转储的时间:
位图筛选机制
SQL Server 分配一个位图,用于跟踪要从筛选的转储中排除的内存页。 Sqldumper.exe 读取位图并筛选出页面,且无需读取其他任何内存管理程序元数据。 在分别启用或禁用位图时,SQL Server 错误日志中会显示以下消息:
Page exclusion bitmap is enabled.
和 Page exclusion bitmap is disabled.
SQL Server 2016
从 SQL Server 2016 SP2 CU13 开始,位图筛选默认处于启用状态。
SQL Server 2017
- 这在 RTM 到 CU15 中不可用。
- 在 SQL Server 2017 CU16 中,可以通过 T8089 启用位图筛选,并通过关闭 T8089 来禁用它。
- 从 SQL Server 2017 CU20 开始,位图筛选默认处于启用状态。 跟踪标志 T8089 将不再应用,如果打开,将忽略。 可以通过 T8095 禁用位图筛选。
SQL Server 2019
在 SQL Server 2019 RTM 中默认启用此功能。 可以通过 T8095 禁用它。
在同一问题上消除重复转储
将消除同一问题的重复内存转储。 使用堆栈签名时,SQL 引擎会跟踪是否已发生异常,并且如果已有异常,则不会生成新的内存转储。 这适用于访问冲突、堆栈溢出、断言和索引损坏异常。 这大大减少了内存转储使用的磁盘空间量,并且不会暂时冻结进程以生成转储。 这已在 SQL Server 2019 中添加。
错误日志中的缩短输出
从单个内存转储中生成的 SQL Server 错误日志中生成的内容不仅可能压倒性,而且由于将所有这些信息序列化为错误日志中的文本格式所需的时间,它还可能会减慢生成内存转储的过程。 在 SQL Server 2019 中,转储生成时存储在错误日志中的内容已大幅减少,可能如下所示:
DateTimespidS pid **Dump thread - spid = 0, EC = 0x0000015C7169BF40
DateTimespidS pid *
DateTimespidS pid *User initiated stack dump. This is not a server exception dump.
DateTimespidS pid *
DateTimespidS pid Stack Signature for the dump is 0x00000000788399E5
DateTimespidS pid External dump process return code 0x20000001.
External dump process returned no errors.
以前,当用户触发手动转储时,SQL Server 会打印每个会话或线程的信息。
内存转储的并行压缩
为了更快地生成转储并使其大小更小,SQL Server 2022 CU8 和 SQL Server 2019 CU23 中引入了压缩内存转储功能。 激活后,Sqldumper.exe创建多个线程来同时读取进程的内存、压缩进程,然后将其保存到转储文件中。 此多线程并行压缩可减少文件大小,并在与完整转储和筛选转储一起使用时加快转储过程。
可以启用跟踪标志 2610 以启用压缩内存转储:
DBCC TRACEON (2610,-1)
GO
DBCC STACKDUMP with FILTERED_DUMP
GO
DBCC TRACEOFF (2610,-1)
或者,可以将其添加 -T2610
为 SQL Server 实例的启动参数,以便它始终创建压缩的内存转储。
如果手动运行Sqldumper.exe,则可以使用 -zdmp
参数捕获压缩的内存转储。 例如:
Sqldumper.exe <ProcessID> 0 0x8100 0 d:\temp -zdmp
还可以使用参数限制Sqldumper.exe可用于创建压缩转储 -cpu:X
的核心数,其中 X 是 CPU 数。 仅当从命令行手动运行Sqldumper.exe时,此参数才可用:
Sqldumper.exe <ProcessID> 0 0x8100 0 d:\temp -zdmp -cpu:8
阻止或延迟创建内存转储的因素
已知以下因素会导致延迟或阻止创建内存转储。
- 写入内存转储的 IO 路径性能不佳。 在这种情况下,调查和解析磁盘 I/O 性能是下一个逻辑步骤。
- 防病毒或其他监视软件正在干扰SQLDumper.exe。 在某些情况下,第三方软件会绕道 ReadProcessMemory 函数。 这可以显著增加转储持续时间。 若要解决其中大多数问题,请禁用干扰软件或向排除列表添加SQLDumper.exe。
转储类型
以下方法可用于生成三种不同类型的转储:小型转储、完整转储和筛选转储。
带引用内存的小型转储
这种类型的内存转储是进程(“线程堆栈”)的所有活动线程的快照,以及线程堆栈引用的内存的有限提取,以及一些其他关键进程或线程数据。 它们通常大小为几兆字节,并且快速生成(从不到一秒到几秒钟)。 甚至更大的服务器系统(数百个 CPU 间接驱动 SQL Server 进程中的大量线程)也很少超过 20-30 MB:小型转储的大小不会随着 SQL Server 进程的大小而增长。 此转储类型是 SQL Server 在异常、计划程序问题、闩锁问题、数据库损坏和断言时自动生成内存转储时使用的默认类型。
注意
SQL Server 作为内置检测的一部分,在某些特定情况下将生成自动化的“诊断微型转储”。 因此,此操作被认为是安全的,SQL Server 在需要时可以自动触发它。
完整转储
完整内存转储是活动目标进程空间的完整副本。 因此,这包括所有线程状态、所有进程分配的内存和所有加载的模块。 因此,完整转储的大小大致与 SQL Server 进程相同,而 SQL Server 进程反过来可能 几乎与系统 RAM 总量一样大。 在专用于单个 SQL Server 实例的大型服务器上,这可能意味着一个文件,该文件数百 GB 或更多。 不需要说,这样的文件需要很长时间才能生成,因此将引入长时间的冻结。 转储文件目标的磁盘性能将显著影响冻结时间。 这种类型的转储目前很少用于 SQL Server,如以下说明中所述。
筛选的转储
随着运行 SQL Server 的典型服务器的 RAM 大小稳步增加,完整转储变得更加不轻松。 因此,已筛选的转储已实现。 筛选的转储是完整转储的子集,其中大量 SQL Server 内存会动态排除,不会写入磁盘。 通常,排除的内存不会为故障排除带来额外的值。 示例包括数据/索引页和一些内部缓存,例如 Hekaton 数据页和日志池内存。 此筛选的转储会导致文件比完整转储小,但转储仍保留几乎所有的有用性。 在绝大多数小型转储不足的情况下,筛选的转储已替换完整转储作为首选选项。 与完整转储相比,大小减小可能会有所不同,但它仍然是一个相当大的文件,通常为 SQL Server 进程大小的 30-60%。 因此,最好计划尽可能大到完整转储作为最差的选择,这留下了良好的安全边距。 在每种情况下,筛选转储可能不一定比完整转储更快:与避免 IO 数量相关的增益是否超过实现筛选器逻辑所需的时间(磁盘速度和 CPU/RAM 速度会影响这一点)。
可以使用以下查询大致估计筛选的转储大小。 尽管预期是大多数数据或索引页都从转储中排除,但不会省略独占闩锁和修改页。
SELECT SUM(pages_kb)
FROM sys.dm_os_memory_clerks
WHERE type != 'MEMORYCLERK_SQLBUFFERPOOL'
由于可以使用Sqldumper.exe按需为任何 Microsoft Windows 应用程序生成转储文件,因此可以考虑使用筛选的转储选项。 但是,筛选的转储文件仅在 SQL Server 的上下文中适用且有意义。 你仍然可以成功生成小型转储、完整转储文件或非 SQL Server 应用程序。
SQL Server 进程在内部调用Sqldumper.exe工具,以在进程遇到任何异常时生成转储文件。 SQL Server 将参数传递给Sqldumper.exe。 可以使用跟踪标志更改 SQL Server 在发生异常或断言时默认传递给工具的参数。 这些跟踪标志的范围是从 2540 到 2559。 可以使用其中一个跟踪标志来更改SQLDumper.exe生成的默认转储类型(默认值是带引用内存的小型转储)。 例如:
- 跟踪标志 2551:生成筛选的内存转储。
- 跟踪标志 2544:生成完整内存转储。
- 跟踪标志 8026:SQL Server 会在生成转储一次后清除转储触发器。
如果两个或多个跟踪标志处于活动状态,则表示遵循最大内存转储的选项。 例如,如果使用跟踪标志 2551 和 2544,SQL Server 将创建完整内存转储。
在群集故障转移上生成内存转储
在群集故障转移方案中,SQL Server 资源 DLL 可以在故障转移发生前获取转储文件,以帮助进行故障排除。 SQL Server 资源 DLL 确定 SQL Server 资源失败时,SQL Server 资源 DLL 使用 Sqldumper.exe 实用程序获取 SQL Server 进程的转储文件。 若要确保Sqldumper.exe工具成功生成转储文件,必须将以下三个属性设置为先决条件:
SqlDumperDumpTimeOut
用户指定的超时。资源 DLL 等待转储文件在资源 DLL 停止 SQL Server 服务之前完成。
SqlDumperDumpPath
Sqldumper.exe工具生成转储文件的位置。
SqlDumperDumpFlags
Sqldumper.exe使用的标志。
如果未设置任何属性,Sqldumper.exe无法生成转储文件。 每当资源联机时,事件日志和群集日志中都记录了警告消息。
SQL Server 2012 及更高版本的 SQLDumper 群集配置
可以使用 ALTER SERVER CONFIGURATION
(T-SQL) 命令修改这些属性。 例如:
ALTER SERVER CONFIGURATION SET FAILOVER CLUSTER PROPERTY SqlDumperDumpTimeOut = 0;
ALTER SERVER CONFIGURATION SET FAILOVER CLUSTER PROPERTY SqlDumperDumpPath = 'C:\temp\';
ALTER SERVER CONFIGURATION SET FAILOVER CLUSTER PROPERTY SqlDumperDumpFlags = 296;
或者,可以使用 PowerShell 脚本。 例如,对于命名实例SQL2017AG:
Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Set-ClusterParameter -Name "SqlDumperDumpPath" -Value "C:\temp"
Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Set-ClusterParameter -Name "SqlDumperDumpFlags" -Value 296
Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Set-ClusterParameter -Name "SqlDumperDumpTimeOut" -Value 0
若要检查是否应用了设置,可以运行以下 PowerShell 命令:
Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Get-ClusterParameter
SQL Server 2008/2008 R2 或 Windows 2012 及更低版本的 SQLDumper 群集配置
若要使用 群集资源 命令为群集故障转移设置Sqldumper.exe实用工具属性,请执行以下步骤:
- 选择“开始>运行”,键入 cmd,然后选择“确定”。
- 对于每个属性,请在命令提示符处键入相应的命令,然后按 Enter:
SqlDumperDumpFlags
属性若要设置
SqlDumperDumpFlags
特定转储文件的属性,请在命令提示符处键入相应的命令,然后按 Enter:所有线程完整转储文件
默认实例
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x01100
命名实例
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x01100
所有线程微型转储文件
默认实例
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x0120
命名实例
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x0120
筛选了所有线程转储文件
默认实例
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x8100
命名实例
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x8100
SqlDumperDumpPath
属性cluster resource "SQL Server" /priv SqlDumperDumpPath = <DirectoryPath>
注意
<DirectoryPath> 是生成转储文件的目录的占位符,应在引号(“ ) 内指定它。
SqlDumperDumpTimeOut
属性cluster resource "SQL Server" /priv SqlDumperDumpTimeOut = <Timeout>
注意
<超时> 是超时的占位符(毫秒)。
该工具生成 SQL Server 进程的转储文件所需的时间取决于计算机配置。 对于具有大量内存的计算机,时间可能很大。 若要估计该过程所需的时间,请使用Sqldumper.exe工具手动生成转储文件。 该属性的有效值 SqlDumperDumpTimeOut
从 10,000 毫秒 到 MAXDWORD。MAXDWORD 表示 DWORD 数据类型(4294967295)范围内的最高值。
若要验证设置是否已启用,可以运行以下命令:
cluster resource "SQL Server" /priv
删除群集故障转移的Sqldumper.exe属性
若要删除群集故障转移的Sqldumper.exe工具属性,请执行以下步骤:
选择“开始>运行”,键入 cmd,然后选择“确定”。
对于特定属性,请在命令提示符处键入相应的命令,然后按 Enter:
SqlDumperDumpFlags
属性默认实例
cluster resource "SQL Server" /priv:SqlDumperDumpFlags /usedefault
命名实例
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpFlags /usedefault
SqlDumperDumpPath
属性默认实例
cluster resource "SQL Server" /priv:SqlDumperDumpPath /usedefault
命名实例
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpPath /usedefault
SqlDumperDumpTimeOut
属性默认实例
cluster resource "SQL Server" /priv:SqlDumperDumpTimeOut /usedefault
命名实例
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpTimeOut /usedefault
如何使用 DBCC STACKDUMP
该 DBCC STACKDUMP
命令可帮助你在 SQL Server 实例安装的 LOG 目录中创建内存转储。 默认情况下,该命令将创建一个包含所有线程的小型转储,该线程的大小有限,足以反映 SQL Server 进程的状态。 在 SQL Server 客户端中运行以下命令:
DBCC STACKDUMP
有关 SQL Server 2019 中的扩展功能 DBCC STACKDUMP
,请参阅 SQL Server 2019 中引入的扩展 DBCC STACKDUMP 功能。
若要启用此方法以创建筛选的转储,请使用以下命令打开跟踪标志 2551:
DBCC TRACEON(2551, -1)
GO
DBCC STACKDUMP
若要创建完整转储,请使用跟踪标志 2544。
获取转储文件后,应使用命令 DBCC TRACEOFF (<TraceNumber>, -1);
禁用跟踪标志,以避免无意中将所有进一步的 SQL Server 自诊断微型转储升级到更大的转储。 在命令中, <TraceNumber> 是以前启用的跟踪标志,如 2551 或 2544。 例如:
DBCC TRACEOFF(2551, -1)
如果不确定哪个跟踪标志保持活动状态,请运行以下命令:
DBCC TRACESTATUS(-1)
空结果集指示没有活动跟踪标志。 相反,如果 2551 仍然处于活动状态,你将看到:
TraceFlag | Status | 全局 | 会话 |
---|---|---|---|
2551 | 1 | 1 | 0 |
注意
服务重启后,将 traceflag
重置启用的 DBCC TRACEON
。
SQL Server 2019 中引入的扩展 DBCC STACKDUMP 功能
从 SQL Server 2019 CU2 开始,该 DBCC STACKDUMP
命令已扩展,以支持生成不同类型的转储:微型转储、筛选转储和完整转储。 此命令无需使用跟踪标志。 它还允许限制使用内存转储生成的其他文本文件中的文本输出。 这样做可能会在生成内存转储SQLDumper.exe所需的时间中提供明显的性能提升。
DBCC STACKDUMP WITH MINI_DUMP | FILTERED_DUMP | FULL_DUMP [, TEXT_DUMP = LIMITED | DETAILED]
这是 TEXT_DUMP = LIMITED
默认选项。 如果要在 SQLDump000X.txt 文件中接收详细的输出,可以使用 TEXT_DUMP = DETAILED
。
若要在.txt文件中生成具有有限输出的筛选转储,请运行以下命令:
DBCC STACKDUMP WITH FILTERED_DUMP , TEXT_DUMP = LIMITED
如何使用 PowerShell 脚本通过 SQLDumper 生成转储文件
将以下代码另存为 PS1 文件,例如 SQLDumpHelper.ps1:
代码详细信息
$isInt = $false $isIntValDcnt = $false $isIntValDelay = $false $SqlPidInt = 0 $NumFoler = "" $OneThruFour = "" $SqlDumpTypeSelection = "" $SSASDumpTypeSelection = "" $SSISDumpTypeSelection = "" $SQLNumfolder = 0 $SQLDumperDir = "" $OutputFolder = "" $DumpType = "0x0120" $ValidPid $SharedFolderFound = $false $YesNo = "" $ProductNumber = "" $ProductStr = "" Write-Host "" Write-Host "`******************************************************************" Write-Host "This script helps you generate one or more SQL Server memory dumps" Write-Host "It presents you with choices on:` -target SQL Server process (if more than one) -type of memory dump -count and time interval (if multiple memory dumps) You can interrupt this script using CTRL+C" Write-Host "***********************************************************************" # check for administrator rights # debugging tools like SQLDumper.exe require Admin privileges to generate a memory dump if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Write-Warning "Administrator rights are required to generate a memory dump!`nPlease re-run this script as an Administrator!" return } # what product would you like to generate a memory dump while ($true) { Write-Host "Which product would you like to generate a memory dump of?" -ForegroundColor Yellow Write-Host "1) SQL Server" Write-Host "2) SSAS (Analysis Services)" Write-Host "3) SSIS (Integration Services)" Write-Host "4) SSRS (Reporting Services)" Write-Host "5) SQL Server Agent" Write-Host "" $ProductNumber = Read-Host "Enter 1-5>" if ($ProductNumber -in 1,2,3,4,5) { break } Write-Host "`nPlease enter a valid number from list above!`n" Start-Sleep -Milliseconds 300 } if ($ProductNumber -eq "1") { $SqlTaskList = Tasklist /SVC /FI "imagename eq sqlservr*" /FO CSV | ConvertFrom-Csv $ProductStr = "SQL Server" } elseif ($ProductNumber -eq "2") { $SqlTaskList = Tasklist /SVC /FI "imagename eq msmdsrv*" /FO CSV | ConvertFrom-Csv $ProductStr = "SSAS (Analysis Services)" } elseif ($ProductNumber -eq "3") { $SqlTaskList = Tasklist /SVC /FI "imagename eq msdtssrvr*" /FO CSV | ConvertFrom-Csv $ProductStr = "SSIS (Integration Services)" } elseif ($ProductNumber -eq "4") { $SqlTaskList = Tasklist /SVC /FI "imagename eq reportingservicesservice*" /FO CSV | ConvertFrom-Csv $ProductStr = "SSRS (Reporting Services)" } elseif ($ProductNumber -eq "5") { $SqlTaskList = Tasklist /SVC /FI "imagename eq sqlagent*" /FO CSV | ConvertFrom-Csv $ProductStr = "SQL Server Agent" } if ($SqlTaskList.Count -eq 0) { Write-Host "There are currently no running instances of $ProductStr. Exiting..." -ForegroundColor Green break } # if multiple SQL Server instances, get the user to input PID for desired SQL Server if ($SqlTaskList.Count -gt 1) { Write-Host "More than one $ProductStr instance found." $SqlTaskList | Select-Object PID, "Image name", Services | Out-Host # check input and make sure it is a valid integer while ($true) { Write-Host "Please enter the PID for the desired SQL service from list above" -ForegroundColor Yellow $SqlPidStr = Read-Host ">" if( $SqlPidStr -in $SqlTaskList.PID) { $SqlPidInt = [int]$SqlPidStr break } } Write-Host "Using PID=$SqlPidInt for generating a $ProductStr memory dump" -ForegroundColor Green Write-Host "" } else # if only one SQL Server/SSAS on the box, go here { $SqlTaskList | Select-Object PID, "Image name", Services | Out-Host $SqlPidInt = [convert]::ToInt32($SqlTaskList.PID) Write-Host "Using PID=", $SqlPidInt, " for generating a $ProductStr memory dump" -ForegroundColor Green Write-Host "" } # dump type if ($ProductNumber -eq "1") # SQL Server memory dump { # ask what type of SQL Server memory dump while($true) { Write-Host "Which type of memory dump would you like to generate?" -ForegroundColor Yellow Write-Host "1) Mini-dump" Write-Host "2) Mini-dump with referenced memory " -NoNewLine; Write-Host "(Recommended)" Write-Host "3) Filtered dump " -NoNewline; Write-Host "(Not Recommended)" -ForegroundColor Red Write-Host "4) Full dump " -NoNewline; Write-Host "(Do Not Use on Production systems!)" -ForegroundColor Red Write-Host "" $SqlDumpTypeSelection = Read-Host "Enter 1-4>" if ($SqlDumpTypeSelection -in 1,2,3,4) { break } Write-Host "`nPlease enter a valid type of memory dump!`n" Start-Sleep -Milliseconds 300 } Write-Host "" switch ($SqlDumpTypeSelection) { "1" { $DumpType="0x0120"; break } "2" { $DumpType="0x0128"; break } "3" { $DumpType="0x8100"; break } "4" { $DumpType="0x01100"; break } default { "0x0120"; break } } } elseif ($ProductNumber -eq "2") # SSAS dump { # ask what type of SSAS memory dump while($true) { Write-Host "Which type of memory dump would you like to generate?" -ForegroundColor Yellow Write-Host "1) Mini-dump" Write-Host "2) Full dump " -NoNewline; Write-Host "(Do Not Use on Production systems!)" -ForegroundColor Red Write-Host "" $SSASDumpTypeSelection = Read-Host "Enter 1-2>" if ($SSASDumpTypeSelection -in 1,2) { break } Write-Host "`nPlease enter a valid type of memory dump!`n" Start-Sleep -Milliseconds 300 } Write-Host "" switch ($SSASDumpTypeSelection) { "1" {$DumpType="0x0";break} "2" {$DumpType="0x34";break} default {"0x0120"; break} } } elseif ($ProductNumber -in 3,4,5) # SSIS/SSRS/SQL Agent dump { # ask what type of SSIS memory dump while($true) { Write-Host "Which type of memory dump would you like to generate?" -ForegroundColor Yellow Write-Host "1) Mini-dump" Write-Host "2) Full dump" Write-Host "" $SSISDumpTypeSelection = Read-Host "Enter 1-2>" if ($SSISDumpTypeSelection -in 1,2) { break } Write-Host "`nPlease enter a valid type of memory dump!`n" Start-Sleep -Milliseconds 300 } Write-Host "" switch ($SSISDumpTypeSelection) { "1" { $DumpType="0x0"; break } "2" { $DumpType="0x34"; break } default { "0x0120"; break } } } # Sqldumper.exe PID 0 0x0128 0 c:\temp # output folder while($OutputFolder -eq "" -or !(Test-Path -Path $OutputFolder)) { Write-Host "" Write-Host "Where would your like the memory dump stored (output folder)?" -ForegroundColor Yellow $OutputFolder = Read-Host "Enter an output folder with no quotes (e.g. C:\MyTempFolder or C:\My Folder)" if ($OutputFolder -eq "" -or !(Test-Path -Path $OutputFolder)) { Write-Host "'" $OutputFolder "' is not a valid folder. Please, enter a valid folder location" -ForegroundColor Yellow } } # strip the last character of the Output folder if it is a backslash "\". Else Sqldumper.exe will fail if ($OutputFolder.Substring($OutputFolder.Length-1) -eq "\") { $OutputFolder = $OutputFolder.Substring(0, $OutputFolder.Length-1) Write-Host "Stripped the last '\' from output folder name. Now folder name is $OutputFolder" } # find the highest version of SQLDumper.exe on the machine $NumFolder = dir "C:\Program Files\Microsoft SQL Server\1*" | Select-Object @{name = "DirNameInt"; expression={[int]($_.Name)}}, Name, Mode | Where-Object Mode -Match "da*" | Sort-Object DirNameInt -Descending for( $j=0; $j -lt $NumFolder.Count; $j++) { $SQLNumfolder = $NumFolder.DirNameInt[$j] # start with the highest value from sorted folder names - latest version of dumper $SQLDumperDir = "C:\Program Files\Microsoft SQL Server\" + $SQLNumfolder.ToString() + "\Shared\" $TestPathDumperDir = $SQLDumperDir + "sqldumper.exe" if (Test-Path -Path $SQLDumperDir) { break } } # build the SQLDumper.exe command e.g. (Sqldumper.exe 1096 0 0x0128 0 c:\temp\) $cmd = "$([char]34)"+$SQLDumperDir + "sqldumper.exe$([char]34)" $arglist = $SqlPidInt.ToString() + " 0 " +$DumpType +" 0 $([char]34)" + $OutputFolder + "$([char]34)" Write-Host "Command for dump generation: ", $cmd, $arglist -ForegroundColor Green # do-we-want-multiple-dumps section Write-Host "" Write-Host "This utility can generate multiple memory dumps, at a certain interval" Write-Host "Would you like to collect multiple memory dumps (2 or more)?" -ForegroundColor Yellow # validate Y/N input while ($true) { $YesNo = Read-Host "Enter Y or N>" if ($YesNo -in "y","n") { break } Write-Host "Not a valid 'Y' or 'N' response" } # get input on how many dumps and at what interval if ($YesNo -eq "y") { [int]$DumpCountInt=0 while (1 -ge $DumpCountInt) { Write-Host "How many dumps would you like to generate for this $ProductStr ?" -ForegroundColor Yellow $DumpCountStr = Read-Host ">" if ([int]::TryParse($DumpCountStr, [ref]$DumpCountInt) -and $DumpCountInt -gt 1) { break } Write-Host "Please enter a number greater than one." -ForegroundColor Red } [int]$DelayIntervalInt=0 while ($true) { Write-Host "How frequently (in seconds) would you like to generate the memory dumps?" -ForegroundColor Yellow $DelayIntervalStr = Read-Host ">" if ([int]::TryParse($DelayIntervalStr, [ref]$DelayIntervalInt) -and $DelayIntervalInt -gt 0) { break } Write-Host "Please enter a number greater than zero." -ForegroundColor Red } Write-Host "Generating $DumpCountInt memory dumps at a $DelayIntervalStr-second interval" -ForegroundColor Green # loop to generate multiple dumps $cntr = 0 while ($true) { Start-Process -FilePath $cmd -Wait -Verb runAs -ArgumentList $arglist $cntr++ Write-Host "Generated $cntr memory dump(s)." -ForegroundColor Green if ($cntr -ge $DumpCountInt) { break } Start-Sleep -S $DelayIntervalInt } # print what files exist in the output folder Write-Host "" Write-Host "Here are all the memory dumps in the output folder '$OutputFolder'" -ForegroundColor Green $MemoryDumps = $OutputFolder + "\SQLDmpr*" Get-ChildItem -Path $MemoryDumps Write-Host "" Write-Host "Process complete" } else # produce just a single dump { Start-Process -FilePath $cmd -Wait -Verb runAs -ArgumentList $arglist # print what files exist in the output folder Write-Host "" Write-Host "Here are all the memory dumps in the output folder '$OutputFolder'" -ForegroundColor Green $MemoryDumps = $OutputFolder + "\SQLDmpr*" Get-ChildItem -Path $MemoryDumps Write-Host "" Write-Host "Process complete" } Write-Host "For errors and completion status, review SQLDUMPER_ERRORLOG.log created by SQLDumper.exe in the output folder '$OutputFolder'.`nOr if SQLDumper.exe failed, look in the folder from which you are running this script."
使用以下命令,以管理员身份从命令提示符运行它:
Powershell.exe -File SQLDumpHelper.ps1
或者从 Windows PowerShell 控制台运行它,并使用以下命令以管理员身份运行:
.\SQLDumpHelper.ps1
注意
如果从未在系统上运行 PowerShell 脚本,可能会收到以下错误消息:
“文件...无法加载 SQLDumpHelper.ps1,因为在此系统上禁用了正在运行的脚本。
若要启用运行命令的功能,请执行以下步骤:
使用“以管理员身份运行”选项启动 Windows PowerShell 控制台。 只有计算机上的管理员组成员才能更改执行策略。
通过以下命令启用运行未签名的脚本:
Set-ExecutionPolicy RemoteSigned
注意
这样,就可以运行在本地计算机上创建的未签名脚本以及从 Internet 签名的脚本。