zoukankan      html  css  js  c++  java
  • 如何跟踪检查数据库中对象的改动

         一些时候,我们发现数据库中的一些对象(object)发生了改动,如表结构发生了改动(有Create/Alter/Delete操作)引发了应用程序出错,这时候Boss就会发问,为什么会发生这样错误,原因何在,到底是谁的责任。作为一名SQL Server数据库DBA,针对这个,我们要尽快查明结构被改动的对象,改动时间,操作人或PC等。

          在SQL Server 2005 中,通过读取默认跟踪日志文件,查询出最近哪些结构被改动,为我们找出问题的根源。接下来,就介绍如何通过读取默认跟踪日志文件。

    default trace enabled 选项


           在SQL Server中,使用”default trace enabled” 选项,来启用或禁用默认跟踪日志文件。在系统默认情况下,”default trace enabled” 选项值为1,也就是默认启用。我们在Microsoft SQL Server Management Studio(MSSMS)查询中,可以通过下面Select语句查询其状态:

     
    Select * From sys.configurations Where configuration_id = 1568

    image
    要是我们想设置“default trace enabled”选项,必须先要启用“show advanced options”选项。
    use master
    Go
    sp_configure 'show advanced options', 1
    Go
    Reconfigure
    Go
    sp_configure 'default trace enabled', 1
    Go
    Reconfigure
    Go
     

    fn_trace_gettable系统函数


          确认启用默认跟踪日志文件后,我们就要如何读取默认跟踪日志文件。SQL Server为我们提供了系统函数fn_trace_gettable,来读取根据这日志文件。
     
    use master
    Go
    Declare @Filename nvarchar(256),
    @Index int
    Set @Filename=(Select path From sys.traces Where is_default=1)
    Set @Index=Patindex('%\%',Reverse(@Filename))
    Set @Filename=Substring(@Filename,1,len(@Filename)-@Index)+'\Log.trc'

    Select HostName,
    ApplicationName,
    LoginName,
    StartTime,
    ServerName,
    ObjectName,
    ObjectType,
    DatabaseName,
    Case EventClass
    When 46 Then N'Create'
    When 47 Then N'Drop'
    When 164 Then N'Alter'
    End As ddl_operation
    From fn_trace_gettable(@Filename,0)
    where EventClass in (46,47,164)
    And EventSubclass = 0
    And DatabaseID <> 2
    And objecttype Not In (21587)
    Go

    上面的T-SQL语句,查询了对象的结构有改动的历史记录,根据实际的环境,可加更多的过滤条件来筛选返回的行,以满足我们的需要。
    image
    这里对T-SQL语句的条件中,用到的一些列做个简单的说明:

    列名

    说明

    EventClass

    46: Create Object

    47: Drop Object

    164: Alter Object

    DatabaseID 2: 临时数据库tempDB
    objecttype 21587:统计信息的对象类型,格式如,”_WA_Sys_Contact_186270A4”
    EventSubclass

    0:Begin

    1:Commit

     
    要了解系统函数fn_trace_gettable(),返回记录集合中有关其他列的更多说明,可以参考系统存储过程sp_trace_setevent。以下列出与这里相关的,有关Trace的几个系统的目录视图:
    Select * From sys.traces

    image

    用于查询当前的跟踪(Trace),其中列is_default描述为是否默认跟踪。在前面的T-SQL代码中有应用到。

    Select * From sys.trace_categories

    image

    用于查询跟踪中,事件的类别。另外还有3个目录视图:

    Select * From sys.trace_columns
    Select * From sys.trace_event_bindings
    Select * From sys.trace_subclass_values

    image

    分別描述跟踪的事件列、事件与跟踪咧的关系,和具体的跟踪项。

    .

    其他跟踪方法


    跟踪数据库中对象的结构改动,在SQL Server中另外有两种方法可以实现。

    第一种,在MSSMS界面中,通过SQL Server 提供的标准报表查阅结构的变化情况.

    image

    image

    第二种,还可以通过SQL Server提供的DDL(Data Definition Language)触发器功能。注意,使用DDL触发器,需要在结构发生改动前,就开始创建DDL触发器,并把DDL触发的內容写入到DBA管理专用的数据库对应表中,方便日后查询使用。这方法真实现起来是有点繁琐,如要跟踪表结构的改动情况,需要在数据库实例的每一个数据库层层创建针对表结构改动的DDL触发器。

     (备注: 在不同版本的SQL Server中,以上查询语句,返回的列,或使用方法可能存在差异,当碰到具体的问题可以查阅联机帮助文档)

    小結


          以上提供了三种方法,來跟踪数据库中对象(Object)的结构改动情况。当然还可以通过第三方检查日志文件的工具,在当前文章中,这方面不作描述。无论使用哪一种方法,我们都是要把问题原因找出來,并去解决它。作为一名SQL Server DBA,不管是新手,还是专家级。SQL Server提供的一些系统函数或存储过程,及其功能,我们都要认真的去了解并多次测试,这样才能在真实的工作中,灵活的运用,快速的发现问题根源,并快速的解决问题。

  • 相关阅读:
    ZH奶酪:PHP 使用DOMDocument抓取网页
    PHP Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity,
    ZH奶酪:PHP 执行时间Fatal error: Maximum execution time of...
    ZH奶酪:PHP (爬虫)下载图片
    ZH奶酪:PHP的cURL库
    PHP 字符串编码的转换
    PHP http_build_query()方法
    ZH奶酪:使用PHP调用REST API
    PHP全局变量
    HTML页面跳转的5种方式
  • 原文地址:https://www.cnblogs.com/wghao/p/2185704.html
Copyright © 2011-2022 走看看