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')
确认没有错误返回后,就可以使用常规的方法来成功收缩数据库了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2019-03-03 C#中,使用显式类型转换(int)和Math.Round方法,将浮点数转换为整数的区别