收缩TempDB的办法(转载)

有时候在数据库上运行一个数据量很大的查询语句,会导致TempDB数据量剧增,具体查看下面链接文章:

SqlServer 一个查询语句导致tempdb增大55G

找到TempDB剧增的问题后,接下来的问题是如何收缩TempDB。下面这篇文章详细阐述了如何收缩TempDB:

最简单的办法:重启SQL Server服务
如果SQL Server 是安装在默认路径,那么 tempdb.mdf 和 templog.ldf 文件在以下路径:
“C:\Program Files\Microsoft SQL Server\MSSQL\Data\”
如果硬盘上该分区的空间不足以满足该临时文件的增长需求,那么使用以下命令转移到其它分区:
--移动主数据文件
ALTER DATABASE tempdb MODIFY FILE
( NAME=‘tempdev‘,
FILENAME =‘d:\tempdb.mdf‘)
--移动主日志文件
ALTER DATABASE tempdb MODIFY FILE
( NAME=‘templog‘,
FILENAME =‘d:\templog.ldf‘)
如何收缩tempdb数据库 - 以下是来自微软官方的完整解析:
本文讨论将 tempdb 数据库收缩为小于其上次配置的大小的三种方法。第一种方法使您可以完全控制 tempdb 文件的大小,但它要求您重新启动 SQL Server。第二种方法将 tempdb 作为整体来收缩,但它具有某些限制,可能包括重新启动 SQL Server。第三种方法允许您收缩 tempdb 中的单个文件。最后两种方法要求在收缩操作过程中在 tempdb 数据库中不发生任何活动。
注意:如果您使用的是 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 收缩到小于其配置的大小的三种方法。

收缩 Tempdb 的方法 1(此方法我尝试后很有效!)
此方法要求您重新启动 SQL Server。
1.停止 SQL Server。打开命令提示符,然后键入以下命令启动 SQL Server:
sqlservr -c -f
-c 和 -f 参数使 SQL Server 以最小配置模式启动,让数据文件的 tempdb 大小为 1 MB,日志文件的 tempdb 为 0.5 MB。
注意:如果使用 SQL Server 命名实例,必须切换到适当的文件夹 (Program Files\Microsoft SQL Server\MSSQL$instance name\Binn),并使用 -s 开关 (-s%instance_name%)。
2.用查询分析器连接到 SQL Server,然后运行下列 Transact-SQL 命令:
  ALTER DATABASE tempdb MODIFY FILE
  (NAME = ‘tempdev‘, SIZE = target_size_in_MB)
  --Desired target size for the data file
  ALTER DATABASE tempdb MODIFY FILE
  (NAME = ‘templog‘, SIZE = target_size_in_MB)
  --Desired target size for the log file
   3.通过在命令提示符窗口中按 Ctrl-C 停止 SQL Server,将 SQL Server 作为服务重新启动,然后验证 Tempdb.mdf 和 Templog.ldf 文件的大小。
此方法的局限是它只能对默认的 tempdb 逻辑文件 tempdev 和 templog 进行操作。如果将其他文件添加到了 tempdb,您可以在将 SQL Server 作为服务重新启动后收缩它们。在启动过程中将重新创建所有 tempdb 文件;因此,它们是空的并可删除。要删除 tempdb 中的其他文件,请使用带有 REMOVE FILE 选项的 ALTER DATABASE 命令。

收缩 Tempdb 的方法 2
使用 DBCC SHRINKDATABASE 命令将 tempdb 数据库作为整体收缩。DBCC SHRINKDATABASE 接收参数 target_percent,该参数是数据库收缩后数据库文件中剩余可用空间的所需百分比。如果使用 DBCC SHRINKDATABASE,可能必须重新启动 SQL Server。
重要说明:如果运行 DBCC SHRINKDATABASE,则 tempdb 数据库不能正在发生其他活动。要确保在运行 DBCC SHRINKDATABASE 时其他进程无法使用 tempdb,必须以单用户模式启动 SQL Server。有关更多信息,请参考本文的在使用 Tempdb 时执行 DBCC SHRINKDATABASE 或 DBCCSHRINKFILE 的结果 一节。
1.通过使用 sp_spaceused 存储过程确定 tempdb 中当前使用的空间。然后,计算剩余可用空间的百分比,它将用作 DBCC SHRINKDATABASE 的参数;该计算是基于所需数据库大小进行的。
注意:在某些情况下,您可能必须执行 sp_spaceused @updateusage=true 来重新计算使用的空间和获得更新的报告。有关 sp_spaceused 存储过程的更多信息,请参考 SQL Server 联机丛书。
请考虑以下示例:
假定
tempdb
 有两个文件:主数据文件 (Tempdb.mdf) 和日志文件 (Tempdb.ldf),其大小分别为 100 MB 和 30 MB。假定
