好久没有玩sqlserver了.
最近刚刚好帮同事看看sqlserver的datafile无法收缩之异常.
一,现象重现
DB 右键选择 shrink file的Available free space显示,99%可用。
同样,shrink action 选择"Reorganize pages before releasing unused space " 输入 "5000" .

2. 正常来讲,可用空间99%,MRP.MDF应该会缩小到5000M。
3. 实际情况却是,执行成功后, size大小无变化。
二、排查原因。。。
收缩无法成功,可能需要先备份数据库,再进行收缩。
执行db完整备份

执行log收缩也成功了。
重新执行收缩mdf
USE [MRP]
GO
DBCC SHRINKDATABASE(N'MRP', 10 )
GO
DBCC SHRINKFILE (N'MRP' , 5000)
GO

执行以上命令十几次,size大小依旧无变化。
经询问同事,此库初始化大小很小的。并且查看测试库,size只有40G。
排除此库size是初始化导致的。

查询数据库的真实可用空间。居然只有52M。。。
SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB
FROM sys.database_files;

继续跟踪disk reports ,查看top table size。 确实table数据量是有的。size大小也是真实的。

现在可以肯定,这个Shrink file的Available free space显示不对,是个bug。
它居然还提示我 “shrink file to Minimum is 1132MB 。。。”

三、结论
1. 真实数据是有540G的,收缩不了是正常的,也是合理的。
2. Shrink file里面的Available free space显示数据,肯定不对。属于bug无疑。




