我们开发环境的SQL Server上有一个数据库叫"RawData",该数据库有大量的空间被占用,但是实际上这些空间都未被使用。可以通过下面的SQL语句查询数据库占用空间的比例:
USE RawData EXEC sys.sp_spaceused
然而无论我用什么办法,收缩数据库"RawData"都不起作用,收缩数据库操作完成后,数据库大小纹丝不动。。。
后来发现原来数据库如果已经损坏,是无法进行收缩的,具体检查方法如下:
对数据库运行DBCC CHECKDB命令,看是否有错误提示:
DBCC CHECKDB(N'RawData')
运行该命令后,检查到数据库"RawData"有如下错误提示:
Msg 8905, Level 16, State 1, Line 1
Extent (1:4312600) in database ID 100 is marked allocated in the GAM, but no SGAM or IAM has allocated it.
看来这就是数据库无法收缩的原因了。。。
修复数据库的方法大致分为三种:
1、快速修复
DBCC CHECKDB ('数据库名', REPAIR_FAST)
2、重建索引并修复
DBCC CHECKDB ('数据库名', REPAIR_REBUILD)
3、如果必要允许丢失数据修复
DBCC CHECKDB ('数据库名'', REPAIR_ALLOW_DATA_LOSS)
这三种修复,都要求数据库处于单用户模式下,而根据网上的资料,本文出现的数据库错误比较严重。。。只能用第三种方式进行修复,也就是会造成部分数据丢失,该错误更好的解决办法是使用以前的备份文件还原数据库,但是我们的开发环境没有做数据库定时备份,所以只能进行第三种修复。。。
执行如下SQL语句修复数据库"RawData":
ALTER DATABASE RawData SET SINGLE_USER WITH ROLLBACK IMMEDIATE DBCC CHECKDB(N'RawData', REPAIR_ALLOW_DATA_LOSS) ALTER DATABASE RawData SET MULTI_USER WITH ROLLBACK IMMEDIATE
修复语句执行完毕后,再使用DBCC CHECKDB命令检查数据库是否还有错误:
DBCC CHECKDB(N'RawData')
确认没有错误返回后,就可以使用常规的方法来成功收缩数据库了。