设为首页 收藏本站
查看: 765|回复: 0

[经验分享] SQL Server 2005

[复制链接]

尚未签到

发表于 2015-6-28 15:05:42 | 显示全部楼层 |阅读模式
  在我们的工作中可能会遇到这样一种情形。由于数据库中某些对象被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
  
  使用如下的代码来打开跟踪文件,获取创建数据库的信息。这里使用了一些限制性的条件来缩小结果集。
  注意:你的跟踪文件路径和名称可能和我的不同。要使用你自己的跟踪路径。
  


DSC0000.gif DSC0001.gif 代码



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表示日志文件自动增长事件
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81209-1-1.html 上篇帖子: SQL Server 经验 (转载) 下篇帖子: 【译】SQL Server索引进阶第十篇:索引的内部结构
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表