分类: 数据库开发技术
2009-04-01 20:41:10
引言
本文内容来源于一篇白皮书,但在原文的基础上增加了部分内容,为了表示对原文作者
的尊重,并未标示为原创,特此申明。目的只是希望能与各位网友一起分享好文章,如有撰写不好的地方,请多多原谅,也感谢各位的支持!
tempdb介绍
在SQL Server2005里,tempdb系统数据库经历了许多的改变,包括一些新的用法以及内部的优化,但从SQL Server 2000到SQL Server 2005,其架构大部分是没有改变的。
tempdb系统数据库与用户数据库是非常相似的。主要的区别在于:SQL Server关闭以后,存储在tempdb里的数据将会被自动清除掉。(曾经遇到这样一个网友,在过大年前把一些业务测试数据以及相关数据库对象存储在tempdb里,在过年期间,由于服务器应用程序等某种原因造成磁盘空间填满,SQL Server服务异常关闭,磁盘问题解决以后,重启SQL Server,由于没有备份,存储在tempdb里的所有数据都丢失,我们应该避免这样的问题。)
每次SQL Server重启时,tempdb数据库会从model系统数据库那复制一份,并继承某些model数据库的属性,比如“ALLOW_SNAPSHOT_ISOLATION”属性,当然有些属性并不能
继承,比如“恢复模式”属性,无论model数据库是什么恢复模式,tempdb只能是“简单恢复模式”,这是以便始终自动回收 tempdb 日志空间 ,且我们尝试修改其恢复模式时,也会抛出错误如下,提示你不能修改。
Msg 5058, Level 16, State 1, Line 1
Option 'RECOVERY' cannot be set in database 'tempdb'.
在tempdb中,不能创建和使用新的文件组:
ALTER DATABASE tempdb
ADD filegroup tempdev2
GO
Msg 1826, Level 16, State 4, Line 1
User-defined filegroups are not allowed on "tempdb".
也就意味着,tempdb只能使用默认的PRIMARY文件组,但可以为tempdb创建多个数据
文件和日志文件。数据文件的默认大小是8M,当SQL Server重新启动以后,tempdb又会
恢复到这个默认的配置值,而“自动增长“值只是临时性的,当SQL Server重新启动以后,又会重新恢复(最后这个关于自动增长值的说法,原文是这样:
Auto grow is temporary for tempdb (unlike other types of databases). It is reset when SQL Server restarts.)但经过我测试,并不是这样,重新启动以后,并不会重新恢复。
用户可以在tempdb数据库创建和使用表,也可以使用事务和回滚事务。但是,不能在tempdb数据库中重做日志文件,这是因为一旦SQL Server重新启动,所有内容将不覆存在。因为事务日志并不会被闪回,所以在tempdb数据库中提交事务要比在用户数据库中快。在用户数据库中,事务具有ACID属性,但是在tempdb的事务中,并不具有。
SQL Server使用tempdb存储一些内部对象,比如查询的中间结果集。大部分的这些内部操作不会生成日志纪录,因为它们不需要回滚,所以这些操作是非常快的。
当然,在tempdb上也存在一些限制。另外的,一些数据库属性的操作不能使用在tempdb上,比如上面提到的修改恢复模型,更具体的内容,请参考联机帮助相关部分:
不允许在tempdb上进行自动收缩。其数据库文件和日志文件收缩能力有限,这是因为存储在tempdb里的许多隐藏对象不能通过收缩操作除去。
下面同样是一些tempdb的限制操作:
.不能开启数据库的”CHECKSUM”属性。
.不能创建数据库快照。
.不支持DBCC CHECKALLOC和DBCC CHECKCATALOG操作。
.最好是离线完成DBCC CHECKTABLE检查操作。这句话的意思是:它需要一个TAB-S锁。
当tempdb在使用时,会发生内部的一致性检查操作。如果检查失败,用户连接将会中断,使用了的空间会被中断的连接释放。