稀疏填充的文本、 ntext,或图像列的 DBCC SHRINKFILE 和 SHRINKDATABASE 命令可能无法正常工作

文章翻译 文章翻译
文章编号: 324432 - 查看本文应用于的产品
展开全部 | 关闭全部

症状

DBCC SHRINKFILE 和 DBCC SHRINKDATABASE 命令而不会移动数据,并且如果 EstimatedPages 值等于当在命令完成时,将报告该 MinimumSize 值减小文件大小。由于二进制大对象 (BLOB) 数据类型的表上的数据修改查询的 (文本ntext图像),可以使许多统一分配扩展盘区的少量填入数据 (例如对于只有 1 分配的扩展盘区控制在 8 页),这将导致 DBCC SHRINKFILE 和 DBCC SHRINKDATABASE 命令 over-estimate EstimatedPages,数以及该命令并不执行收缩操作。 通常,会遇到此行为,其中的情况下,完整数据库备份的大小小于 8 倍的数据库文件的大小在数据库文件上运行 DBCC SHRINKFILE 之后。

解决方案

如果受影响的表不能是持续联机,而您纠正这种情况下,可以使用下列解决方法之一来解决此问题:
  • 若要将整个表传输到新表在同一个数据库使用 SELECT INTO 语句。将原始表放,然后再运行 DBCC SHRINKFILE 语句。新表重命名原始表名。
  • 若要将整个表传输到新表中不同的数据库使用 SELECT INTO 语句。截断原始表,然后再运行 DBCC SHRINKFILE 语句。数据传输回原始表。
  • 在纯模式下将该表复制使用大容量复制程序。表编写脚本,然后再除去现有的表。运行 DBCC SHRINKFILE 语句。创建一个新表,然后使用大容量复制程序将数据复制回该表。
  • 使用数据转换服务 (DTS) 将整个数据库传输到新的数据库。SQL Server 7.0 数据转换服务可能不传输中的文本和图像数据更长的时间已超过 64 KB 正确。此问题并不适用于的数据转换服务 SQL Server 2000 版本。 有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
    257425FIX: DTS 对象传输不会传送大于 64 BLOB 数据
    您可以查找大于 64 KB,使用以下查询的 text 和 image 列:
    SELECT MAX (DATALENGTH (TextImageColumn)) FROM TableName
    如果文本和图像数据大于 64 KB,传输截断数据并不引发任何错误,但在 DTS 中的日志文件。如果大于 64 KB 的文本或图像数据将在第三个项目符号项中的信息用于具有文本或图像数据的表。接下来,使用 DTS 为数据库中项目的其余部分。
如果该数据库必须处于联机状态,或者数据库的大小是过大,无法将数据移到外部文件或另一个数据库可以使用 DBCC SHRINKFILE 命令使用 EMPTYFILE 选项。若要用于此解决办法,请按照下列步骤操作:
  1. 如果运行的 Microsoft SQL Server 7.0 Service Pack 3 打开跟踪标志 1180年和 1197年。
  2. 如果您运行 Microsoft SQL Server 7.0 Service Pack 3 生成 7.00.987 或更高版本,其中包括 Service Pack 4,打开跟踪标志 1180年。
  3. 如果您已经扩散跨多个文件的驱动器空间问题或由于性能原因而数据库,创建通过使用 ALTER DATABASE 命令总大小相当的下面的查询结果的数据库中的 1 个或更多其他文件
    select 'size in MB'=ceiling(sum(ei.pg_alloc)/128.000), sfg.groupname
    from extentinfo ei inner join sysfiles sf on ei.[file_id] = sf.fileid and ei.[file_id] != 1
     inner join sysfilegroups sfg on sf.groupid = sfg.groupid
    group by sfg.groupname
    注意: 上述查询使用创建查询,在"更多信息"一节的这篇文章中的表。此外,文件大小总计按划分文件组。

  4. 在第二个参数为 EMPTYFILE 选项,在具有稀疏填充 blob 统一扩展盘区的每个文件上运行一个 DBCC SHRINKFILE 查询。
  5. 您可以通过创建具有相同的架构与 extentinfo 表从本文"更多信息"部分的一个或多个表来跟踪进度的 DBCC SRHINKFILE 命令。然后运行"INSERT...EXEC import_extentinfo"填充到新表中数据的查询。使用以下查询来对结果进行分析:
    select [file_id], 'page count'=sum(pg_alloc), 'min page'=min(page_id), 'max page'=max(page_id) from extentinfo group by [file_id]
    此外,您可以使用下面的查询,如果表开头的字母相同的图案和 DBCC EXTENTINFO 命令作为时间附近创建运行 DBCC EXTENTINFO 命令时跟踪的:
    select crdate, [name] from sysobjects where type = 'U' and [name] like 'extent%' order by crdate
  6. DBCC SHRINKFILE 查询完成时, 运行一个 ALTER DATABASE 查询以从数据库中删除旧的文件。
  7. 您可能可以通过使用在步骤 3 中创建的新文件上 TRUNCATEONLY 选项运行 DBCC SHRINKFILE 查询删除额外的空间。
  8. 如果运行的 Microsoft SQL Server 7.0 关闭您打开在步骤 1 或 2 中的跟踪标志。