sp_spaceused
 报告主数据文件包含 60 MB 的数据。还假定您要将主数据文件收缩到 80 MB。计算收缩后剩余可用空间的所需百分比,即 80 MB - 60 MB = 20 MB。现在,用 20 MB 除以 80 MB = 25%,这就是您的 target_percent。事务日志文件将据此进行收缩,从而在数据库收缩后剩下 25% 即 20 MB 的可用空间。
2.用查询分析器连接到 SQL Server,然后运行下列 Transact-SQL 命令:
  dbcc shrinkdatabase (tempdb, ‘target percent‘)
  -- This command shrinks the tempdb database as a whole
   对 tempdb 数据库使用 DBCC SHRINKDATABASE 命令具有局限性。数据文件和日志文件的目标大小不能小于创建数据库时指定的大小,也不能小于用文件大小更改操作(如带有 MODIFY FILE 选项的 ALTER DATABASE 命令或 DBCC SHRINKFILE 命令)显式设置的上次大小。DBCC SHRINKDATABASE 的另一个限制是 target_percentage 参数的计算和它对当前使用的空间的依赖。
 
收缩 Tempdb 的方法 3
使用命令 DBCC SHRINKFILE 收缩单个 tempdb 文件。DBCC SHRINKFILE 比 DBCC SHRINKDATABASE 提供更多的灵活性,因为您可以对单个数据库文件使用它而不必影响属于同一数据库的其他文件。DBCC SHRINKFILE 接收 target size 参数,这是所需的数据库文件的最终大小。
重要说明:必须在 tempdb 数据库不发生任何活动时运行 DBCC SHRINKFILE 命令。要确保在执行 DBCC SHRINKFILE 时其他进程不能使用 tempdb,必须以单用户模式重新启动 SQL Server。有关 DBCC SHRINKFILE 的更多信息,请参见本文中在使用 Tempdb 时执行 DBCC SHRINKDATABASE 或 DBCCSHRINKFILE 的结果 一节。
1.确定主数据文件 (tempdb.mdf)、日志文件 (templog.ldf) 和/或添加到 tempdb 的其他文件的所需大小。确保在这些文件中使用的空间小于或等于所需的目标大小。
2.用查询分析器连接到 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 或 DBCCSHRINKFILE 的结果
当正在使用 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. 尽管错误 2501 可能不表示 tempdb 中的任何损坏,但它会导致收缩操作失败。与其不同,错误 8909 可能表示 tempdb 数据库中的损坏。应重新启动 SQL Server 来重新创建 tempdb 并清除一致性错误。但是,请记住像错误 8909 这样的物理数据损坏可能有其他原因,这包括输入/输出子系统问题。

时间: 2024-10-08 01:01:05

收缩TempDB的办法(转载)的相关文章

Java 内存泄漏--全解析和处理办法 [ 转载 ]

Java内存泄露——全解析和处理办法 [转载] @author 小筐子 @address http://www.jianshu.com/p/bf159a9c391a 本文章会一步一步的探讨内存泄露的问题.博主第一次书写长篇技术贴,如有错误或不周到的地方请多指教. JAVA是垃圾回收语言的一种,开发者无需特意管理内存分配.但是JAVA中还是存在着许多内存泄露的可能性,如果不好好处理内存泄露,会导致APP内存单元无法释放被浪费掉,最终导致内存全部占据堆栈(heap)挤爆进而程序崩溃. 内存泄露 说到

