注意:如果您使用的是 SQL Server 2005,这些方法仍适用。不过,您应该使用 SQL Server Management Studio 而不是企业管理器和查询分析器来执行这些操作。
Tempdb 信息
tempdb 是一个临时工作区。除其他用途外,SQL Server 还将 tempdb 用于:
·
显式创建的临时表的存储。
·
保存在查询处理和排序过程中创建的中间结果的工作表。
·
具体化的静态光标。
SQL Server 在 tempdb 事务日志中记录的信息只足够用于回滚事务,而不足以用于在数据库故障恢复过程中重新执行事务。这一特点提高了 tempdb 中 INSERT 语句的性能。另外,由于每次重新启动 SQL Server 时都会重新创建 tempdb,无需记录用于重新执行任何事务的信息。因此,没有任何要前滚或回滚的事务。当 SQL Server 启动时,通过使用 model 数据库的副本重新创建 tempdb,并将其重置为上次配置的大小。
默认情况下,tempdb 数据库配置为根据需要自动增长;因此,此数据库可能最终增长到大于所需的大小。简单地重新启动 SQL Server 会将 tempdb 的大小重置为上次配置的大小。配置的大小是用文件大小更改操作(如带有 MODIFY FILE 选项的 ALTER DATABASE 或者 DBCC SHRINKFILE 语句)设置的上次显式大小。本文说明您可以用来将 tempdb 收缩到小于其配置的大小的三种方法。
用查询分析器连接到 SQL Server,然后为需要收缩的特定数据库运行下列 Transact-SQL 命令:
use tempdb
go
dbcc shrinkfile (tempdev, 'target size in MB')
go
-- this command shrinks the primary data file
dbcc shrinkfile (templog, 'target size in MB')
go
-- this command shrinks the log file, look at the last paragraph.
DBCC SHRINKFILE 的一个优点是它可以将文件大小减小到小于其原始大小。您可以对任何数据文件或日志文件执行 DBCC SHRINKFILE。DBCC SHRINKFILE 的一个局限是您无法使数据库小于 model 数据库的大小。
在 SQL Server 7.0 中,事务日志收缩是一个推迟操作,您必须执行日志截断和备份,以帮助进行数据库中的收缩操作。但是,默认情况下,tempdb 将 trunc log on chkpt 选项设置为“打开”(ON);这样,您就无需为该数据库执行日志截断。有关如何在 SQL Server 7.0 中收缩数据库事务日志的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
256650 (http://support.microsoft.com/kb/256650/) INF:如何收缩 SQL Server 7.0 事务日志
当正在使用 tempdb 时,如果您尝试通过使用 DBCC SHRINKDATABASE 或 DBCC SHRINKFILE 命令收缩它,可能会收到与以下类型相似的多个一致性错误,并且收缩操作可能失败:
Server:Msg 2501, Level 16, State 1, Line 1 Could not find table named '1525580473'.Check sysobjects.
- 或 -
Server:Msg 8909, Level 16, State 1, Line 0 Table Corrupt:Object ID 1, index ID 0, page ID %S_PGID.The PageId in the page header = %S_PGID.