时间:2021-07-01 10:21:17 帮助过:19人阅读
--开启Default Trace sp_configure ‘show advanced options‘ , 1 ; GO RECONFIGURE; GO sp_configure ‘default trace enabled‘ , 1 ; GO RECONFIGURE; GO --测试是否开启 EXEC sp_configure ‘default trace enabled‘; GO --关闭Default Trace sp_configure ‘default trace enabled‘ , 0 ; GO RECONFIGURE; GO sp_configure ‘show advanced options‘ , 0 ; GO RECONFIGURE; GO
通过以下命令找到默认跟踪的文件路径
select * from ::fn_trace_getinfo(0)

以上命令返回的结果值,各个值(property)代表的含义如下:
第一个:2表示滚动文件;
第二个:表示当前使用的trace文件路径,根据它我们可以找到其它的跟踪文件,默认是同一目录下
第三个:表示滚动文件的大小(单位MB),当到达这个值就会创建新的滚动文件
第四个:跟踪的停止时间,这里为Null,表示没有固定的停止时间
第五个:当前跟踪的状态:0 停止;1 运行
找到该目录,我们查看下该文件:
、
系统默认提供5个跟踪文件,并且每一个文件默认大小都是20MB,SQL Server会自己维护这5个文件,当实例重启的时候或者到达最大值的时候,之后会重新生成新的文件,将最早的跟踪文件删除,依次滚动更新。
我们通过以下命令来查看跟踪文件中的内容:

默认的跟踪文件,提供的跟踪信息还是很全的,从中我们可以找到登录人,操作信息等,上面的截图只是包含的部分信息。我们可以利用该语句进行自己的加工,然后获得更有用的信息。
--获取跟踪文件中前100行执行内容
SELECT TOP 100
 gt.[HostName] 
,gt.[ServerName] 
,gt.[DatabaseName] 
,gt.[SPID] 
,gt.[ObjectName] 
,gt.[objecttype] [ObjectTypeID] 
,sv.[subclass_name] [ObjectType] 
,e.[category_id] [CategoryID] 
,c.[Name] [Category] 
,gt.[EventClass] [EventID] 
,e.[Name] [EventName] 
,gt.[LoginName] 
,gt.[ApplicationName] 
,gt.[StartTime] 
,gt.[TextData] 
FROM fn_trace_gettable(‘E:\dataDefaultFileManger\MSSQL10.MSSQLSERVER\MSSQL\Log\log_1267.trc‘, DEFAULT) gt 
LEFT JOIN sys.trace_subclass_values sv 
ON gt.[eventclass] = sv.[trace_event_id] AND sv.[subclass_value] = gt.[objecttype] 
INNER JOIN sys.trace_events e 
ON gt.[eventclass] = e.[trace_event_id] 
INNER JOIN sys.trace_categories c 
ON e.[category_id] = c.[category_id] 
WHERE gt.[spid] > 50 AND --50以内的spid为系统使用
    gt.[DatabaseName] = ‘master‘ AND --根据DatabaseName过滤
    gt.[ObjectName] = ‘fn_trace_getinfo‘ AND --根据objectname过滤
    e.[category_id]  = 5 AND --category 5表示对象,8表示安全
    e.[trace_event_id] = 46 
    --trace_event_id 
    --46表示Create对象(Object:Created),
    --47表示Drop对象(Object:Deleted),
    --93表示日志文件自动增长(Log File Auto Grow),
    --164表示Alter对象(Object:Altered),
    --20表示错误日志(Audit Login Failed)
ORDER BY [StartTime] DESC

我创建了一张表,通过上面的跟踪,可以跟踪到该记录的信息,根据不同的过滤信息,我们可以查询出到跟踪的某个库的某个表的更改信息,包括:46创建(Created)、47删除(Deleted)、93文件自动增长信息(Log File Auto Grow)、146修改(Alter)、20表示错误日志(Login Failed)
在生产环境中,以上几个分类都是比较常用的,对定位部分问题的定位能够在找到充分的证据可循,比如某厮将数据库数据删除掉了还不承认等,这里面的Login Failed信息,能够追踪出有那么用户尝试登陆过数据库,并且失败,如果大面积的出现这种情况,那就要谨防黑客袭击了。
当然,这里我还可以利用SQL Server自带的Profile工具,打开查看跟踪文件中的内容。