更多信息

如果您以具有 系统管理员 权限的用户身份登录,您可以从查询分析器之类的任何查询工具运行下面的 TRANSACT-SQL 查询。若要确定是否 DBCC SHRINKDATABASE 命令和命令不能收缩文件 because of 稀疏该 DBCC SHRINKFILE 填充 BLOB 统一扩展盘区 SQL Server 上运行 TRANSACT-SQL 查询。

注意: 您必须更新的问题数据库名称的字符串 < 数据库名称 > 并将名称括在单引号中。

use pubs
go
if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 8
begin 
   create table extentinfo 
   (
   [file_id] smallint,
   page_id int,
   pg_alloc int,
   ext_size tinyint,
   obj_id int,
   index_id tinyint,
   pfs_bytes varbinary(10)
   )
end
go
if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 7
begin
   create table extentinfo 
   (
   [file_id] smallint,
   page_id int,
   pg_alloc int,
   ext_size tinyint,
   obj_id int,
   index_id tinyint,
   pfs_bytes varbinary(10),
   avg_used tinyint
   )
end
go
create procedure import_extentinfo as
dbcc extentinfo('<database name>')
go
insert extentinfo exec import_extentinfo
go

select [file_id],obj_id, index_id, ext_size, 'actual extent count'=count(*), 'actual page count'=sum(pg_alloc),
 'possible extent count'=ceiling(sum(pg_alloc)*1.0/ext_size),
 'possible extents / actual extents' = (ceiling(sum(pg_alloc)*1.00/ext_size)*100.00) / count(*)
 from extentinfo where ext_size != 1 and index_id = 255
 group by [file_id],obj_id, index_id, ext_size
 having count(*)-ceiling(sum(pg_alloc)*1.0/ext_size) > 0
 order by obj_id, index_id, [file_id]
如果您看到来自上一次查询的结果行的值是 255,index_id 值的和 可能的扩展盘区 / 实际扩展盘区 列是小于 75、 此数据库不会具有稀疏填充 BLOB 扩展盘区,可以减少在 $ 大小中,通过本文"解决方案"一节中所述的方法。

注意: 该查询依赖于功能的 DBCC EXTENTINFO 命令。不要使用这种情况下之外 DBCC EXTENTINFO 命令,因为功能可能会更改,或甚至 Microsoft SQL Server 的未来版本中被删除。

参考

有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
272220不能正确回收 FIX: TEXT/IMAGE 数据存储空间
308627DBCC SHRINKDATABASE 或 DBCC SHRINKFILE FIX: 可能展开具有文本或图像数据的数据库

属性

文章编号: 324432 - 最后修改: 2005年12月9日 - 修订: 5.1
这篇文章中的信息适用于:
  • Microsoft SQL Server 2000 标准版
  • Microsoft SQL Server 7.0 标准版
关键字:?
kbmt kbprb KB324432 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 324432
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com