在Ubuntu系统中,SQL Server的日志文件主要分布在以下路径,不同类型的日志对应不同的管理需求:
/var/opt/mssql/log/errorlog;/var/opt/mssql/data/[数据库名]_log.ldf;/var/opt/mssql/log/output.log;/var/opt/mssql/log/ssbagent.out(默认可能不存在,需开启代理日志)。journalctl是Ubuntu系统自带的日志管理工具,可查看SQL Server服务的整合日志(包括启动、停止、错误等)。常用命令:
sudo journalctl -u mssql-server;sudo journalctl -u mssql-server -b -1;sudo journalctl -u mssql-server -f。针对单独的日志文件(如错误日志),可使用tail -f实时查看新增内容:
sudo tail -f /var/opt/mssql/log/errorlog(按Ctrl+C停止)。
若需查找特定错误(如“timeout”),可结合grep命令过滤:
sudo grep -i "timeout" /var/opt/mssql/log/errorlog(-i表示忽略大小写)。
为防止日志文件无限增长占用磁盘空间,需使用logrotate工具设置自动轮转、压缩和删除规则。
SQL Server的日志轮转配置通常位于/etc/logrotate.d/mssql-server(若不存在,可手动创建)。
/var/opt/mssql/log/*.log {
daily # 每天轮转
rotate 30 # 保留30个旧日志
compress # 压缩旧日志(如.gz格式)
delaycompress # 延迟压缩(避免当天日志被压缩)
missingok # 若日志文件不存在,不报错
notifempty # 若日志为空,不轮转
create 640 mssql mssql # 创建新日志文件时设置权限和所有者
sharedscripts # 所有日志轮转完成后执行脚本
postrotate
systemctl reload mssql-server > /dev/null 2>&1 || true
endscript
}
若需立即应用配置,可执行:sudo logrotate -f /etc/logrotate.d/mssql-server。
事务日志的增长是SQL Server日志管理的重点,需结合恢复模型和备份策略控制其大小。
ALTER DATABASE [数据库名] SET RECOVERY SIMPLE;
ALTER DATABASE [数据库名] SET RECOVERY FULL;
在完整恢复模式下,需定期备份事务日志以释放空间:
-- 备份事务日志(备份后会自动截断)
BACKUP LOG [数据库名] TO DISK = '/var/opt/mssql/backup/数据库名_Log.bak';
若日志文件过大,可通过DBCC SHRINKFILE收缩(需先备份日志):
-- 查看日志文件逻辑名称
USE [数据库名];
GO
EXEC sp_helpfile;
-- 收缩日志文件(将日志文件缩小到1GB)
DBCC SHRINKFILE (数据库名_Log, 1024); -- 1024表示1GB
注意:频繁收缩日志会导致性能下降,建议仅在日志异常增长时使用。
Extended Events是SQL Server的高效监控工具,可捕获长时间阻塞、慢查询等事件。创建示例会话:
CREATE EVENT SESSION [SlowQueries] ON SERVER
ADD EVENT sqlserver.rpc_completed(
ACTION(sqlserver.sql_text)
WHERE ([duration] > 1000000)) -- 捕获执行时间超过1秒的查询
ADD TARGET package0.event_file(SET filename = '/var/opt/mssql/data/SlowQueries.xel');
GO
-- 启动会话
ALTER EVENT SESSION [SlowQueries] ON SERVER STATE = START;
sudo logwatch --service=mssql-server可查看SQL Server相关日志摘要;df -h命令定期检查磁盘空间,确保日志目录所在分区有足够容量;