这个图像化的工具就比较熟悉了,直接打开进行筛选就可以了。
这种方式看似不错,但是它也有本身的缺点,我们来看:
1、这5个文件是滚动更新的,而且每个文件默认最大都为20MB,并且没有提供更改的接口,所以当文件填充完之后就会删除掉,所以会找不到太久以前的内容;
2、本身默认的跟踪,只是提供一些关键信息的追踪,其中包括:auditing events,database events,error events,full text events,object creation,object deletion,object alteration,想要找到其它更详细的内容,此方式可能无能为力;
3、在SQL Server2012后续版本的 Microsoft SQL Server 将删除该功能,改用扩展事件。
二.自定义跟踪信息(Default Trace)
根据上面SQL Server自带的跟踪信息有一些局限性,SQL Server为我们提供了自定义跟踪的接口,我们可以自己定义跟踪,充分扩展方法。
利用如下系统存储过程,我们可以创建自定义的Trace
sp_trace_create [ @traceid = ] trace_id OUTPUT 
          , [ @options = ] option_value  
          , [ @tracefile = ] ‘trace_file‘ 
     [ , [ @maxfilesize = ] max_file_size ]
     [ , [ @stoptime = ] ‘stop_time‘ ]
     [ , [ @filecount = ] ‘max_rollover_files‘ ]
@traceid 系统默认分配跟踪的ID号
@options 指定为跟踪设置的选项,系统默认提供的几个选项:
2表示当文件写满的时候,关闭当前跟踪并创建新文件。
4表示如果不能将跟踪写入文件,不管什么原因导致,SQL Server则会关闭。这个可以利用此选项,追踪问题
8制定服务器产生的最后5MB的跟踪信息记录由服务器保存。
@tracefile 跟踪文件的路径,这里可以是share的路径
@maxfilesize 跟踪文件的大小,单位是MB,默认不设置为5MB
@stoptime 跟踪停止的时间,利用它我们可以定时跟踪结束的日期
@filecount 默认生产的跟踪文件的数量,比如默认的为5个,那就在第5个文件写完的时候进行覆盖第1个文件滚动
比如我们可以利用如下脚本进行创建
--创建跟踪文件返回值 declare @rc int --创建一个跟踪句柄 declare @TraceID int --创建跟踪文件路径 declare @TraceFilePath nvarchar(500) set @TraceFilePath=N‘F:\SQLTest\‘ --跟踪文件的大小 declare @maxfilesize bigint set @maxfilesize=5 --设置停止的时间 declare @EndTime datetime set @EndTime=null --设置系统默认的操作 declare @options int set @options=2 --设置默认滚动文件的数目 declare @filecount int set @filecount=5 exec @rc=sp_trace_Create @TraceID output, @options, @TraceFilePath, @maxfilesize, @EndTime, @filecount if(@rc=0) select @TraceID
我们通过上面的跟踪创建的过程,可以在系统自带的默认的sys.traces中找到该跟踪的明细
select * from sys.traces where id=2

通过上面的脚本,我们已经创建了一个新的跟踪(trace),但是这个跟踪状态为0,也就是说还没有运行,下面我们的步骤就是要为这个跟踪添加事件(event)
这个也是利用SQL Server为我们提供的操作函数
sp_trace_setevent [ @traceid = ] trace_id  
          , [ @eventid = ] event_id 
          , [ @columnid = ] column_id 
          , [ @on = ] on
@traceid 要修改的跟踪的 ID号
@eventid 要打开的事件的 ID
@columnid 要为该事件添加的列的 ID
@on 表示事件状态
其中最主要的就是时间ID,这个是SQL Server为我们提供的一些列的码表时间值,具体值可以参考联机丛书 sp_trace_setevent (Transact-SQL)
这里面最常用的就是:
| 
 事件号  | 
 事件名称  | 
 说明  | 
|---|---|---|
| 
 10  | 
 RPC:Completed  | 
 在完成了远程过程调用 (RPC) 时发生。  | 
| 
 11  | 
 RPC:Starting  | 
 在启动了 RPC 时发生。  | 
| 
 12  | 
 SQL:BatchCompleted  | 
 在完成了 Transact-SQL 批处理时发生。  | 
| 
 13  | 
 SQL:BatchStarting  | 
 在启动了 Transact-SQL 批处理时发生。  | 
