sp_whoisactive @get_locks 参数 xml 错误

kev*_*hat 6 sql-server sp-whoisactive

我在运行以下命令时经常收到此错误

sp_whoisactive @get_locks = 1
Run Code Online (Sandbox Code Playgroud)

消息 6841,级别 16,状态 1,过程 sp_WhoIsActive,第 4287 行 FOR XML 无法序列化节点“Lock/@resource_description”的数据,因为它包含 XML 中不允许的字符 (0x0001)。要使用 FOR XML 检索此数据,请将其转换为 binary、varbinary 或 image 数据类型并使用 BINARY BASE64 指令。警告:空值被聚合或其他 SET 操作消除。

我相信这与抓取所持有的锁的 xml 相关,但是我注意到它在发生阻塞时经常发生。有什么办法可以解决这个问题还是已知问题?运行 SQL Server 2012 和 sp_whoisactive 的最新版本v11.32

编辑

按照建议的选项,我无法找到此数据。我主要是在服务器阻塞时遇到该消息,一旦我遇到该消息,我就会关闭参数并尝试查看它可能来自哪个对象,但这很困难,因为有很多线程正在运行。有没有更简单的方法呢?我最初并不认为它是数据而是一个对象名称,因为当我看到锁 xml 时它通常只包含对象名称,我没有意识到实际数据被放置在那里可能会导致此消息?

编辑 2

按照 Erik 的建议,我能够通过输出 #locks 表结果的 SOH 字符来跟踪对象。然而,最终我发现最有用的是使用 get_task_info = 2 和 get_additional_info = 1 的解决方法,运行这些参数时,我没有收到错误消息,但仍然收到我需要的信息。我仍将尝试将该字符添加到 sp_whoisactive 中的替换语句中,以便在需要查看完整 XML 的情况下仍然可以使用 get_locks 参数。

Eri*_*ing 5

我无法完全回答您关于哪个对象导致问题的问题,但我可以为您提供一些故障排除和可能的解决方法。

请注意,由于获得许可,我无法向您分发“固定”脚本,但您可以在本地自由尝试编辑。

故障排除

如果您通过 sp_WhoIsActive for ctrl+f @get_locks = 1,您将点击此代码部分:

坚果

再往下一点,您会看到一个相当复杂的选择插入到名为 的表中#locks

坚果

如果您向下滚动到第 1670 行左右(假设您在 SSMS 中启用了行号),您将到达SELECT INTO填充它的末尾。您可以尝试SELECT * FROM #locks;在此处添加一个简单的内容以查看表格中的内容。这至少可能会指向正确的对象。

解决方法

不更改任何代码的一种解决方法可能是运行如下程序:

EXEC sp_WhoIsActive 
    @get_task_info = 2, 
    @get_additional_info = 1;
Run Code Online (Sandbox Code Playgroud)

此处记录了这些参数的用途

如果没有错误地运行,你就会被困在为FETCH NEXT FROM locks_cursor. 这会将您带到弹出错误的代码部分。

在这个游标代码块中,您将找到一个动态查询、一个 catch 块和一个带有嵌套REPLACE块的更新以清除坏字符(除了您的,它出现了)。我相信你必须REPLACE在所有这些中添加一个额外的嵌套,NCHAR(0x0001)我相信,为了修复它。我没有测试过这个,所以YMMV。

希望这可以帮助!