娇兰美业 發表於 2025-11-12 10:04:34

SQL Server日志文件无法收缩的解决方法

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">前言</a></li><li><a href="#_label1">第一步,查询日志信息(可省略)</a></li><li><a href="#_label2">第二步,强制提交事务,并将 恢复模式 改为简单模式</a></li><li><a href="#_label3">第三步,开始收缩</a></li><li><a href="#_label4">第四步,恢复数据库的 完整恢复模式</a></li><li><a href="#_label5">SQL server数据库日志文件收缩方法</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>前言</h2>
<p>正常情况下,不要轻易的收缩日志文件,但是日积月累,日志文件太大,造成硬盘空间不足,不得已去收缩时,却发现收缩不了,那是因为在还原的完整模式下活动事务一直使用日志,所以无法收缩。<br />可以通过以下步骤:</p>
<p class="maodian"><a name="_label1"></a></p><h2>第一步,查询日志信息(可省略)</h2>
<div class="jb51code"><pre class="brush:sql;">SELECT
    name AS 日志文件逻辑名,--这个就是逻辑名,有的时候逻辑名和我们看到的文件名不一样
    physical_name AS 物理路径,
    size * 8.0 / 1024 AS 当前大小MB
FROM sys.database_files
WHERE type_desc = 'LOG';
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>第二步,强制提交事务,并将 恢复模式 改为简单模式</h2>
<div class="jb51code"><pre class="brush:sql;">-- 查看数据库中活跃的事务信息,用于检查是否有未提交的事务(可能阻止日志收缩)
-- 语法:DBCC OPENTRAN (数据库名称),会显示最早的活动事务、未分发的事务等信息
DBCC OPENTRAN (databaseName);


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


-- 将数据库恢复模式临时改为简单恢复模式(SIMPLE)
-- 简单模式下,事务日志会自动截断(在检查点后清除不再需要的日志记录),便于收缩日志文件
-- WITH NO_WAIT:表示如果无法立即执行(如存在锁定),不等待直接返回错误(避免长时间阻塞)
ALTER DATABASE databaseName SET RECOVERY SIMPLE WITH NO_WAIT;
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>第三步,开始收缩</h2>
<div class="jb51code"><pre class="brush:sql;">-- 收缩指定的数据库日志文件
-- 语法:DBCC SHRINKFILE (日志文件逻辑名, 目标大小, 收缩方式)
DBCC SHRINKFILE (
    N'database_log',-- 日志文件的逻辑名称(需与数据库中定义的一致,可通过sys.database_files查询)
    200,            -- 收缩后的目标大小(单位:MB)
    TRUNCATEONLY      -- 仅截断未使用的日志空间(不移动数据页,效率高,仅适用于日志文件)
);


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

</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>第四步,恢复数据库的 完整恢复模式</h2>
<div class="jb51code"><pre class="brush:sql;">-- 将数据库恢复模式改回完整恢复模式(FULL)
-- 完整模式下,日志会记录所有事务细节,支持时间点恢复(生产环境通常需要此模式)
-- WITH NO_WAIT:同上,不等待直接执行或返回错误
ALTER DATABASE databaseName SET RECOVERY FULL WITH NO_WAIT;
</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>SQL server数据库日志文件收缩方法</h2>
<p>1、首先打开数据库,选择需要收缩日志文件的数据库右键选择属性点击选项将恢复模式完整改为简单点击确定。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025111210023754.png" /></p>
<p>2、右击数据库选择收缩文件</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025111210023798.png" /></p>
<p>3、选择收缩日志,更改想要收缩到的大小点击确定</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025111210023750.png" /></p>
<p>4、收缩完成后将恢复模式改回完整</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025111210023735.png" /></p>
<p>此时数据库日志文件将收缩到规定大小</p>
<p>收缩命令:</p>
<div class="jb51code"><pre class="brush:sql;">-- 将数据库恢复模式更改为简单

ALTER DATABASE
SET RECOVERY SIMPLE;
GO
-- 收缩日志到1G
DBCC SHRINKFILE (N'ZhiDan_log', 1024);
GO
-- 将数据库恢复模式更改为完整
ALTER DATABASE
SET RECOVERY FULL;
GO</pre></div>
<p>以上就是SQL Server日志文件无法收缩的解决方法的详细内容,更多关于SQL Server日志文件无法收缩的资料请关注琼殿技术社区其它相关文章!</p>
頁: [1]
查看完整版本: SQL Server日志文件无法收缩的解决方法