| 
 14  | 
 Audit Login  | 
 在用户成功登录到 SQL Server 时发生。  | 
| 
 15  | 
 Audit Logout  | 
 在用户从 SQL Server 注销时发生。  | 
| 
 16  | 
 Attention  | 
 在发生需要关注的事件(如客户端中断请求或客户端连接中断)时发生。  | 
| 
 17  | 
 ExistingConnection  | 
 检测在启动跟踪前连接到 SQL Server 的用户的所有活动。  | 
| 
 18  | 
 Audit Server Starts and Stops  | 
 在修改 SQL Server 服务状态时发生。  | 
| 
 20  | 
 Audit Login Failed  | 
 指示试图从客户端登录到 SQL Server 失败。  | 
| 
 21  | 
 EventLog  | 
 指示已将事件记录到 Windows 应用程序日志中。  | 
| 
 22  | 
 ErrorLog  | 
 指示已将错误事件记录到 SQL Server 错误日志中。  | 
| 
 23  | 
 Lock:Released  | 
 指示已释放某个资源(如页)的锁。  | 
| 
 24  | 
 Lock:Acquired  | 
 指示获取了某个资源(如数据页)的锁。  | 
| 
 25  | 
 Lock:Deadlock  | 
 指示两个并发事务由于试图获得对方事务拥有的资源的不兼容锁而发生了相互死锁。  | 
| 
 26  | 
 Lock:Cancel  | 
 指示已取消获取资源锁(例如,由于死锁)。  | 
| 
 27  | 
 Lock:Timeout  | 
 指示由于其他事务持有所需资源的阻塞锁而使对资源(例如页)锁的请求超时。 超时由 @@LOCK_TIMEOUT 函数确定,并可用 SET LOCK_TIMEOUT 语句设置。  | 
| 
 28  | 
 Degree of Parallelism Event(7.0 插入)  | 
 在执行 SELECT、INSERT 或 UPDATE 语句之前发生。  | 
| 
 33  | 
 Exception  | 
 指示 SQL Server 中出现了异常。  | 
| 
 34  | 
 SP:CacheMiss  | 
 指示未在过程缓存中找到某个存储过程。  | 
| 
 35  | 
 SP:CacheInsert  | 
 指示某个项被插入到过程缓存中。  | 
| 
 36  | 
 SP:CacheRemove  | 
 指示从过程缓存中删除了某个项。  | 
| 
 37  | 
 SP:Recompile  | 
 指示已重新编译存储过程。  | 
| 
 38  | 
 SP:CacheHit  | 
 指示在过程缓存中找到了存储过程。  | 
| 
 40  | 
 SQL:StmtStarting  | 
 在启动了 Transact-SQL 语句时发生。  | 
| 
 41  | 
 SQL:StmtCompleted  | 
 在完成了 Transact-SQL 语句时发生。  | 
| 
 42  | 
 SP:Starting  | 
 指示启动了存储过程。  | 
| 
 43  | 
 SP:Completed  | 
 指示完成了存储过程。  | 
| 
 44  | 
 SP:StmtStarting  | 
 指示已开始执行存储过程中的 Transact-SQL 语句。  | 
| 
 45  | 
 SP:StmtCompleted  | 
 指示存储过程中的 Transact-SQL 语句已执行完毕。  | 
| 
 46  | 
 Object:Created  | 
 指示 CREATE INDEX、CREATE TABLE 和 CREATE DATABASE 这样的语句已创建了一个对象。  | 
| 
 47  | 
 Object:Deleted  | 
 指示已在 DROP INDEX 和 DROP TABLE 这样的语句中删除了对象。  | 
| 
 50  | 
 SQL Transaction  | 
 跟踪 Transact-SQL BEGIN、COMMIT、SAVE 和 ROLLBACK TRANSACTION 语句。  | 
| 
 51  | 
 Scan:Started  | 
 指示启动了表或索引扫描  | 
| 
 52  | 
 Scan:Stopped  | 
 指示停止了表或索引扫描。  | 
| 
 53  | 
 CursorOpen  | 
 指示 ODBC、OLE DB 或 DB-Library 在 Transact-SQL 语句中打开了一个游标。  | 
| 
 54  | 
 TransactionLog  | 
 将事务写入事务日志时进行跟踪。  | 
