数据库服务器C盘满了,核心解决办法是:先定位占用空间的“元凶”,再分优先级清理日志和临时文件,最后为数据库文件规划新的存储路径。
数据库服务器c盘满了怎么清理:先搞清楚空间被谁吃掉了
接到“数据库服务器C盘满了”的告警,很多人的第一反应是直接删文件。千万别急着动手,数据库服务器和普通办公电脑不一样,乱删文件可能导致数据库宕机、数据丢失,正确的第一步,是像查案一样,先锁定空间占用大户。
C盘空间被耗尽,通常离不开这几个角色:
- SQL Server数据库文件,包括.mdf数据文件和.ldf日志文件。如果安装时选了默认路径,它们大概率在C盘的“Program Files\Microsoft SQL Server\”目录下。
- 系统自身文件。包括Windows更新留下的补丁缓存、休眠文件hiberfil.sys、虚拟内存页面文件pagefile.sys。
- 各类日志的不断累积。SQL Server的错误日志、维护计划产生的备份文件如果策略不当,常年累月能攒出几百GB。
- 临时数据库tempdb。这个数据库会随着业务运行不断膨胀,重启SQL Server服务后它会重置,但运行期间可能占掉大量空间。
行业共识认为,数据库服务器的C盘通常只建议安装操作系统和数据库程序本体,数据文件与日志文件应当默认存放在独立的数据盘,如果你的服务器只挂了一块C盘,那清理起来就得走另一套流程了。
常规清理三板斧:Windows服务器c盘空间不足的应急处理
如果只是临时救急,先把这几项做了,通常能腾出10%-30%的空间出来。
清理Windows临时文件和更新缓存
- 打开“此电脑”,右键C盘,点击“属性”,然后点击“磁盘清理”,系统会开始扫描可以清理的文件。
- 扫描完成后,点击左下角的“清理系统文件”按钮,这一步能清掉Windows更新留下的旧版本文件,这部分往往占空间较大。
- 在列表中勾选“Windows更新清理”“临时文件”“缩略图”等选项,点击确定,系统会自动开始清理。
处理休眠文件和虚拟内存
很多数据库服务器在安装时默认开启了休眠功能,休眠文件hiberfil.sys的容量约占物理内存的75%左右,如果服务器拥有64GB内存,这个文件就占了近48GB。
- 以管理员身份打开命令提示符CMD,输入以下命令并回车,立即释放休眠文件空间。
powercfg /h off
- 虚拟内存pagefile.sys如果设置为系统管理,通常占C盘4GB到12GB不等,右键“此电脑”选择“属性”,进入“高级系统设置”,在“性能”区域点击“设置”,切到“高级”选项卡,在“虚拟内存”区域点击“更改”,将C盘设置为无分页文件,并改到其他数据盘上。
查出大文件却不敢轻易动?
用系统自带的存储感知能看个大概,但要想定位具体是哪个目录下藏着大文件,建议用第三方的磁盘空间分析工具,比如SpaceSniffer或WizTree,它们扫描速度快,能直观看到哪个文件夹是红色大块,但请记住,扫出来的文件别乱删,如果是SQL Server正在使用的.mdf或.ldf文件,强行删除会导致数据库直接报错挂起。
核心手术:SQL Server日志文件太大怎么清理
对于大部分管理员来说,C盘被塞爆的罪魁祸首,往往是数据库日志文件,也就是.ldf文件,尤其是数据库恢复模式被设置为“完整”时,如果日志备份策略没配好,日志文件会不停地膨胀,直到充满整个磁盘。
先查清楚日志占用情况
打开SQL Server Management Studio,点击“新建查询”,输入以下指令,查看所有数据库的日志文件大小和已用空间。
DBCC SQLPERF(LOGSPACE);
执行后,看“Log Size (MB)”列,比如日志文件总大小有200GB,“Log Space Used (%)”只有5%,说明日志里存了大量未备份的活动日志。
通过日志备份收缩日志
这是正规做法,不会破坏日志链,能保证数据库的可恢复性,流程分两步走。
- 对数据库做一次日志备份,先释放日志中的非活动部分。
- 右键数据库选择“任务”->“收缩”->“文件”,文件类型选择“日志”,收缩操作选择“在释放未使用的空间前重新组织页数”,把目标文件大小设定一个合理值,比如1024MB。
紧急情况下截断日志的土办法
如果C盘空间已经完全撑爆,连日志备份都执行不了,只能用简单恢复模式先顶一下。
ALTER DATABASE 数据库名 SET RECOVERY SIMPLE;
DBCC SHRINKFILE (日志逻辑文件名, 500);
ALTER DATABASE 数据库名 SET RECOVERY FULL;
注意,执行这个操作会打断日志链,意味着数据库将不能做基于时间点的即时恢复,做完这一步,需要立刻做一次全量备份来重建日志链,这种方法比较适合业务允许短时间丢数据、或即将进行大版本升级的服务器。
治本之策:将数据库文件迁移到非系统盘
清理日志只是治标,如果C盘剩余空间本身就小于50GB,那么在业务规模面前,空间迟早会被再次吃满。把数据库物理文件挪到D盘或E盘的独立数据盘,才是真正的一劳永逸。
利用SQL标准流程迁移数据库文件
以迁移名为“OrderDB”的数据库为例。
- 在SSMS中右键“OrderDB”数据库,选择“属性”,在“文件”页记录下.mdf和.ldf文件的逻辑名称和物理路径。
- 执行以下SQL命令,把数据库设为离线状态。
ALTER DATABASE OrderDB SET OFFLINE;
- 在Windows资源管理器里,手动剪切对应的.mdf和.ldf文件,粘贴到D盘的新目录,D:\SQLData\”。
- 执行以下命令,修改数据库的物理文件路径映射。
ALTER DATABASE OrderDB MODIFY FILE (NAME = OrderDB, FILENAME = 'D:\SQLData\OrderDB.mdf');
ALTER DATABASE OrderDB MODIFY FILE (NAME = OrderDB_log, FILENAME = 'D:\SQLData\OrderDB_log.ldf');
执行以下命令,把数据库重新上线。
ALTER DATABASE OrderDB SET ONLINE;
执行成功后,整个数据库依然属于实例托管状态,连接字符串完全不用改,业务感知不到任何变化。
重建数据库路径的代价评估
这套操作需要数据库离线数分钟,如果业务要求不允许停机,用分离数据库和附加数据库的方式也能做,但风险更高,一旦附加失败,数据库可能处于恢复中状态,相较而言,离线加改路径稳妥得多,部分提供数据库服务器磁盘空间告警巡检服务的企业,也常会建议采用此方案。
日常运维:别等C盘报警了才开始挪地方
给tempdb瘦身并换位置
tempdb是SQL Server的临时工作台,每次实例重启都会重新创建,它如果出现在C盘,重启实例就能清理,但在重启前,它可能因为某个奇葩查询瞬间涨到几十GB,最佳实践是,将tempdb的数据文件和日志文件在创建时就设到D盘,同时启用多个同大小的数据文件来降低分配竞争,操作路径:SSMS中右键服务器->“属性”->“数据库设置”,在“数据与日志”区域修改默认位置,并在tempdb属性里添加新路径、删除旧路径。
建立维护计划自动收缩
很多管理员问 “数据库服务器c盘满了怎么清理”时都忽略了一个问题:备份文件本身,如果日常用完整备份+日志备份,而备份设备路径默认指向了C盘,那即使数据库文件挪走了,C盘依然会被备份文件塞满。
务必把备份文件路径指定到其他数据盘,并配置类似下面的维护计划:
- 每日凌晨1点执行一次完整备份。
- 每30分钟执行一次日志备份。
- 保留最近3天的完整备份和最近2天的日志备份,其余自动删除。
- 将备份文件的扩展名设为.bak,方便第三方工具识别。
定期的索引维护与收缩时机
数据库文件碎片化严重时,数据文件本身也会占用比实际数据大得多的空间,但频繁执行DBCC SHRINKDATABASE会极大增加索引碎片,影响查询性能,业内专家指出,合理的做法是先重建索引,再收缩文件,最后再重建一次索引来恢复性能,这是一个开销较大的操作,建议放在业务低峰期执行。
关于送上门来的大额空间
数据库服务器日常会生成大量Windows事件日志和SQL Server错误日志,这部分空间虽然单次不大,但在高并发业务下累积速度惊人,在“事件查看器”里,将“应用程序”和“系统”日志的大小上限调低,并设置为“按需覆盖事件”,能防止日志文件无上限占用。
如果服务器上安装了SQL Server的全文索引或Analysis Services组件,这些服务在C盘也有不少临时空间需求,用不到的组件建议直接在“控制面板”卸载,能省出不少空间。
数据库服务器C盘告警应急清理与后续预防的相关问题
强制删除数据库日志文件遇到“文件正在被使用”怎么办?
简而言之,文件被数据库实例锁定,必须先解除锁定,可以参考上文迁移流程,先将对应数据库执行ALTER DATABASE 数据库名 SET OFFLINE确认为离线状态,然后再尝试删除或移动文件,执行完成后须重新将数据库设为ONLINE,注意,如果该数据库正处于单用户模式或正处于事务复制发布端,此操作可能会失败,需先停掉相关代理作业或发布订阅关系。
为什么清理完空间后,C盘可用空间变化不大?
常见原因有三:一是休眠文件hiberfil.sys被重建,因为系统更新后可能又触发了休眠;二是虚拟内存页面文件pagefile.sys自动扩展回原大小;三是存在某个服务持续写入大文件,比如SQL Server的默认跟踪文件,请用WizTree在清理前后各扫描一次,对比差异文件夹,找出不断增长的那个文件,也有较大概率是SQL Server的错误日志文件ERRORLOG增长过快,多次重启服务后会产生多个ERRORLOG文件,删除较老的版本一般不影响当前实例。
直接删除.ldf文件后数据库变成“可疑”状态,该怎么办?
这不是C盘满了本身导致的,而是误操作导致的,如果数据库因此变成“可疑”状态,不要重启SQL Server服务,应立刻以管理员身份打开CMD,进入SQL Server的Binn目录,运行sqlservr.exe -f单用户模式启动实例,或者直接重建一个日志文件来让数据库恢复上线,但单纯删除日志所丢失的已提交事务可能无法恢复,这种情况下,建议立即联系专业的数据库运维团队处理,自行反复尝试可能造成二次损坏,当前数据库服务的恢复优先级,应高于C盘空间清理的诉求。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/785792.html


