第一部分核心认知为什么不收缩不会让磁盘爆很多人担心不收缩日志磁盘迟早被撑爆。这是一个常见误区。事务日志.ldf有两个层面的空间必须分清对比项截断Truncate收缩Shrink触发方式BACKUP LOG或SIMPLE模式检查点DBCC SHRINKFILE作用对象日志文件内部空间VLF日志物理文件大小效果把不活动的VLF标记为可重用内部循环再用把物理文件从磁盘上真正缩小是否释放磁盘否文件大小不变是文件变小对业务影响安全是日常操作收缩过程会阻塞日志增长→ Error 9020使用频率日常、高频仅一次性非日常关键认知日志涨到 4GB 后只要定期 BACKUP LOG内部空间就在 4GB 里循环重用会停在 4GB不会涨成 8GB、16GB。你之前日志一直涨是因为 AG 辅助副本没同步log_reuse_wait AVAILABILITY_REPLICA导致截断不了不是不收缩的锅。反复 SHRINKFILE→autogrow→SHRINKFILE每涨一次就要对日志清零IFI 对日志无效既伤性能又浪费时间这才是问题。第二部分不收缩时磁盘空间的4件事管理法正确管理磁盘做好以下 4 件事即可缺一不可①一次性定容最重要用 ALTER DATABASE 把日志固定在合理稳态。这就是它长期占用的空间以后稳定不变。每触发一次 autogrow 才是真正额外吃磁盘定容后几乎不再涨。ALTER DATABASE [数据库名] MODIFY FILE (NAMEN数据库名日志逻辑名称, FILEGROWTH256MB);ALTER DATABASE [数据库名] MODIFY FILE (NAMEN数据库名日志逻辑名称, SIZE4GB);②定期BACKUP LOG截断每 15~30 分钟一次让日志内部空间循环重用文件大小稳定在定容值不再增长。BACKUP LOG [数据库名] TO DISKNE:\DbDataLogbackup\数据库名.trn WITH COMPRESSION, STATS5;③治理log_reuse_wait根因这才是日志异常暴涨的真正原因。根因不除收缩掉立刻又涨回来。常见值见下表log_reuse_wait_desc含义处理方法NOTHING无等待正常健康状态无需处理LOG_BACKUP等待日志备份建立定期 BACKUP LOG 作业AVAILABILITY_REPLICAAG辅助副本滞后修复副本同步你的情况ACTIVE_TRANSACTION有未完成的长事务找出并结束大事务REPLICATION事务复制未分发排查分发/日志读取代理DATABASE_MIRRORING镜像滞后排查镜像会话CHECKPOINT等待检查点少见排查检查点线程-- 查看每个库的日志重用等待原因应多数为 NOTHING 或 LOG_BACKUPSELECT name, recovery_model_desc, log_reuse_wait_descFROM sys.databases WHERE name LIKE N数据库名 ORDER BY log_reuse_wait_desc;④清理旧备份文件真正的磁盘大户定期删旧文件释放的磁盘比收缩日志多得多。建议备份放独立备份盘不与数据/日志盘共用第三部分什么时候才允许收缩安全流程只有一种场景值得收缩某次异常一次超大事务 / AG 长时间断开把日志撑得远超正常稳态根因解决后把文件收回到稳态大小。这是一次性操作不是日常。安全顺序务必按序执行尤其第 ④步-- ① 先确认 AG 辅助副本已同步log_send_queue / redo_queue 趋近 0-- ② 备份日志让活动日志截断BACKUP LOG [数据库名] TO DISKN...\数据库名.trn WITH COMPRESSION;-- ③ 收缩到稳态下限不要收到 0这里 1GBUSE [数据库名]; DBCC SHRINKFILE(N数据库日志逻辑名称, 1024);-- ④ 关键立刻定容回 4GB避免业务一来又触发几十秒 autogrowALTER DATABASE [数据库名] MODIFY FILE (NAMEN数据库名逻辑名称, SIZE4GB, FILEGROWTH256MB);注意第④步绝不能省。收缩完不立刻定容就又掉回收缩→增长的恶性循环。另若DBCC LOGINFO行数 1000说明VLF过多需在收缩后重建日志文件以提升性能。