| 
 55  | 
 Hash Warning  | 
 指示未在缓冲分区进行的某一哈希操作(例如,哈希联接、哈希聚合、哈希 union 运算、哈希非重复)已恢复为替换计划。 发生此事件的原因可能是递归深度、数据扭曲、跟踪标记或位计数。  | 
| 
 58  | 
 Auto Stats  | 
 指示发生了自动更新索引统计信息。  | 
| 
 59  | 
 Lock:Deadlock Chain  | 
 为导致死锁的每个事件而生成。  | 
| 
 60  | 
 Lock:Escalation  | 
 指示较细粒度的锁转换成了较粗粒度的锁(例如,页锁升级或转换为 TABLE 或 HoBT 锁)。  | 
| 
 61  | 
 OLE DB Errors  | 
 指示发生了 OLE DB 错误。  | 
| 
 67  | 
 Execution Warnings  | 
 指示在执行 SQL Server 语句或存储过程期间发生的任何警告。  | 
| 
 68  | 
 Showplan Text (Unencoded)  | 
 显示所执行 Transact-SQL 语句的计划树。  | 
| 
 69  | 
 Sort Warnings  | 
 指示不适合内存的排序操作。 不包括与创建索引有关的排序操作;只包括某查询内的排序操作(如 SELECT 语句中使用的 ORDER BY 子句)。  | 
| 
 70  | 
 CursorPrepare  | 
 指示已准备了 ODBC、OLE DB 或 DB-Library 用于 Transact-SQL 语句的游标。  | 
| 
 71  | 
 Prepare SQL  | 
 ODBC、OLE DB 或 DB-Library 已准备好了一个或多个要使用的 Transact-SQL 语句。  | 
| 
 72  | 
 Exec Prepared SQL  | 
 ODBC、OLE DB 或 DB-Library 已执行了一个或多个准备好的 Transact-SQL 语句。  | 
| 
 73  | 
 Unprepare SQL  | 
 ODBC、OLE DB 或 DB-Library 已撤消(删除)了一个或多个准备好的 Transact-SQL 语句。  | 
| 
 74  | 
 CursorExecute  | 
 执行了先前由 ODBC、OLE DB 或 DB-Library 为 Transact-SQL 语句准备的游标。  | 
| 
 75  | 
 CursorRecompile  | 
 由 ODBC 或 DB-Library 为 Transact-SQL 语句打开的游标已直接重新编译或由于架构更改而重新编译。 为 ANSI 和非 ANSI 游标触发。  | 
| 
 76  | 
 CursorImplicitConversion  | 
 SQL Server 将 Transact-SQL 语句的游标从一种类型转换为另一种类型。 为 ANSI 和非 ANSI 游标触发。  | 
| 
 77  | 
 CursorUnprepare  | 
 ODBC、OLE DB 或 DB-Library 撤消(删除)了准备好的 Transact-SQL 语句的游标。  | 
| 
 78  | 
 CursorClose  | 
 关闭了先前由 ODBC、OLE DB 或 DB-Library 为 Transact-SQL 语句打开的游标。  | 
| 
 79  | 
 Missing Column Statistics  | 
 可能曾经对优化器有用的列统计信息不可用。  | 
| 
 80  | 
 Missing Join Predicate  | 
 正在执行没有联接谓词的查询。 这可能导致长时间运行查询。  | 
| 
 81  | 
 Server Memory Change  | 
 SQL Server 内存的使用量已增加或减少了 1 MB 或最大服务器内存的 5%(两者中较大者)。  | 
| 
 82-91  | 
 User Configurable (0-9)  | 
 用户定义的事件数据。  | 
| 
 92  | 
 Data File Auto Grow  | 
 指示服务器已自动扩展了数据文件。  | 
| 
 93  | 
 Log File Auto Grow  | 
 指示服务器已自动扩展了日志文件。  | 
| 
 94  | 
 Data File Auto Shrink  | 
 指示服务器已自动收缩了数据文件。  | 
| 
 95  | 
 Log File Auto Shrink  | 
 指示服务器已自动收缩了日志文件。  | 
| 
 96  | 
 Showplan Text  | 
 显示来自查询优化器的 SQL 语句的查询计划树。 请注意,TextData 列不包含此事件的显示计划。  | 
