适用范围:SQL Server
在 SQL 跟踪中,如果事件是在跟踪定义中列出的事件类的实例,则收集这些事件。 这些事件可以从跟踪中过滤掉,或排队发送至其目标位置。 目标可以是文件或 SQL Server 管理对象 (SMO),它可以使用管理 SQL Server 的应用程序中的跟踪信息。
重要
已弃用 SQL 跟踪和 SQL Server Profiler。 包含 Microsoft SQL Server 跟踪和重播对象的“Microsoft.SqlServer.Management.Trace”命名空间也已遭弃用。
在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。
请改用扩展事件。 有关扩展事件的详细信息,请参阅快速入门:SQL Server 中的扩展事件和 SSMS XEvent 探查器。
SQL 跟踪的优点
Microsoft SQL Server 提供了 Transact-SQL 系统存储过程,可在 SQL Server 数据库引擎的实例上创建跟踪。 可以不使用 SQL Server Profiler,而使用这些系统存储过程从你自己的应用程序中手动创建跟踪。 这样,你就可以针对企业的特定需求编写自定义应用程序。
SQL 跟踪架构
事件源可以是生成跟踪事件(例如 Transact-SQL 批处理)或 SQL Server 事件(例如死锁)的任何源。 有关事件的详细信息,请参阅 SQL Server Event Class Reference。 事件发生后,如果该事件类已经包含在跟踪定义中,则跟踪将收集该事件信息。 如果已经在跟踪定义中为该事件类定义筛选器,则将应用这些筛选器并将跟踪事件信息传递到队列。 队列中的跟踪信息要么被写入文件,要么可由 SQL Server Profiler 等应用程序中的 SMO 使用。 下图显示了 SQL Trace 如何在跟踪过程中收集事件。
SQL 跟踪术语
下列词汇介绍了 SQL 跟踪的重要概念。
事件
某个操作在 Microsoft SQL Server 数据库引擎实例中的发生。
数据列
事件的属性。
事件类
可以被跟踪的事件类型。 该事件类包含可以由事件报告的所有数据列。
事件类别
一组相关的事件类。
跟踪 (名词)
数据库引擎返回的事件和数据的集合。
跟踪 (动词)
收集并监视 SQL Server 实例中的事件。
跟踪定义
事件类、数据列和筛选器的集合,用于标识跟踪过程中收集的事件的类型。
Filter
用于限制在跟踪中收集的事件的条件。
跟踪文件
保存跟踪记录时创建的文件。
模板
在 SQL Server Profiler 中,用来定义要在跟踪中收集的事件类和数据列的文件。
跟踪表
在 SQL Server Profiler 中,将跟踪保存到表时创建的表。
使用数据列描述返回的事件
跟踪运行时,SQL 跟踪使用跟踪输出中的数据列来描述返回的事件。 下表说明了 SQL Server Profiler 数据列(这些数据列与 SQL 跟踪使用的数据列相同),并指示默认情况下选择的列。
| 数据列 | 列号 | 描述 |
|---|---|---|
| * 应用程序名称 | 10 | 用于创建与 SQL Server 实例的连接的客户端应用程序的名称。 此列由该应用程序传递的值填充,而不是由程序名填充的。 |
| BigintData1 | 52 | 值(bigint 数据类型),取决于跟踪中指定的事件类。 |
| BigintData2 | 53 | 值(bigint 数据类型),取决于跟踪中指定的事件类。 |
| * 二进制数据 | 2 | 取决于跟踪中捕获的事件类别的二进制值。 |
| * ClientProcessID | 9 | 由主机分配给正在运行客户端应用程序的进程的 ID。 如果客户端提供了客户端进程 ID,则填充此数据列。 |
| ColumnPermissions | 44 | 指示是否设置了列权限。 您可以解析语句文本,以确定哪些权限应用于哪些列。 |
| * 中央处理器 | 18 | 事件使用的 CPU 时间(毫秒)。 |
| 数据库 ID | 3 | 由 USE database_name 语句指定的数据库的 ID;如果未对给定实例发出 USE database_name 语句,则为默认数据库的 ID。 如果在跟踪中捕获 ServerName 数据列且服务器可用,SQL Server Profiler 将显示数据库名称。 可使用 DB_ID 函数来确定数据库的值。 |
| DatabaseName | 35 | 正在运行用户语句的数据库的名称。 |
| DBUserName | 40 | 客户端的 SQL Server 用户名。 |
| * 持续时间 | 13 | 事件的持续时间(微秒)。 服务器以微秒(百万分之一秒或 10-6 秒)为单位报告事件的持续时间,以毫秒(千分之一秒或 10-3 秒)为单位报告事件使用的 CPU 时间。 SQL Server Profiler 图形用户界面默认以毫秒为单位显示 “持续时间” 列,但是当跟踪保存到文件或数据库表中时,将以微秒为单位写入“持续时间” 列值。 |
| * 终结时间 | 15 | 事件的结束时间。 对指示事件开始的事件类(例如 SQL:BatchStarting 或 SP:Starting)将不填充此列。 |
| 错误 | 31 | 给定事件的错误号。 通常是 sysmessages 中存储的错误号。 |
| * 事件类 | 27 | 捕获的事件类的类型。 |
| EventSequence | 51 | 此事件的序列号。 |
| EventSubClass | 21 | 事件子类的类型,提供有关每个事件类的详细信息。 例如, Execution Warning 事件类的事件子类值代表执行警告的类型: 1 = 查询等候。 查询执行之前必须等待资源;例如,内存。 2 = 查询超时。查询等待执行所需资源时超时。 所有事件类都不填充此数据列。 |
| GUID | 54 | GUID 值,具体取决于跟踪中指定的事件类。 |
| FileName | 36 | 所修改的文件的逻辑名称。 |
| Handle | 33 | 一个整数,ODBC、OLE DB 或 DB-Library 使用它来协调服务器的执行情况。 |
| HostName | 8 | 正在运行客户端程序的计算机的名称。 如果客户端提供了主机名,则填充此数据列。 若要确定主机名,请使用 HOST_NAME 函数。 |
| IndexID | 24 | 受该事件影响的对象上索引的 ID。 若要确定对象的索引的 ID,请使用 sysindexes 系统表的 indid 列。 |
| IntegerData | 25 | 取决于跟踪中捕获的事件类别的整数值。 |
| IntegerData2 | 55 | 取决于跟踪中捕获的事件类别的整数值。 |
| IsSystem | 60 | 指示该事件发生在系统进程还是用户进程上: 1 = 系统 0 = 用户 |
| LineNumber | 5 | 包含存在错误的行的行号。 对于涉及 Transact-SQL 语句的事件(如 SP:StmtStarting),LineNumber 包含存储过程或批处理中语句的行号。 |
| LinkedServerName | 45 | 链接服务器的名称。 |
| * 登录名 | 11 | 用户的登录名(SQL Server 安全登录名或 Windows 登录凭据,格式为“域/用户名”)。 |
| LoginSid | 41 | 已登录的用户的安全标识符 (SID)。 可以在 master 数据库的 sys.server_principals 视图中找到此信息。 服务器中的每个登录名都具有唯一的 ID。 |
| MethodName | 47 | OLEDB 方法的名称。 |
| 模式 | 32 | 一个整数,各种事件都使用它来描述事件要请求或已接收的状态。 |
| NestLevel | 29 | 一个整数,表示 @@NESTLEVEL 返回的数据。 |
| NTDomainName | 7 | 用户所属的 Microsoft Windows 域。 |
| * NTUserName | 6 | Windows 用户名。 |
| ObjectID | 22 | 系统分配的对象 ID。 |
| ObjectID2 | 56 | 相关对象或实体(如果存在)的 ID。 |
| ObjectName | 34 | 被引用对象的名称。 |
| ** 对象类型 | 28 | 表示事件中涉及的对象类型的值。 该值对应于 sysobjects 中的 type 列。 |
| 偏移 | 61 | 语句在存储过程或批处理中的起始偏移量。 |
| OwnerID | 58 | 仅适用于锁定事件。 拥有锁的对象的类型。 |
| OwnerName | 37 | 对象所有者的数据库用户名。 |
| ParentName | 59 | 该对象所在的架构的名称。 |
| 权限 | 19 | 表示所检查的权限类型的整型值。 值为: 1 = 全选 2 = UPDATE 全部 4 = 全部引用 8 = INSERT 16 = DELETE 32 = EXECUTE(仅限存储过程) 4096 = SELECT ANY (至少选择一列) 8192 = UPDATE 任意 16384 = REFERENCES ANY |
| ProviderName | 46 | OLE DB 提供程序的名称。 |
| * 读取 | 16 | 由服务器代表事件读取逻辑磁盘的次数。 这些读取操作包括在语句执行期间对表和缓冲区进行的所有读取。 |
| RequestID | 49 | 包含该语句的请求的 ID。 |
| RoleName | 38 | 正在启用的应用程序角色名。 |
| RowCounts | 48 | 批处理中的行数。 |
| ServerName | 26 | 正在跟踪的 SQL Server 实例的名称。 |
| SessionLoginName | 64 | 发起会话的用户的登录名。 例如,如果你使用 Login1 连接到 SQL Server 并以 Login2 身份执行语句,则 SessionLoginName 将显示 Login1,而 LoginName 将显示 Login2。 此数据列将同时显示 SQL Server 登录名和 Windows 登录名。 |
| 严重性 | 20 | 异常事件的严重性级别。 |
| SourceDatabaseID | 62 | 存在该对象的源的数据库 ID。 |
| * SPID | 12 | SQL Server 分配给与客户端关联的进程的会话 ID (SPID)。 |
| SqlHandle | 63 | 基于即席查询文本或 SQL 对象的数据库和对象 ID 生成的 64 位哈希值。 可以将该值传递到 sys.dm_exec_sql_text() 以检索关联的 SQL 文本。 |
| * 开始时间 | 14 | 事件(如果有)的开始时间。 |
| State | 30 | 错误状态代码。 |
| 成功 | 23 | 表示事件是否成功。 值包括: 1 = 成功。 0 = 失败 例如, 1 表示权限检查成功,而 0 表示权限检查失败。 |
| TargetLoginName | 42 | 对于以登录名作为目标的操作,即目标登录名的名称;例如,添加新登录名。 |
| TargetLoginSid | 43 | 对于以登录名作为目标的操作,即目标登录名的 SID;例如,添加新登录名。 |
| TargetUserName | 39 | 如果是针对某个数据库用户的操作(例如,授予用户权限),这是该用户的名称。 |
| * 文本数据 | 1 | 跟踪中捕获的、取决于事件类的文本值。 但是,如果跟踪参数化查询,则变量不会在 TextData 列中显示其数据值。 |
| 交易 ID | 4 | 事务的系统分配 ID。 |
| 类型 | 57 | 取决于跟踪中捕获的事件类别的整数值。 |
| * 写 | 17 | 服务器为该事件执行的物理磁盘写入操作次数。 |
| XactSequence | 50 | 用于说明当前事务的标记。 |
* 默认情况下,对于所有事件,均填充这些数据列。
** 有关 ObjectType 数据列的详细信息,请参阅 ObjectType 跟踪事件列。
SQL 跟踪任务
| 任务说明 | 主题 |
|---|---|
| 介绍如何使用 TRANSACT-SQL 存储过程创建和运行跟踪。 | 使用 Transact-SQL 存储过程创建和运行跟踪 |
| 介绍如何在 SQL Server 数据库引擎实例上使用存储过程创建手动跟踪。 | 使用存储过程创建手动跟踪 |
| 介绍如何将跟踪结果保存到写入这些结果的文件中。 | 将跟踪结果保存到文件 |
| 介绍如何使用 temp 目录中的空间来提高访问跟踪数据的性能。 | 改进对跟踪数据的访问 |
| 介绍如何使用存储过程创建跟踪。 | 创建跟踪 (Transact-SQL) |
| 介绍如何使用存储过程创建只检索有关所需跟踪事件信息的筛选器。 | 设置跟踪筛选器 (Transact-SQL) |
| 介绍如何使用存储过程修改现有跟踪。 | 修改现有跟踪 (Transact-SQL) |
| 介绍如何使用内置函数查看保存的跟踪。 | 查看已保存的跟踪 (Transact-SQL) |
| 介绍如何使用内置函数查看跟踪筛选器信息。 | 查看筛选器信息 (Transact-SQL) |
| 介绍如何使用存储过程删除跟踪。 | 删除跟踪 (Transact-SQL) |
| 描述如何最大限度地降低跟踪造成的性能开销。 | 优化 SQL 跟踪 |
| 介绍如何筛选跟踪以将跟踪过程中的开销降到最低。 | 过滤跟踪 |
| 介绍如何将跟踪收集的数据量降至最低。 | 限制跟踪文件和表的大小 |
| 介绍在 Microsoft SQL Server 中安排跟踪的两种方法。 | 安排跟踪 |