SQL Server数据库损坏,会导致收缩数据库不起作用

我们开发环境的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')

确认没有错误返回后,就可以使用常规的方法来成功收缩数据库了。

猜你喜欢

转载自www.cnblogs.com/OpenCoder/p/12404074.html