| 
 97  | 
 Showplan All  | 
 显示查询计划,并显示已执行的 SQL 语句的完整编译时详细信息。 请注意,TextData 列不包含此事件的显示计划。  | 
| 
 98  | 
 Showplan Statistics Profile  | 
 显示查询计划,并显示已执行的 SQL 语句的完整运行时详细信息。 请注意,TextData 列不包含此事件的显示计划。  | 
| 
 100  | 
 RPC Output Parameter  | 
 生成每个 RPC 的参数的输出值。  | 
| 
 108  | 
 Audit Add Login to Server Role Event  | 
 在从固定服务器角色添加或删除登录时发生;针对 sp_addsrvrolemember 和 sp_dropsrvrolemember。  | 
| 
 112  | 
 Audit App Role Change Password Event  | 
 在更改应用程序角色的密码时发生。  | 
| 
 113  | 
 Audit Statement Permission Event  | 
 在使用语句权限(如 CREATE TABLE)时发生。  | 
| 
 114  | 
 Audit Schema Object Access Event  | 
 在成功或未成功使用了对象权限(如 SELECT)时发生。  | 
| 
 115  | 
 Audit Backup/Restore Event  | 
 在发出 BACKUP 或 RESTORE 命令时发生。  | 
| 
 116  | 
 Audit DBCC Event  | 
 在发出 DBCC 命令时发生。  | 
| 
 117  | 
 Audit Change Audit Event  | 
 在修改审核跟踪时发生。  | 
| 
 118  | 
 Audit Object Derived Permission Event  | 
 在发出 CREATE、ALTER 和 DROP 对象命令时发生。  | 
| 
 119  | 
 OLEDB Call Event  | 
 为分布式查询和远程存储过程调用 OLE DB 访问接口时发生。  | 
| 
 120  | 
 OLEDB QueryInterface Event  | 
 为分布式查询和远程存储过程调用 OLE DB QueryInterface 时发生。  | 
| 
 121  | 
 OLEDB DataRead Event  | 
 对 OLE DB 访问接口调用数据请求时发生。  | 
| 
 122  | 
 Showplan XML  | 
 在执行 SQL 语句时发生。 包括该事件可以标识 Showplan 运算符。 每个事件都存储在格式正确的 XML 文档中。 请注意,此事件的Binary 列包含已编码的显示计划。 使用 SQL Server Profiler 可打开跟踪并查看显示计划。  | 
| 
 123  | 
 SQL:FullTextQuery  | 
 执行全文查询时发生。  | 
| 
 124  | 
 Broker:Conversation  | 
 报告 Service Broker 会话的进度。  | 
| 
 125  | 
 Deprecation Announcement  | 
 使用将从 SQL Server 的未来版本中删除的功能时发生。  | 
| 
 126  | 
 Deprecation Final Support  | 
 使用将从 SQL Server 的下一个主版本中删除的功能时发生。  | 
| 
 127  | 
 Exchange Spill Event  | 
 在 tempdb 数据库临时写入并行查询计划中的通信缓冲区时发生。  | 
| 
 128  | 
 Audit Database Management Event  | 
 创建、更改或删除数据库时发生。  | 
| 
 129  | 
 Audit Database Object Management Event  | 
 对数据库对象(如架构)执行 CREATE、ALTER 或 DROP 语句时发生。  | 
| 
 130  | 
 Audit Database Principal Management Event  | 
 创建、更改或删除数据库的主体(如用户)时发生。  | 
| 
 131  | 
 Audit Schema Object Management Event  | 
 创建、更改或删除服务器对象时发生。  | 
| 
 132  | 
 Audit Server Principal Impersonation Event  | 
 服务器范围中发生模拟(如 EXECUTE AS LOGIN)时发生。  | 
| 
 133  | 
 Audit Database Principal Impersonation Event  | 
 数据库范围中发生模拟(如 EXECUTE AS USER 或 SETUSER)时发生。  | 
| 
 134  | 
 Audit Server Object Take Ownership Event  | 
 服务器范围中的对象的所有者发生更改时发生。  | 
| 
 135  | 
 Audit Database Object Take Ownership Event  | 
 数据库范围中的对象的所有者发生更改时发生。  | 
| 
 136  | 
 Broker:Conversation Group  | 
 Service Broker 创建新的会话组或删除现有会话组时发生。  | 
| 
 137  | 
 Blocked Process                     
                  
	 	
                      |