无法缩小SQL Server中的数据文件(花费太多时间)

时间:2017-04-20 04:40:25

标签: sql-server-2016

我正在使用:

SQL Server 2016标准版

Windows Server 2012 R2(标准版)

数据库大小: 1.4TB

主数据文件中使用的空间: 587GB

主数据文件中未使用的空间: 852GB

恢复模式:简单

  

我正在尝试使用以下命令将数据文件缩小到687GB:

USE [TestDB]
GO
DBCC SHRINKFILE (N'TestDB' , 687017) 
GO

此数据库没有阻止,也没有其他活动发生。

自上次19小时以来,上述缩小操作一直在进行,但仍未完成。 所以任何人都可以告诉我此时需要做些什么。

此缩小操作需要多长时间?

1 个答案:

答案 0 :(得分:0)

  

当缩小数据文件时,需要做什么?此时需要做什么?

您需要做以下事情:

  1. 在执行收缩操作之前重建数据库的索引。
  2. 如果文件的大小对您的环境来说太大,请尝试以小块缩小文件。
  3. 解决此问题的另一个选项是清空文件
  4. - EMPTYFILE : 将指定文件中的所有数据迁移到同一文件组中的其他文件。换句话说,EmptyFile会将数据从指定文件迁移到同一文件组中的其他文件。 Emptyfile向您保证不会向文件中添加新数据。可以使用ALTER DATABASE语句删除该文件。

      

    示例:清空文件

    以下示例演示了清空文件以便可以从数据库中删除的过程。出于此示例的目的,首先创建数据文件,并假定该文件包含数据。

    USE AdventureWorks2012;  
    GO  
    -- Create a data file and assume it contains data.  
    ALTER DATABASE AdventureWorks2012   
    ADD FILE (  
        NAME = Test1data,  
        FILENAME = 'C:\t1data.ndf',  
        SIZE = 5MB  
        );  
    GO  
    -- Empty the data file.  
    DBCC SHRINKFILE (Test1data, EMPTYFILE);  
    GO  
    -- Remove the data file from the database.  
    ALTER DATABASE AdventureWorks2012  
    REMOVE FILE Test1data;  
    GO  
    

    直接来自BOL

      

    这次收缩操作应该花多少时间?

    DBCC SHRINKFILE

    是单线程操作,单线程操作不利用多个CPU,并且对可用RAM的数量没有影响。

    然而;在运行DBCC SHRINKFILE操作之前重建索引,缩小文件操作所需的时间相对较少。

    重建索引操作利用了多个CPU。

    您还可以使用以下命令检查DBCC收缩文件的完成进度:

    SELECT percent_complete, estimated_completion_time
      FROM sys.dm_exec_requests
      WHERE session_id = <spid running the shrink>;