如何跟踪检查数据库中对象的改动
在一些时候,我们发现数据库中的一些对象(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语句查询其状态:
use master
Go
sp_configure 'show advanced options', 1
Go
Reconfigure
Go
sp_configure 'default trace enabled', 1
Go
Reconfigure
Go
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语句,查询了对象的结构有改动的历史记录,根据实际的环境,可加更多的过滤条件来筛选返回的行,以满足我们的需要。
列名 |
说明 |
EventClass |
46: Create Object 47: Drop Object 164: Alter Object |
DatabaseID | 2: 临时数据库tempDB |
objecttype | 21587:统计信息的对象类型,格式如,”_WA_Sys_Contact_186270A4” |
EventSubclass |
0:Begin 1:Commit |
Select * From sys.traces
用于查询当前的跟踪(Trace),其中列is_default描述为是否默认跟踪。在前面的T-SQL代码中有应用到。
Select * From sys.trace_categories
用于查询跟踪中,事件的类别。另外还有3个目录视图:
Select * From sys.trace_columns
Select * From sys.trace_event_bindings
Select * From sys.trace_subclass_values
分別描述跟踪的事件列、事件与跟踪咧的关系,和具体的跟踪项。
.
其他跟踪方法
跟踪数据库中对象的结构改动,在SQL Server中另外有两种方法可以实现。
第一种,在MSSMS界面中,通过SQL Server 提供的标准报表查阅结构的变化情况.
第二种,还可以通过SQL Server提供的DDL(Data Definition Language)触发器功能。注意,使用DDL触发器,需要在结构发生改动前,就开始创建DDL触发器,并把DDL触发的內容写入到DBA管理专用的数据库对应表中,方便日后查询使用。这方法真实现起来是有点繁琐,如要跟踪表结构的改动情况,需要在数据库实例的每一个数据库层层创建针对表结构改动的DDL触发器。
(备注: 在不同版本的SQL Server中,以上查询语句,返回的列,或使用方法可能存在差异,当碰到具体的问题可以查阅联机帮助文档)
小結
以上提供了三种方法,來跟踪数据库中对象(Object)的结构改动情况。当然还可以通过第三方检查日志文件的工具,在当前文章中,这方面不作描述。无论使用哪一种方法,我们都是要把问题原因找出來,并去解决它。作为一名SQL Server DBA,不管是新手,还是专家级。SQL Server提供的一些系统函数或存储过程,及其功能,我们都要认真的去了解并多次测试,这样才能在真实的工作中,灵活的运用,快速的发现问题根源,并快速的解决问题。