【SqlServer】日志文件无法收缩的解决方法

前言

正常情况下,不要轻易的收缩日志文件,但是日积月累,日志文件太大,造成硬盘空间不足,不得已去收缩时,却发现收缩不了,那是因为在还原的完整模式下活动事务一直使用日志,所以无法收缩。

可以通过以下步骤:

第一步,查询日志信息(可省略)

sql 复制代码
SELECT 
    name AS 日志文件逻辑名,  --这个就是逻辑名,有的时候逻辑名和我们看到的文件名不一样
    physical_name AS 物理路径,
    size * 8.0 / 1024 AS 当前大小MB
FROM sys.database_files 
WHERE type_desc = 'LOG';

第二步,强制提交事务,并将 恢复模式 改为 简单模式

sql 复制代码
-- 查看数据库中活跃的事务信息,用于检查是否有未提交的事务(可能阻止日志收缩)
-- 语法:DBCC OPENTRAN (数据库名称),会显示最早的活动事务、未分发的事务等信息
DBCC OPENTRAN (databaseName);  


-- 执行检查点操作,强制将内存中已提交的事务日志从缓存写入磁盘
-- 作用:减少日志文件中的活跃内容,为后续收缩做准备(确保已提交数据持久化)
CHECKPOINT;


-- 将数据库恢复模式临时改为简单恢复模式(SIMPLE)
-- 简单模式下,事务日志会自动截断(在检查点后清除不再需要的日志记录),便于收缩日志文件
-- WITH NO_WAIT:表示如果无法立即执行(如存在锁定),不等待直接返回错误(避免长时间阻塞)
ALTER DATABASE databaseName SET RECOVERY SIMPLE WITH NO_WAIT;

第三步 ,开始收缩

sql 复制代码
-- 收缩指定的数据库日志文件
-- 语法:DBCC SHRINKFILE (日志文件逻辑名, 目标大小, 收缩方式)
DBCC SHRINKFILE (
    N'database_log',  -- 日志文件的逻辑名称(需与数据库中定义的一致,可通过sys.database_files查询)
    200,              -- 收缩后的目标大小(单位:MB)
    TRUNCATEONLY      -- 仅截断未使用的日志空间(不移动数据页,效率高,仅适用于日志文件)
);


-- 收缩整个数据库的数据文件和日志文件(通常在收缩日志后补充,进一步释放空间)
-- 语法:DBCC SHRINKDATABASE (数据库名称),会尝试收缩所有文件至最小可能大小(受数据分布影响)
DBCC SHRINKDATABASE(N'数据库名称');  
GO  -- 批处理分隔符,分隔前后语句的执行批次

第四步 恢复数据库的 完整恢复模式

sql 复制代码
-- 将数据库恢复模式改回完整恢复模式(FULL)
-- 完整模式下,日志会记录所有事务细节,支持时间点恢复(生产环境通常需要此模式)
-- WITH NO_WAIT:同上,不等待直接执行或返回错误
ALTER DATABASE databaseName SET RECOVERY FULL WITH NO_WAIT;
相关推荐
flash俊杰1 小时前
v0.5-01 让桌面 AI 助手记得住:预算组装、递归摘要、长期记忆与评估基线
数据库·安全·架构
2501_933923251 小时前
redis:string类型常见命令
数据库·redis·缓存
byte轻骑兵2 小时前
时序数据库选型指南:Apache IoTDB 社区版实践与踩坑
数据库·人工智能·apache·时序数据库·iotdb
黄连木笛3 小时前
Redis Insight 汉化教程:Windows / macOS / Linux 设置中文界面(附繁體、教程汉化、关闭自动更新)
数据库·redis·缓存
nice_lcj5203 小时前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam
古典和浪漫4 小时前
MVCC机制
数据库
xixingzhe25 小时前
mysql全量、增量备份
数据库·mysql
AllData公司负责人12 小时前
AI大模型数据开发底座系列说明书,AllData集成Chat2DB开源项目建设AI 数据库分析底座,涵盖AI 洞察/对话SQL/智能视图!
数据库·人工智能·sql·开源·ai 洞察·对话sql
xixingzhe213 小时前
数据库备份的分类与特点
数据库
时间的拾荒人16 小时前
Redis 主从复制详解:配置实操 + 原理机制
数据库·redis·面试