SQLServer DBA 三十问(第11~20题) (一)

2014-11-24 09:55:30 · 作者: · 浏览: 0

11. 死锁如何跟踪;阻塞如何跟踪和查找;发现有问题的语句后,如何进行处理;用Profile做跟踪时,一般我们需要跟踪哪些事件;

答:dbcc traceon(1204) 可以开打跟踪死锁的标记,sqlserver2005新增了1222跟踪标志,就是格式更详细,死锁的信息会记录在errlog文件里,

顺便说下errlog一共有errlog,errlog1~errlog6共7个文件,关于这些可以看看books online,如果觉得books online太乏味,

可以看看徐海蔚的《Microsoft SQLServer企业级平台管理实践》;

相对来说,阻塞的问题比死锁要严重,死锁只是牺牲部分进程,阻塞的话会导致整个系统瘫痪,阻塞的定位我有一篇专门的博客介绍:

sqlserver阻塞定位

要跟踪死锁的话,当然是选择“锁”事件,不过我一般用profiler都是做性能调优的,选 常规——》模板名——》SQLProfileTuning 就ok了,

死锁很少跟踪,因为我们的sqlserver降低了事务隔离级别,基本不会产生死锁,有的话也在可接受的范围内,都是凌晨运行作业时产生的,也不会太多。

12. Windows日志主要有哪几种,SQLServer日志一般保留几个,什么情况下会产生新的SQL日志;数据库日志恢复模式有哪几种,

区别是什么;数据库日志突然变得很大,而且你无法收缩,可能的原因是什么,怎么查找原因,分别将如何处理;

答:windows的日志可以自己看iis就明白了,我一般只看应用程序,一次发现asp.net抛出的错误和异常,解决之;sqlserver的日志一般保留7个,errlog,errlog1~errlog6,每次数据库重启都会产生新的日志,新的日志命名为errlog,旧的日志也会跟着改名,

之前老的errlog改为errlog1,老的errlog1 改成 errlog2,直到 errlog5 改成 errlog6, 之前的errlog6会被删除,

所以如果数据库出错千万不要盲目充能更新启动,可以先看看错误日志,多次重启之后可能就丢失了最原始的错误信息;

应该是数据库恢复模式吧,简单,大容量,完全;用哪个要视情况而定,不重要的业务可以用简单,重要业务就要用完整;

完整模式支持最完善的备份和还原方案,可以还原到某个时间点,简单模式只能还原到该备份里面的数据,无法还原到时间点,

大容量模式一般只在需要进行批量数据导入的时候才使用;

日志突然很大而且无法收缩,其实有很多种可能,不过不管是哪一种可能,都离不开一个现象,

有一个更新(insert,update)动作工作正在执行,而且短时间内不会停止,既然短时间内不会停止,

那么我们就应该想到master.dbo.sysprocesses这个表,可以通过 select spid from master.dbo.sysprocesses where open_tran > 0

查看当前运行时间比较长的进程,看看到底有什么动作,我们还可以通过 dbcc inputbuffer(@spid) 找到语句;

13. 分区表和分区视图是什么概念,一般是在什么情况下使用,有啥好处;

答:先说分区视图,这个在sql2000就已经支持,他其实还是一个视图;

分区表是sql2005新提供的功能,逻辑上他就是一个表,物理上它可以把数据保存在多个磁盘,以此提高io,提高并发量;

2005下应该都是用分区表了,数据量庞大的时候可以按分区函数把数据分开,对于查询性能有很大的提升,不过我无论如何都认为太大的表不好,

2000下我一般都是分表的,比如历史表,或者按自己业务需求制定分表方案。

14. 如何比较两个同结构的表数据的差异;如果表损坏了,如何修复;如何在备份文件有问题的情况下尽量还原数据;如何将一个表

的Identity属性归零;

答:要比较两个表所有字段的值,光通过sqlserver可能实现不了,可能需要借助第3方工具,但如果数据量很大,什么工具都很难完美实现,

提出这个问题,应该是想找到部分丢失的数据,如果是这样,我一般是通过找到出问题的那段时间开始,把那之后的数据比较一下,

然后通过join 把数据update成想要的;

如果表坏了,有个dbcc checktable的命令,不过我至今没遇到过;

一般备份文件有问题,但是可以还原成功,不过会报些错误,可能导致数据库不稳定,可以尝试dbcc checkdb命令,

之后再新建一个库,把数据导入新库中;

identity属性的问题,delete并不会归零,因为在结构中还保存了最大值,truncate table就可以

15. CheckPoint和LazyWriter区别;DDL Trigger 和 DML Trigger有啥用,区别是啥;

答:在sqlserver2000只有checkpoint,lazywriter 是 sql2005以后加入的,可以简单认为他们是sqlserver系统内部的进程;

checkpoint 需要达到一定条件才会触发,触发之后会强制把脏页写入磁盘;

lazywriter 是每隔一段时间启动一次,然后检查free list,看看是否低于某个阀值,如果低于这个阀值,他就干活,

把脏页数据放入free list,同时写入磁盘;

可以打一个形象的比喻:lazywriter是个懒汉,他每隔一会儿就睡(定时启动),睡醒了就看看自己的钱包(free list),

如果他认为钱包的钱少了,他就拿钱(脏页放入free list)干活(脏页写入磁盘),checkpoint是一个很卖力的伙计,

只有有事情通知他一声,他立马一声不吭的把把活干完(脏页写入磁盘),不会在乎自己的钱包(free list);

DDL Trigger是针对结构的触发器,比如新建表,修改表,删除表;

DML Trgger是针对数据的触发器,比如insert,delete,update表数据;

16. Mirroring 和Logshipping 的区别和使用场景;SQLServer的Mirroring与Oracle的哪像技术比较接近,它们的区别是啥;

答:Mirroring,即数据库镜像,一般用作高可用性的故障转移集群,需要 主服务器,镜像服务器,见证服务器3台,

当见证服务器检测到主服务器出现故障时,会自动把数据库连接指向镜像服。实现的基本流程如下,用户访问主库,

并提交数据,主库会把日志传送到镜像服务器,做镜像的时候也有些麻烦,必须首先保证主库和镜像库数据一致才能建立镜像关系,

所以如果你的主库时刻在产生数据,那镜像做起来估计就费神了;其实我还有个疑问,要是见证服务器挂了怎么办,ms貌似没给出方案;

LogShipping,即日志传送,也有主库-辅助库,没有见证库了,他定时把事务日志传送到辅助库,

其实就是不断做back log 和 restore 的操作,他有个缺陷,辅助库每次restore都需要断开所有连接,

所以辅助库并不适合让用户访问,这个方案都是可以作为容灾备份的一个方案,当主库出现故障的时候,马上手工切换到辅助库即可恢复。

相比之下我觉得logshipping更合适一些,做的时候没有那么多条件限制;

对Oracle不了解,所以无法比较;

17. Mirroring的搭建步