SQL Server日志文件ldf过大
SQL Server日志文件ldf过大
SQL Server 刚开始压测没多久,客户那边说磁盘空间掉得很快。
上去一看,.ldf 比 .mdf 还大。这个时候不能直接删 ldf,也不要上来就 shrink。
SQL Server 的 ldf 是事务日志,不是普通日志文件。
先看日志空间
1 | DBCC SQLPERF(LOGSPACE); |
也可以查数据库文件:
1 | SELECT |
看恢复模式
1 | SELECT name, recovery_model_desc |
如果是 FULL 恢复模式,但一直没有做日志备份,日志就不会按预期截断,文件会一直涨。
正确做日志备份
1 | BACKUP LOG zentao |
做完以后再看:
1 | DBCC SQLPERF(LOGSPACE); |
注意,日志备份通常会释放可复用空间,但物理 ldf 文件大小不一定马上变小。
临时收缩
如果磁盘已经很紧,可以在日志备份后临时收缩一次。
先查逻辑文件名:
1 | SELECT name, type_desc |
然后:
1 | USE zentao; |
这里 2048 是 MB。
这个只是临时处理,不要把 shrink 当定时任务天天跑。天天 shrink,后面业务写入又增长,来回折腾更差。
看有没有大事务
有时候做了日志备份也不释放,可能有长事务。
1 | DBCC OPENTRAN('zentao'); |
看当前请求:
1 | SELECT |
备份策略
当时先按这个思路:
1 | 每天凌晨完整备份 |
SQL Server Agent 作业可以做,Linux 上也可以用 shell + sqlcmd + cron。客户环境里最后看他们运维习惯。
用 sqlcmd 执行备份脚本示例:
1 | /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U sa -P '******' -Q "BACKUP LOG zentao TO DISK = N'/data/backup/zentao_log_$(date +%Y%m%d_%H%M).trn' WITH INIT, COMPRESSION, CHECKSUM" |
记一下
- ldf 不是普通日志,不能删。
- FULL 模式下要做日志备份。
- shrink 只能当临时处理,不是长期方案。
- 大事务会影响日志截断。
- 备份策略一定要配恢复演练,不然只有备份没有意义。
参考
- 事务日志备份:https://learn.microsoft.com/en-us/sql/relational-databases/backup-restore/transaction-log-backups-sql-server
- DBCC SQLPERF:https://learn.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-sqlperf-transact-sql
- DBCC SHRINKFILE:https://learn.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-shrinkfile-transact-sql
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无尽infinite!

