我使用 Adam Machanic 的出色sp_WhoIsActive
过程来查看活动并记录到表中以对长时间运行的查询进行故障排除。
为什么执行计划没有一直显示在结果中?大多数情况下,该query_plan
值为 NULL。如果我查看结果中的SQL_TEXT
列,我会看到带有参数但没有值的查询,如下所示:
(@P0 nvarchar(4000),@P1 nvarchar(4000))
select blah from foo where a = @P0 and b = @P1
Run Code Online (Sandbox Code Playgroud)
执行计划未显示在此处时如何获取它们?他们为什么不显示?我必须使用 Profiler 或扩展事件吗?将虚拟值放入这些参数并运行包含实际执行计划的查询是否会生成与我记录时实际使用的计划相同的计划?
我已经与供应商确认他们正在使用 Hibernate 3.5。
performance sql-server stored-procedures execution-plan sp-whoisactive query-performance
我已使用以下语法在我们的一台服务器上运行sp_WhoIsActive:
sp_whoisactive @get_plans = 1, @show_sleeping_spids = 0, @get_outer_command = 1, @get_locks = 1
Run Code Online (Sandbox Code Playgroud)
并用sql_command(显示的列@get_outer_command
设置为1)找到了一个spid,如下所示
(@p1 int,@p2 int)
Exec MyDatabase.MyProc @p1 @p2
Run Code Online (Sandbox Code Playgroud)
当我尝试在我的测试 Adventureworks 数据库上使用此语法运行查询时:
(@be int)
SELECT *
FROM Person.Person
WHERE BusinessEntityID = @be
Run Code Online (Sandbox Code Playgroud)
我收到错误
消息 1050,级别 15,状态 1,第 1 行 此语法仅适用于参数化查询。消息 137,级别 15,状态 2,第 4 行 必须声明标量变量“@FN”。
所以这似乎与参数化查询有关。这是有道理的,因为变量 @be 永远不会被设置为一个值
这里发生了什么?
我在运行以下命令时经常收到此错误
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 参数。
全部,
我目前正在整理一篇基于知识的文章,我们可以将其交给我们的帮助台进行浏览,以便进行一些初步的故障排除或信息收集。我所做的一件事是创建能力(感谢 Brent,https: //www.brentozar.com/askbrent)为非系统管理员提供运行 sp_whoisactive 以输出他们可以提供给像我这样的 dbas 的一些细节的能力票。我遇到的问题是我想从结果中排除“sql_text”,但我似乎无法弄清楚如何?
我知道您可以在输出到表(@output_column_list 参数)时过滤输出,但我没有让代理将其导出到表。最初,我的印象是“@output_column_list”是我可以调整我想在结果中看到的列的地方,但它显然只是一个用于将输出过滤到表格的参数。在我绝望的尝试中,我无论如何都尝试了上述参数,并且会从输出中省略“sql_text”,但所做的只是重新定位列顺序。
EXEC sp_WhoIsActive @output_column_list = '[dd%][session_id][login_name][wait_info][tasks][tran_log%][cpu%][temp%][block%][reads%][writes%][context%][physical%][query_plan][locks][%]'
Run Code Online (Sandbox Code Playgroud)
因此,我希望他们能够将内容(带标题)复制到要附加的 Excel 工作表中。工作越简单越好,因为我担心如果我向服务台提供太多信息会混淆他们。
我错过了什么吗?他们将无法运行任何作业,甚至无法查看日志,因此他们的权利已经非常有限。
我有几个相同的(据我所知)SQL Server,我最近在其中添加了 sp_WhoIsActive(向一些人展示了我有多喜欢这个工具),但其中一个不允许我创建存储过程。我收到一个我非常熟悉的错误,该错误涉及 CTE 需要前面的语句以分号结尾。其他服务器均未收到此错误。
我将脚本归结为以下内容以重新创建问题:
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET ANSI_WARNINGS ON;
SET NUMERIC_ROUNDABORT OFF;
SET ARITHABORT ON;
GO
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'sp_WhoIsActive')
EXEC ('CREATE PROC dbo.sp_WhoIsActive AS SELECT ''stub version, to be replaced''')
GO
ALTER PROC dbo.sp_WhoIsActive
(
@filter sysname = ''
)
AS
BEGIN;
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET ANSI_WARNINGS ON; …
Run Code Online (Sandbox Code Playgroud) 我在生产服务器上有一个 SQL 代理作业,它不断失败并显示以下消息。它应该使用SP_WHOISACTIVE
存储的 proc 以定期安排的时间间隔捕获 SQL Server 活动。
以用户身份执行:警告:聚合或其他 SET 操作消除了空值。[SQLSTATE 01003](消息 8153)
警告:空值被聚合或其他 SET 操作消除。[SQLSTATE 01003](消息 8153)
警告:空值被聚合或其他 SET 操作消除。[SQLSTATE 01003](消息 8153)
违反 PRIMARY KEY 约束“PK_WhoIsActive”。无法在对象“monitoring.WhoIsActive”中插入重复键。重复的键值为 (Jan 20 2017 8:25AM, 109)。[SQLSTATE 23000](错误 2627)
该语句已终止。[SQLSTATE 01000](错误 3621)。
步骤失败。
知道是什么原因造成的吗?
我应该遵循哪些步骤来修复此错误?
sql-server sql-server-2008-r2 sql-server-agent jobs sp-whoisactive
我使用sp_WhoIsActive和sp_BlitzFirst(ExpertMode
参数设置为 1)来实时了解 SQL Server 上发生的情况。我觉得这是对的升级sp_who
,sp_who2
等等......
任何人都可以解释一下,如果两者之间有任何区别。它们似乎显示相同的内容,尽管列的设置略有不同。此外,BlitzFirst 在其输出中显示了一些其他信息作为单独的输出表
在这个视频中,布伦特展示了他的分类过程,他同时使用了这两种方法sp_WhoIsActive
,sp_BlitzFirst
这让我觉得肯定有一些不同,但除非我错过了视频中的某些内容,否则我不明白为什么sp_WhoIsActive
需要
我有一个简单的任务来迁移数据库。
我正在主数据库中进行备份,将其设置为 OFFLINE,然后将其迁移到辅助数据库。
完全没有问题。
但我注意到一些奇怪的事情。
我检查是否有人将数据库与 一起使用sp_WhoIsActive
,但它什么也没显示。
然后我使用alter database X set offline
.
然后它根本不会改变它,并且查询继续运行。然后我再次检查是否有什么东西在使用数据库,令我惊讶的是,它显示了一些运行了 22 小时、20 小时或 44 分钟的东西。
为什么不sp_WhoIsActive
显示?
例子:
第一次运行:
然后Alter etc etc set offline
。然后它锁定,我再次检查
sp_WhoIsActive
砰。有什么东西在跑。
我正在使用 sp_WhoIsActive。
当服务器发生阻塞时,我想快速确定谁是罪魁祸首。
专栏login_name
没有给我太多关于拦截器的信息,因为有数百人使用公司的应用程序并在相同的下登录login_name
。
我可以看到blocking_session_id
,但这并没有告诉我阻止者的host_name
.
还有一个专栏host_name
,但这是一个waiter
(不是阻止者)
那么有什么方法可以快速找到该用户host_name
或machine name
任何其他身份的用户是谁呢blocker
?
我一直在使用sp_whoisactive,这对于查找运行会话和阻塞的详细信息非常有帮助。
我想检查是否有任何选项可以根据此过程安排作业,并仅在数据库上存在活动阻塞并且阻塞持续时间超过可配置的分钟数时才提醒我。
此外,只有当它达到超过可配置的数据库阻塞数量时才应触发警报。
我使用了http://www.sqlserver-dba.com/2017/01/how-to-monitor-blocked-processes-with-sql-alert-and-email-sp_whoisactive-report.html中给出的详细信息,但是它发送每次运行时发出警报,似乎没有检查是否有阻塞。无论是只运行一个查询还是运行多个查询,无论是阻塞还是不阻塞,都发送电子邮件。不确定,如果我错过了什么。
有一个从这里建模的 sql 代理作业,它使用 sp_whoisactive 将结果捕获到表中。99% 它工作正常,但 sql 代理作业时不时会失败并出现以下错误:
Warning: Null value is eliminated by an aggregate or other SET operation. [SQLSTATE 01003] (Message 8153) Violation of PRIMARY KEY constraint 'PK__#ADDF8B9__69B13FDC8C10EA7F'. Cannot insert duplicate key in object 'dbo.@blockers'. The duplicate key value is (623). [SQLSTATE 23000] (Error 2627) The statement has been terminated. [SQLSTATE 01000] (Error 3621) Warning: Null value is eliminated by an aggregate or other SET operation. [SQLSTATE 01003] (Message 8153) Warning: Null value is eliminated by …
如果我想知道现在发生了什么,那么我会使用 Adam Machanic 的sp_whoisactive
。如果我想了解我的服务器最近发生了什么,那么我将使用查询存储。
扩展事件旨在取代 Profiler,但我认为查询存储的组合sp_whoisactive
已经在 2016 或更高版本的任何 SQL Server 上做到了这一点。考虑到这一点,我什么时候会使用扩展事件?
为了获得灵感,我检查了dbatools 附带的扩展事件。我没有留下深刻的印象。它们似乎只对长期监控查询存储不存储的内容有用。例如:某些登录正在执行的操作、锁定、极其特定的 IO 类型、存储过程参数的使用以及已弃用的功能的使用。这些都很好,但坦率地说,我无法想象自己必须在服务器上进行如此外科手术式的调整。有没有我遗漏的常见用法?
monitoring sql-server extended-events query-store sp-whoisactive
sp-whoisactive ×12
sql-server ×12
cte ×1
jobs ×1
monitoring ×1
parameter ×1
performance ×1
query-store ×1
ssms ×1
syntax ×1
t-sql ×1