# 收缩数据库
#### 操作场景
使用存储过程收缩指定数据库的数据文件和日志文件的大小，以释放磁盘部分空间。
- rds_shrink_database：收缩指定数据库的全部文件。
- rds_shrink_database_log ：收缩指定数据库的日志文件。
更多操作，请参见[RDS for SQL Server收缩数据库](https://support.huaweicloud.com/bestpractice-rds-mssql/rds_04_0022.html)。
#### 前提条件
- 收缩数据库前，确保实例要预留足够的磁盘空间。
- 成功连接RDS for SQL Server实例。通过SQL Server客户端连接目标实例，具体操作请参见[通过公网连接RDS for SQL Server实例](https://support.huaweicloud.com/usermanual-rds-mssql/rds_mssql_connect_06.html)。
 
#### 收缩数据库
1. 执行以下命令，进行数据库收缩。 
   ```
   EXEC [master].[dbo].[rds_shrink_database] @DBName='myDbName';
   ```
   表1参数说明 
   | **参数**     | **说明**                          |
   |:---|:---|
   | myDbName | 收缩指定数据库的数据库名称。如果未指定，默认收缩所有数据库。 |
      
   
   
2. 执行成功后，系统会显示执行进度，并最终进行如下提示： 
   ```
   RDS_Process_Successful: Shrink Database Done.
   ```
   
   
 
#### 收缩日志文件
执行以下命令，收缩目标数据库的日志文件。
```
EXEC [master].[dbo].[rds_shrink_database_log] @dbname;
```
@dbname: 目标数据库。
#### 示例
1. 执行以下命令，对dbtest2数据库进行收缩。
   ```
   EXEC [master].[dbo].[rds_shrink_database] @DBName = 'test';
   ```
   执行结果如下图所示：
   ![](https://support.huaweicloud.com/usermanual-rds-mssql/zh-cn_image_0000002214916406.png "点击放大")
   
2. 执行以下命令，对所有数据库进行收缩。
   ```
   EXEC [master].[dbo].[rds_shrink_database];
   ```
   
3. 执行以下命令，收缩数据库testdb的日志文件。
   ```
   EXEC [master].[dbo].[rds_shrink_database_log]@dbname='dbtest3';
   ```
   
 
#### 常见问题
1. 如果执行存储过程发生报错，报错信息为"文件正在使用中"，则请稍后再执行存储过程。
2. 如果执行存储过程后，日志文件大小未改变，请在目标数据库环境下，执行以下SQL，验证文件是否有足够的可用空间。
   ```
   SELECT name, size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB FROM sys.database_files WHERE type_desc='LOG';
   ```
   
3. 如果多次执行日志收缩存储过程后，日志文件大小未改变，说明日志文件正在被使用。执行以下SQL，验证日志文件是否被占用。
   ```
   SELECT name, log_reuse_wait_desc FROM sys.databases where name='test';
   ```
   如果日志文件正在被占用，可以等待一段时间后，再进行收缩。
   表2log_reuse_wait_desc类型说明 
   | log_reuse_wait_desc值       | 说明                                                  |
   |:---|:---|
   | NOTHING                   | 当前有一个或多个可重复使用的虚拟日志文件 (VLF)。                       |
   | CHECKPOINT               | 自上次日志截断之后，尚未生成检查点，或者日志头尚未跨虚拟日志文件 (VLF) 移动（所有恢复模式）。 |
   | LOG_BACKUP                | 在截断事务日志前，需要进行日志备份。                                   |
   | ACTIVE_BACKUP_OR_RESTORE    | 数据备份或还原正在进行。                                        |
   | ACTIVE_TRANSACTION        | 事务处于活动状态。                                         |
   | DATABASE_MIRRORING        | 数据库镜像暂停，或者在高性能模式下，镜像数据库明显滞后于主体数据库。                |
   | REPLICATION               | 在事务复制过程中，与发布相关的事务仍未传递到分发数据库。                    |
   | DATABASE_SNAPSHOT_CREATION | 正在创建数据库快照。                                          |
   | LOG_SCAN                  | 正在进行日志扫描。                                        |
   | AVAILABILITY_REPLICA        | 可用性组的辅助副本正将此数据库的事务日志记录应用到相应的辅助数据库。               |
      
   
 
