CentOS 上 SQL Server 日志管理实用技巧
一 日志类型与定位
- 系统错误日志与启动信息:默认位于 /var/log/mssql/errorlog,可用命令查看:
- 查看实时与历史:journalctl -u mssql-server
- 查看文件内容:less /var/log/mssql/errorlog
- 数据库事务日志:每个数据库对应一个 .ldf 文件,路径记录在系统视图中:
- 查询日志文件路径与大小:SELECT name, physical_name AS transaction_log_file FROM sys.master_files WHERE type = 1
- SQL Server 错误日志轮转:执行 EXEC sp_cycle_errorlog; 可关闭当前错误日志并创建新日志文件,便于归档与清理。
二 事务日志容量与截断
- 容量监控:快速查看各库日志空间使用率
- 截断与备份策略:
- 完整/大容量日志模型:先执行日志备份以允许截断,再按需收缩
- 备份:BACKUP LOG [YourDB] TO DISK = ‘/var/backups/YourDB_Log_$(date +%F).trn’ WITH FORMAT;
- 收缩指定日志文件(按逻辑文件名):DBCC SHRINKFILE(‘YourDB_Log’, 10240); – 单位 MB
- 简单恢复模型:日志会在检查点自动截断,适合无需时间点恢复的场景
- 切换:ALTER DATABASE [YourDB] SET RECOVERY SIMPLE;
- 收缩后再改回完整并做一次全备:ALTER DATABASE [YourDB] SET RECOVERY FULL;
- 收缩前务必确认恢复目标与备份策略,避免影响 Point-in-Time Recovery 能力。
三 收缩失败与延迟截断排查
- 查看无法回收的原因:SELECT name, log_reuse_wait, log_reuse_wait_desc FROM sys.databases WHERE name = ‘YourDB’;
- 检查活跃事务与复制残留:
- 活跃事务:DBCC OPENTRAN(‘YourDB’);
- 复制相关:若发现复制/分发导致占用,可在确认无业务影响后按规范清理
- 检查虚拟日志文件(VLF)状态:DBCC LOGINFO(‘YourDB’);
- 状态说明:status=2 表示仍在使用中的日志段,需先完成备份/截断后才能释放空间
- 处理思路:先定位阻塞项(长事务、复制、镜像/AG、变更数据捕获等),完成相应处理后再执行 DBCC SHRINKFILE。
四 错误日志轮转与集中管理
- 错误日志轮转:
- SQL Server 错误日志:定期执行 EXEC sp_cycle_errorlog; 实现轮转归档
- SQL Server Agent 错误日志:使用 EXEC sp_cycle_agent_errorlog; 轮转代理日志
- 集中管理与分析:
- 将 /var/log/mssql/errorlog 与 journalctl 输出接入 rsyslog/syslog-ng,配合 ELK(Elasticsearch/Logstash/Kibana) 或 Loki+Grafana 做检索、可视化与告警
- 对错误日志做按日/按大小滚动与保留策略,避免磁盘被历史日志占满。
五 监控与维护清单
- 容量阈值与频率建议:
- 日志文件使用率告警阈值:≥ 80%
- 完整恢复模型下日志备份间隔:≤ 1 小时
- 异常增长速率告警:≥ 5 MB/秒
- 例行维护建议:
- 建立按库的日志备份作业(含保留与异地/多活副本),在 FULL/BULK_LOGGED 模型下严禁仅依赖自动增长
- 定期检查 VLF 数量与日志增长趋势,必要时执行日志备份后收缩并按需预分配(避免频繁自动增长)
- 对关键库设置监控告警与演练恢复流程,确保备份可用与 RPO/RTO 达标。