
# RDS for SQL Server收缩数据库
#### 操作场景
云数据库 RDS for SQL Server提供使用存储过程收缩指定数据库的数据文件和日志文件的大小，以释放磁盘部分空间。
#### 前提条件
成功连接RDS for SQL Server实例。通过SQL Server客户端连接目标实例，具体操作请参见[通过公网连接SQL Server实例](https://support.huaweicloud.com/usermanual-rds-mssql/rds_mssql_connect_06.html)。
#### 功能限制
- 数据库文件大小超过50MB，才可以使用该功能。如果要收缩的数据库文件大小不超过50MB，对该文件的收缩将不起作用。并且会显示相关提示。如下图所示： ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002264627373.png)
  

- 基于行版本控制的隔离级别下运行的事务可能会阻止收缩操作。若要解决此问题，请执行下列操作之一：
  1. 终止阻止收缩操作的事务。
  
  2. 终止收缩操作。 如果收缩操作终止，所有已完成的工作都会保留。
  
  3. 不执行任何操作，并允许收缩操作等到阻塞事务完成。
   
 
#### 最佳实践
在计划收缩数据库文件时，请考虑以下信息：
- 在执行会产生大量未用空间的操作（如重启）后，执行收缩操作最有效。
- 大多数数据库都需要一些可用空间，以供常规日常操作使用。如果反复收缩数据库，并且它的大小再次增长，那么常规操作可能需要收缩空间。在这种情况下，反复收缩数据库是一种无意义的操作。
- 收缩操作不保留数据库中索引的碎片状态，通常还会在一定程度上增加碎片。此类碎片是不要反复收缩数据库的另一个原因。
 
#### 操作步骤
1. 执行以下命令，进行数据库收缩。 
   **EXEC \[master\].\[dbo\].\[rds_shrink_database\] @DBName='** *myDbName* **';**
   表1参数说明 
   | **参数**   | **说明**                         |
   |:---|:---|
   | myDbName | 收缩指定数据库的数据库名称。如果未指定，默认收缩所有数据库。 |
      
   执行结果集如下图所示，每个结果对应指定数据库（或所有数据库）的每个文件的相关信息。
   图1结果集   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002264627369.png)
   表2结果集参数说明 
   | **列名称**        | **说明**                               |
   |:---|:---|
   | DbId           | 当前收缩文件的数据库标识号。                       |
   | FileId         | 当前收缩文件的文件标识号。                        |
   | CurrentSize    | 文件当前占用的8KB页数。                        |
   | MinimumSize    | 文件最低可以占用的8KB页数。此数字对应于文件的大小下限或最初创建大小。 |
   | UsedPages      | 文件当前使用的8KB页数。                        |
   | EstimatedPages | 数据库引擎估计文件能够收缩到的8KB页数。                |
      
   
   
2. 执行成功后，系统会显示执行进度，并最终进行如下提示： 
   ```
   HW_RDS_Process_Successful: Shrink Database Done.
   ```
   
   
 
#### 故障排除
如果在执行数据库收缩后文件大小未改变，请执行以下SQL，验证文件是否有足够的可用空间：
**SELECT** **name, size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB FROM sys.database_files;**
#### 示例
1. 执行以下命令，对dbtest2数据库进行收缩。 **EXEC** **\[master\].\[dbo\].\[rds_shrink_database\] @DBName = 'dbtest2';**
   执行结果如下图所示：
   图2执行结果   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002229707830.jpg) 
2. 执行以下命令，对所有数据库进行收缩。 **EXEC** **\[master\].\[dbo\].\[rds_shrink_database\];**
   
 
