zoukankan      html  css  js  c++  java
  • SQL Server 2005 Default Trace (默认跟踪)

    在我们的工作中可能会遇到这样一种情形。由于数据库中某些对象被altered/created/deleted,造成我们的应用程序crash。

    当我们把问题解决之后,老板可能会问发生了什么?为什么会这样?是谁干的?

    在SQL Server 2005中提供了DDL trigger,它能回答所用这些问题,但我们没有在事前实现这一工作。

    在这种情况下,有些人可能会对老板说:“我不知道,但我能去查。”之后就疯狂地寻找第三方的工具来读transaction log(事物日志)。他们可能不知道SQL Server 2005有一个内置的功能能回到所用这些问题。

    答案藏在一个运行在后台的跟踪(Default Trace)中,我们可以利用Default Trace来寻找排除故障。Default Trace默认会自动运行,因为其非常轻量级,所以不会给系统造成很多负担。对我来说,Default Trace所带来的益处远大于它给数据库带来的负担。Default Trace不能代替DDL trigger的功能,它应被用作SQL实例的监视器,或用来快速获得SQL问题事件的详细信息。

    Default Trace不会跟踪所有的事件,它扑捉一些关键性信息,包括auditing events,database events,error events,full text events,object creation,object deletion,object alteration。在本文中我们会关注对象级(event level)的事件,这能回答老板的“是谁干的”这一问题。

    下面的代码能查询Default Trace是否已经被开启了

    1 select * from sys.configurations where configuration_id = 1568

    如果Default Trace功能没有打开,我们先要打开这个Trace。可以是使用如下代码,注意运行这些代码需要相应的权限。

    1 sp_configure 'show advanced options', 1;
    2  go
    3  reconfigure;
    4  go
    5 sp_configure 'default trace enabled', 1;
    6  go
    7  reconfigure;
    8  go

    下一段代码是来获取当前跟踪文件的路径。在相应的文件夹下可能会有多个以log_开头的trace文件,我们可以把这些文件载入一个表中,进行分析,但载入多个文件会增加开销。最好只是载入需要分析的信息。

    select * from ::fn_trace_getinfo(0)

    现在让我们看一看跟踪下来的数据。我们先从创建一个新数据库开始。

    use master
    go
    create database TraceDB

    使用如下的代码来打开跟踪文件,获取创建数据库的信息。这里使用了一些限制性的条件来缩小结果集。

    注意:你的跟踪文件路径和名称可能和我的不同。要使用你自己的跟踪路径。

    代码
    select
    loginname,
    loginsid,
    spid,
    hostname,
    applicationname,
    servername,
    databasename,
    objectname,
    e.category_id,
    cat.name
    as [CategoryName],
    textdata,
    starttime,
    eventclass,
    eventsubclass,
    --0表示begin,1表示commit
    e.name as EventName
    from ::fn_trace_gettable('C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\log.trc',0)
    inner join sys.trace_events e
    on eventclass = trace_event_id
    inner join sys.trace_categories as cat
    on e.category_id = cat.category_id
    where databasename = 'TraceDB' and
    objectname
    is null and --根据objectname来过滤
    e.category_id = 5 and --category 5表示对象
    e.trace_event_id = 46 --trace_event_id: 46表示Create对象,47表示Drop对象,164表示修改对象

    你能看到超过一条的结果,这是因为捕捉到了2事件子类,begin和commit。

    现在创建另一个对象并再次进行查询。这次我们创建一张表“MyTable”。

    use TraceDB
    go
    create table dbo.MyTable(
    id
    int identity(1,1) not null,
    sometext
    char(3) null
    )
    on primary

    现在使用类似的脚本来查询Default Trace,对where条件部分进行修改。

    where databasename = 'TraceDB' and
    objectname
    = 'MyTable' and
    e.category_id
    = 5 and
    e.trace_event_id
    = 46

    我们同样可以修改对象,代码如下:

    use TraceDB
    go
    alter table MyTable
    add col int

    使用如下的条件来过滤查询,特别注意修改trace_event_id为164,因为164代表对象修改事件

    where databasename = 'TraceDB' and
    objectname
    = 'MyTable' and
    e.category_id
    = 5 and
    e.trace_event_id
    = 164

    最后我们可以把"MyTable"Drop掉。

    use TraceDB
    go
    drop table MyTable

    使用如下的条件来过滤查询,注意修改trace_event_id为47,因为47代表对象删除事件

    where databasename = 'TraceDB' and
    objectname
    = 'MyTable' and
    e.category_id
    = 5 and
    e.trace_event_id
    = 47

    Default Trace还能跟踪到其他一些事件。例如你的日志文件快速增长,这时需要知道其原因。Default Trace会捕获日志增长事件,这对于排查问题很有价值。下面的查询会获得Default Trace中所有的log auto growth事件。

    代码
    select
    loginname,
    loginsid,
    spid,
    hostname,
    applicationname,
    servername,
    databasename,
    objectname,
    e.category_id,
    cat.name,
    textdata,
    starttime,
    endtime,
    duration,
    eventclass,
    eventsubclass,
    e.name
    as EventName
    from ::fn_trace_gettable('C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\log.trc',0)
    inner join sys.trace_events e
    on eventclass = trace_event_id
    inner join sys.trace_categories as cat
    on e.category_id = cat.category_id
    where databasename = 'TraceDB' and
    e.category_id
    = 2 and --categroy 2表示database
    e.trace_event_id = 93 --93表示日志文件自动增长事件
  • 相关阅读:
    LeetCode题解之Flipping an Image
    LeetCode 之Find Minimum in Rotated Sorted Array
    LeetCode题解Transpose Matrix
    LeetCode 题解之Minimum Index Sum of Two Lists
    LeetCode题解之Intersection of Two Linked Lists
    LeetCode 题解之Add Two Numbers II
    LeetCode题解之Add two numbers
    href="#"与href="javascript:void(0)"的区别
    有关ie9 以下不支持placeholder属性以及获得焦点placeholder的移除
    ie7下属性书写不规范造成的easyui 弹窗布局紊乱
  • 原文地址:https://www.cnblogs.com/DBFocus/p/1739535.html
Copyright © 2011-2022 走看看