

# 在 SQL Server 数据库实例上运行服务器端跟踪
<a name="Appendix.SQLServer.CommonDBATasks.TuningAdvisor.ServerSide"></a>

通过编写脚本创建服务器端跟踪这一过程可能较为复杂，且已超出本文档的讨论范围。本部分包含一些您可以用作示例的示例脚本。与客户端跟踪一样，服务器端跟踪的目的是，创建可通过 Database Engine Tuning Advisor 打开的工作负载文件或跟踪表。

下面显示的是一个简化的示例脚本，用于启动服务器端跟踪并将详细信息捕获到工作负载文件。跟踪最初会将信息保存到 D:\\RDSDBDATA\\Log 目录中的 RDSTrace.trc 文件，且会每 100 MB 转换一个跟踪文件，这样，后续的跟踪文件命会依次命名为 RDSTrace\_1.trc、RDSTrace\_2.trc 等。

```
DECLARE @file_name NVARCHAR(245) = 'D:\RDSDBDATA\Log\RDSTrace';
DECLARE @max_file_size BIGINT = 100;
DECLARE @on BIT = 1
DECLARE @rc INT
DECLARE @traceid INT

EXEC @rc = sp_trace_create @traceid OUTPUT, 2, @file_name, @max_file_size
IF (@rc = 0) BEGIN
   EXEC sp_trace_setevent @traceid, 10, 1, @on
   EXEC sp_trace_setevent @traceid, 10, 2, @on
   EXEC sp_trace_setevent @traceid, 10, 3, @on
 . . .
   EXEC sp_trace_setfilter @traceid, 10, 0, 7, N'SQL Profiler'
   EXEC sp_trace_setstatus @traceid, 1
   END
```

以下示例是停止跟踪的脚本。请注意，以前的脚本所创建的跟踪会继续运行，直到您显式地停止跟踪或磁盘空间不足以运行此进程为止。

```
DECLARE @traceid INT
SELECT @traceid = traceid FROM ::fn_trace_getinfo(default) 
WHERE property = 5 AND value = 1 AND traceid <> 1 

IF @traceid IS NOT NULL BEGIN
   EXEC sp_trace_setstatus @traceid, 0
   EXEC sp_trace_setstatus @traceid, 2
END
```

您可以将服务器端跟踪结果保存到数据库表，然后借助 fn\_trace\_gettable 函数，将数据库表用作 Tuning Advisor 的工作负载。以下命令会将 D:\\rdsdbdata\\Log 目录（包括 RDSTrace\_1.trc 等所有滚动更新文件）中名为 RDSTrace.trc 的所有文件的结果加载到当前数据库中名为 RDSTrace 的表中。

```
SELECT * INTO RDSTrace
FROM fn_trace_gettable('D:\rdsdbdata\Log\RDSTrace.trc', default);
```

要将特定滚动更新文件保存到表中，例如 RDSTrace\_1.trc 文件，请为 fn\_trace\_gettable 指定滚动更新文件的名称和替换值 1，以代替默认值这一最后的参数。

```
SELECT * INTO RDSTrace_1
FROM fn_trace_gettable('D:\rdsdbdata\Log\RDSTrace_1.trc', 1);
```