Hibernate不能自动建表解决办法(转载自:http://blog.csdn.net/biangren/article/details/8010018)

最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且在mysql中新建了一个hibernate数据库,仅此而已.然而预想不到的事情发生了……程序写好之后,运行,报错 Hibernate: insert into news_table (title, content) values (?, ?)       Exception in thread "m

收缩 tempdb 数据库

客户需求: 这是一个生产环境,在夜深人静的时候发现 tempdb 已经超过500GB. 需求分析: 我们知道,如果重启 SQL Server,tempdb 会自动重新创建,从而使 tempdb 回归到初始大小.但是这是生产环境,不允许重启 SQL Server. 尝试: 直接收缩 tempdb,始终不成功. USE [tempdb]GO DBCC SHRINKFILE (N'tempdev' , 0, TRUNCATEONLY)  --释放所有可用空间GO DBCC SHRINKFILE (N'

Android不同方式启动导致重复启动相同的Activity的问题解决办法(转载,解决了我的问题)

打开程序入口有好多种方法: 1.shell命令打开运行 2.Launcher待机界面运行 3.状态栏启动运行 4.桌面快捷方式运行 5.软件中调用运行 6.安装软件后执行“open/打开”运行 如果用户安装后立即执行“open/打开” 运行或者用adb shell命令运行应用程序,然后点HOME键把程序挂起, 然后再采用其他发送启动程序,这样则会再启动一个Main程序, 导致用户要点击多下才能退出程序, 那么原因是什么呢? 这是因为Intent的处理机制是,先比较Activity,再比较Acti

数据库镜像中成功收缩事务日志文件 (转载)

数据库镜像中成功收缩事务日志文件 数据库已经运行在数据库镜像的时候怎么收缩事务日志文件呢?? 我们有一个产品数据库发现事务日志文件已经到到了60GB,而数据库本身才30GB.需要收缩事务日志文件. 经过一个礼拜的观察,平均没有有1.5GB的日志,99%的日志是在晚上产生的,周末有16GB的日志,看来大部分是非工作时间批处理产生的. 我觉得收缩日志文件,怎么做呢??google来半天也没什么好的办法,大部分说是要切换到simple模式,重新构建数据库镜像数据库.这对产品环境影响比较大. 只有自己摸

eclipse自动提示功能没了的解决办法(转载)

eclipse自动提示功能没了的解决办法 标签: eclipse联想 2012-08-09 14:32 24687人阅读 评论(7) 收藏 举报  分类: Android(38)  版权声明:本文为博主原创文章,未经博主允许不得转载. 由于重新配置了环境,并且eclipse也是装的4.2的,今天用的时候发现了,居然没有自动提示功能,也就是当一个对象居然点不出他的相关方法.后来网上搜索了下,成功的 办法是. 1.我window->Preferences->Java->Editor->

Git冲突:commit your changes or stash them before you can merge. 解决办法(转载)

用git pull来更新代码的时候,遇到了下面的问题: error: Your local changes to the following files would be overwritten by merge: xxx/xxx/xxx.php Please, commit your changes or stash them before you can merge. Aborting 出现这个问题的原因是其他人修改了xxx.php并提交到版本库中去了,而你本地也修改了xxx.php,这时候

使用SDWebImage加载大量图片后造成内存泄露的解决办法 转载

使用SDWebImage加载大量图片后造成内存泄露的解决办法 时间:2015-07-21 14:26:47      阅读:5885      评论:0      收藏:0      [点我收藏+] SDWebImage的知名度就不用说了,github上近10k的star,国内外太多的App使用其进行图片加载. 但是最近在使用过程中发现,在UITableView中不断加载更多的内容,使用SDWebImage会造成内存占用越来越大,导致memory warning最终terminate,稍微找了下

使用Maven编译项目遇到——“maven编码gbk的不可映射字符”解决办法 ——转载

一.问题描述 今天在MyEclipse中使用Maven编译项目源代码时,结果如下了如下的错误 百思不得其解啊,java源代码在MyEclipse中显示是没有任何错误的,可是执行"maven install"命令编译项目时就会出现上述的错误,导致项目编译失败.这个问题还是第一次遇到,还好在这里http://capslk.iteye.com/blog/1419958看到了解决问题的办法. 二.解决办法 解决这个问题的思路: 在maven的编译插件中声明正确的字符集编码编码——编译使用的字符