在Ubuntu上运行的SQL Server,其主要日志类型及默认存储路径如下:
/var/opt/mssql/log/errorlog。.ldf,路径由数据库创建时指定(可通过ALTER DATABASE修改)。syslog、journalctl)会记录SQL Server服务的启动、停止及系统级错误。使用cat、tail或less命令直接读取错误日志文件:
sudo cat /var/opt/mssql/log/errorlog # 查看完整错误日志
sudo tail -f /var/opt/mssql/log/errorlog # 实时跟踪最新错误(按Ctrl+C退出)
也可通过sqlcmd工具查询错误日志内容:
sqlcmd -S localhost -U SA -Q "EXEC xp_readerrorlog 0, 1, N''" # 读取当前错误日志
在完整恢复模式下,可使用以下T-SQL命令查看或导出事务日志:
-- 查看事务日志内容(需sysadmin权限)
SELECT * FROM sys.fn_dblog(NULL, NULL);
-- 导出事务日志到文件(如导出前100条记录)
EXEC xp_cmdshell 'bcp "SELECT TOP 100 * FROM YourDB.sys.fn_dblog(NULL, NULL)" queryout /var/opt/mssql/backup/log_export.txt -c -T';
注意:
xp_cmdshell需谨慎启用,可能带来安全风险。
logrotate是Ubuntu系统自带的日志管理工具,可自动轮转、压缩、删除旧日志,防止日志文件过大占用磁盘空间。
/etc/logrotate.d/mssql文件(若不存在则创建),添加以下内容:/var/opt/mssql/log/errorlog {
daily # 每天轮转
rotate 7 # 保留最近7个日志文件
compress # 压缩旧日志(如errorlog.1.gz)
delaycompress # 延迟压缩(避免压缩正在写入的日志)
missingok # 若日志文件不存在也不报错
notifempty # 若日志为空则不轮转
postrotate # 轮转后执行的命令(重启SQL Server服务以重新打开日志文件)
systemctl restart mssql-server > /dev/null 2>&1 || true
endscript
}
sudo logrotate -f /etc/logrotate.d/mssql # 强制立即轮转
rsyslog可将SQL Server日志发送到远程日志服务器或本地集中存储,便于统一管理。
sudo apt-get install rsyslog -y
sudo systemctl enable --now rsyslog
/etc/rsyslog.conf,添加以下内容将SQL Server日志转发到远程服务器(IP:192.168.1.100):local0.* @192.168.1.100:514 # UDP转发(端口514)
# 或使用TCP(更可靠)
# local0.* @@192.168.1.100:514
重启rsyslog服务使配置生效:sudo systemctl restart rsyslog
journalctl是Ubuntu系统日志管理工具,可查询SQL Server服务的系统日志:
# 查看SQL Server服务的所有日志
journalctl -u mssql-server --no-pager
# 查看最近10条错误日志
journalctl -u mssql-server -p err -n 10
# 按时间范围查询(如2025-10-25 10:00至12:00)
journalctl -u mssql-server --since "2025-10-25 10:00" --until "2025-10-25 12:00"
事务日志会不断增长,需通过备份+截断释放空间:
-- 1. 备份事务日志(备份后会自动截断)
BACKUP LOG YourDBName TO DISK = '/var/opt/mssql/backup/YourDB_Log.bak';
-- 2. 手动截断日志(若备份后仍未截断)
DBCC SHRINKFILE (YourDB_Log, 100); -- 将日志文件缩小到100MB
注意:简单恢复模式下,事务日志会在检查点后自动截断,无需手动备份。
若日志文件过大,可使用DBCC SHRINKFILE命令收缩:
-- 查看日志文件的逻辑名称(需替换为实际的逻辑名称)
SELECT name, type_desc, size FROM sys.database_files WHERE type_desc = 'LOG';
-- 收缩日志文件(如将YourDB_Log缩小到50MB)
DBCC SHRINKFILE (YourDB_Log, 50);
警告:频繁收缩日志文件会导致碎片化,影响性能,建议仅在日志文件异常增长时使用。
使用cron定时任务自动执行日志备份:
# 编辑cron任务
crontab -e
添加以下内容(每天凌晨2点备份日志):
0 2 * * * /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -Q "BACKUP LOG YourDBName TO DISK = '/var/opt/mssql/backup/YourDB_Log_$(date +\%F).bak'"
SQL Server代理可自动执行日志备份、收缩等任务,需先启用:
sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true
sudo systemctl restart mssql-server
然后通过SSMS或T-SQL创建维护计划,定时执行日志备份任务。
journalctl或sqlcmd定期检查日志文件大小,及时处理异常增长。chmod 600 /var/opt/mssql/log/errorlog)。