DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC SHRINKDATABASE收缩指定数据库中的数据文件和日志文件的大小
收缩指定数据库中的数据文件和日志文件的大小。
DBCC SHRINKDATABASE
( database_name | database_id | 0
[ , target_percent ]
[ , { NOTRUNCATE | TRUNCATEONLY } ]
)
[ WITH NO_INFOMSGS ]
要收缩的数据库的名称或 ID。如果指定 0,则使用当前数据库。
target_percent
数据库收缩后的数据库文件中所需的剩余可用空间百分比。
NOTRUNCATE
通过将已分配的页从文件末尾移动到文件前面的未分配页来压缩数据文件中的数据。target_percent 是可选参数。
文件末尾的可用空间不会返回给操作系统,文件的物理大小也不会更改。因此,指定 NOTRUNCATE 时,数据库看起来未收缩。
NOTRUNCATE 只适用于数据文件。日志文件不受影响。
TRUNCATEONLY
将文件末尾的所有可用空间释放给操作系统,但不在文件内部执行任何页移动。数据文件只收缩到最近分配的区。如果与 TRUNCATEONLY 一起指定,将忽略 target_percent。
TRUNCATEONLY 只适用于数据文件。日志文件不受影响。
WITH NO_INFOMSGS
取消严重级别从 0 到 10 的所有信息性消息。
下表对结果集中的列进行了说明。
|
列名 |
说明 |
|---|---|
|
DbId |
数据库引擎试图收缩的文件的数据库标识号。 |
|
FileId |
数据库引擎尝试收缩的文件的文件标识号。 |
|
CurrentSize |
文件当前占用的 8 KB 页数。 |
|
MinimumSize |
文件最低可以占用的 8 KB 页数。这与文件的最小大小或最初创建时的大小相对应。 |
|
UsedPages |
文件当前使用的 8 KB 页数。 |
|
EstimatedPages |
数据库引擎估计文件能够收缩到的 8 KB 页数。 |
注意 |
|---|
|
数据库引擎不显示未收缩的文件的行。 |
若要收缩特定数据库的所有数据和日志文件,请执行 DBCC SHRINKDATABASE 命令。若要一次收缩一个特定数据库中的一个数据或日志文件,请执行 DBCC SHRINKFILE 命令。
若要查看数据库中当前的可用(未分配)空间量,请运行 sp_spaceused。
可在进程中的任一点停止 DBCC SHRINKDATABASE 操作,任何已完成的工作都将保留。
收缩后的数据库不能小于数据库的最小大小。最小大小是在数据库最初创建时指定的大小,或是使用文件大小更改操作(如 DBCC SHIRNKFILE 或 ALTER DATABASE)显式设置的最后大小。例如,如果数据库最初创建时的大小为 10 MB,后来增长到 100 MB,则该数据库最小只能收缩到 10 MB,即使已经删除数据库的所有数据也是如此。
运行 DBCC SHRINKDATABASE 而不指定 NOTRUNCATE 选项或 TRUNCATEONLY 选项等价于带 NOTRUNCATE 运行 DBCC SHRINKDATABASE 操作,然后再带 TRUNCATEONLY 运行 DBCC SHRINKDATABASE 操作。
要收缩的数据库不必在单用户模式下;其他的用户仍可以在数据库收缩时对其进行工作。这也包括系统数据库。
不能在备份数据库时收缩数据库。反之,也不能在数据库执行收缩操作时备份数据库。
DBCC SHRINKDATABASE 的工作原理
DBCC SHRINKDATABASE 以每个文件为单位对数据文件进行收缩。然而,DBCC SHRINKDATABASE 在对日志文件进行收缩时,它将视为所有的日志文件都存在于一个连续的日志池中。文件始终从末尾开始收缩。
假设名为 mydb 的数据库有一个数据文件和两个日志文件。数据文件和日志文件分别是 10 MB,并且数据文件包含 6 MB 数据。
对于每个文件,数据库引擎都会计算一个目标大小。这就是文件将要收缩到的大小。将 target_percent 与 DBCC SHRINKDATABASE 一起指定时,数据库引擎计算的目标大小是收缩后文件中的 target_percent 可用空间大小。例如,如果在收缩 mydb 时将 target_percent 指定为 25,则数据库引擎将此文件的目标大小计算为 8 MB(6 MB 数据加上 2 MB 可用空间)。因此,数据库引擎将任何数据从数据文件的后 2 MB 中移动到数据文件前 8 MB 的可用空间中,然后对该文件进行收缩。
假设 mydb 的数据文件包含 7 MB 的数据。将 target_percent 指定为 30,以允许将此数据文件收缩到可用空间的 30%。但是,将 target_percent 指定为 40 却不会收缩数据文件,因为数据库引擎收缩文件的目标大小不能小于数据当前占用空间大小。您还可以用另一种方法来考虑此问题:所要求的 40% 可用空间加上整个数据文件大小的 70%(10 MB 中的 7 MB),超过了 100%。因为所要求的可用百分比加上数据文件占用的当前百分比大于 100%(多出 10%),所以任何大于 30 的 target_size 都不会收缩此数据文件。
对于日志文件,数据库引擎使用 target_percent 来计算整个日志的目标大小;因此,target_percent 是收缩操作后日志中的可用空间大小。之后,整个日志的目标大小转换为每个日志文件的目标大小。
DBCC SHRINKDATABASE 尝试立即将每个物理日志文件收缩到其目标大小。如果虚拟日志中的所有逻辑日志部分都没有超出日志文件的目标大小,则该文件将成功截断,DBCC SHRINKDATABASE 完成且不显示任何消息。但是,如果部分逻辑日志位于超出目标大小的虚拟日志中,则数据库引擎将释放尽可能多的空间,并发出一条信息性消息。该消息说明需要执行哪些操作来将逻辑日志移出位于文件末尾的虚拟日志。执行该操作以后,DBCC SHRINKDATABASE 可用于释放剩余空间。有关详细信息,请参阅收缩事务日志。
因为日志文件只能收缩到虚拟日志文件边界,所以不可能将日志文件收缩到比虚拟日志文件更小(即使现在没有使用该文件)。虚拟日志文件的大小在创建或扩展这些日志文件时由数据库引擎动态选择。有关虚拟日志文件的详细信息,请参阅事务日志物理体系结构。
最佳做法
当您计划收缩数据库时,请考虑以下信息:
在执行会产生许多未使用空间的操作(如截断表或删除表操作)后,执行收缩操作最有效。
大多数数据库都需要一些可用空间,以供常规日常操作使用。如果反复收缩数据库并注意到数据库大小变大,则表明收缩的空间是常规操作所必需的。在这种情况下,反复收缩数据库是一种无谓的操作。
收缩操作不会保留数据库中索引的碎片状态,通常还会在一定程度上增加碎片。这是不要反复收缩数据库的另一个原因。
除非有特定要求,否则不要将 AUTO_SHRINK 数据库选项设置为 ON。
故障排除
在基于行版本控制的隔离级别下运行的事务可能会阻塞收缩操作。例如,执行 DBCC SHRINK DATABASE 操作时,如果在基于行版本控制的隔离级别下运行的大型删除操作正在进行中,则收缩操作将等到删除操作完成才会收缩文件。出现这种情况时,DBCC SHRINKFILE 和 DBCC SHRINKDATABASE 操作会在第一个小时每五分钟将信息性消息(对于 SHRINKDATABASE 为 5202,对于 SHRINKFILE 为 5203)输出到 SQL Server 错误日志,之后每一个小时输出一次。例如,如果错误日志包含以下错误消息:
DBCC SHRINKDATABASE for database ID 9 is waiting for the snapshot
transaction with timestamp 15 and other snapshot transactions linked to
timestamp 15 or with timestamps older than 109 to finish.
这意味着收缩操作被时间戳早于 109 的快照事务阻塞,它是收缩操作所完成的上一事务。它还说明 sys.dm_tran_active_snapshot_database_transactions 动态管理视图中的 transaction_sequence_num 或 first_snapshot_sequence_num 列包含值 15。如果该视图中的 transaction_sequence_num 或first_snapshot_sequence_num 列包含的数字小于收缩操作完成的上一事务 (109),则收缩操作将等待这些事务完成。
若要解决此问题,请执行下列任务之一:
终止阻塞收缩操作的事务。
终止收缩操作。将保留任何已完成的工作。
不执行任何操作,并允许收缩操作等到阻塞事务完成。
有关 SQL Server 错误日志的详细信息,请参阅查看 SQL Server 错误日志。
要求具有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员身份。
要求具有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员身份。
A. 收缩数据库并指定可用空间的百分比
以下示例将减小 UserDB 用户数据库中数据文件和日志文件的大小,以便在数据库中留出 10% 的可用空间。
DBCC SHRINKDATABASE (UserDB, 10);
GO
B. 截断数据库
以下示例使 AdventureWorks2008R2 示例数据库中的数据文件收缩到最后分配的区。
DBCC SHRINKDATABASE (AdventureWorks2008R2, TRUNCATEONLY);
DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC SHRINKDATABASE收缩指定数据库中的数据文件和日志文件的大小的更多相关文章
- MS SQLServer 2008数据库处于SUSPECT情况下的处理
做任何恢复操作之前,请先备份.mdf, .ndf和.ldf文件. use master go --将处于suspect状态下的数据库设置为紧急状态 alter database <Databas ...
- SQLServer数据库中开启CDC导致事务日志空间被占满的原因
SQLServer数据库中开启CDC导致事务日志空间被占满的原因 转载 2017-04-01 投稿:mrr 我要评论 这篇文章主要介绍了SQLServer数据库中开启CDC导致事务日志空间 ...
- Sqlserver 2008 R2安装的盘符空间不够用的解决办法
例如我把一个sqlserver数据库安装在了D盘,结果发现D盘只剩下20G的可用空间,可是数据却每天的在增长,如何办?于是百度到了以下解决办法 方法很多: 1.可以给primary文件组添加文件.选择 ...
- C#读取Visual FoxPro(*.dbf)数据并使用SqlBulkCopy插入到SqlServer 2008 R2数据表中
公司数据库从32位的SqlServer 2005升级到64位的SqlServer 2008 R2后,无法再像原来通过Link Server连接VFP同步数据,因此考虑用代码程序从VFP数据库中读取所需 ...
- SQLServer 2008 R2 发布订阅配置指南
原以为配置SQLServer 2008 R2的发布订阅很简单,实际配置后才发现过程中有问题地方一直都没搞明白,最后经过几天的查找问题和实践,终于搞定了.现将过程记录如下. SQLServer 2008 ...
- SQLServer 2008 R2查看字段约束
SQLServer 2008 R2 删除字段前检查字段的约束: select a.name,b.name as cname from syscolumns a left join sysobjects ...
- 打开MSSQL 2008 R2的时候,展开数据库都显示以下的错误提示: 值不能为空。参数名viewinfo(microsoft.sqlserver.management.sqlstudio.explorer)
打开MSSQL 2008 R2的时候,展开数据库都显示以下的错误提示: 值不能为空.参数名viewinfo(microsoft.sqlserver.management.sqlstudio.explo ...
- sqlserver 2008 r2 下载地址和序列号,可用迅雷下载
sqlserver 2008 r2 下载地址,可用迅雷下载 下载sqlserver 2008 r2 ,微软用了一个下载器,经过从下载器上,将他的地址全部用键盘敲了下来.最终的简体中文版地址如下: 32 ...
- sqlserver 2008 r2 直接下载地址,可用迅雷下载
转自 http://www.cnblogs.com/chinafine/archive/2010/12/23/1915312.html sqlserver 2008 r2 直接下载地址,可用迅雷下载 ...
- SQLServer数据库中开启CDC导致“事务日志空间被占满,原因为REPLICATION”的原因分析和解决办法
本文出处:http://www.cnblogs.com/wy123/p/6646143.html SQLServer中开启CDC之后,在某些情况下会导致事务日志空间被占满的现象为:在执行增删改语句(产 ...
随机推荐
- Oracle 存储过程4:PL/SQL动态执行DDL语句
- git push 时发生的error: failed to push some refs to
- 先再一个新建的一个文件夹里面git clone +你要克隆的远程仓库 - 然后把克隆下来的.git文件夹复制到你的本地仓库,然后再commit-git add, - git push 就可以提交成 ...
- java基于ssm框架开发的公交查询系统源码公交系统源码公交路线查询项目有论文
简介 java基于ssm的公交路线查询系统,用户可以查询公交站点公交车路线以及公交换乘方案,还可以查看公交车路线地图,以及该站点所有的公交车路线. 演示视频: https://www.ixigua.c ...
- apk签名之后安装失败
Android Studio 3.0.1 很奇怪的一个现象,直接run的话可以成功,debug也可以,但是用签名打包之后,却安装失败,原来是打包的时候选错了.原来签名时,Signature Versi ...
- c#获取当前进程使用内存
public static string GetMemory() { Process proc = Process.GetCurrentProcess(); ...
- Java实现发红包模拟
1.先画界面 package com.cmk; import javax.swing.*; import java.awt.*; import java.awt.event.KeyAdapter; i ...
- 6.配置git-码云仓库
使用git需要使用码云或者github,github存在访问慢的情况,所以我使用码云(gitee). git客户端 下载安装 到git官网 https://git-scm.com/ 下载git客户端 ...
- 【剑指Offer】【链表】链表中倒数第k个结点
题目:输入一个链表,输出该链表中倒数第k个结点. A1:先从头到尾扫描链表,得到链表的总长度n,然后再扫描一次链表,输出n-k+1处的结点 ===> 测试用例超时 A2:创建两个指针,一个遍历 ...
- 利用Comparator对枚举类型进行排序的实现
1. 利用BeanComparator对List<Object>根据属性进行排序 String daXiaoOrder[] = {"很小","小", ...
- MongoDB和sql语句的对照
左边是mongodb查询语句,右边是sql语句.对照着用,挺方便. db.users.find() select * from users db.users.find({"age" ...