在Ubuntu上,SQL Server的日志文件主要分布在以下路径(具体路径可能因版本略有差异):
/var/opt/mssql/log/errorlog(记录SQL Server实例运行中的错误、警告及启动信息);journalctl命令查看(/var/log/journal/目录下,存储系统级服务日志);/var/opt/mssql/log/output.log(记录SQL Server服务的标准输出信息);/var/opt/mssql/data/),文件扩展名为.ldf(记录数据库修改的详细信息,用于恢复)。tail命令:实时查看日志最新内容(如错误日志):sudo tail -f /var/opt/mssql/log/errorlog # 实时滚动显示错误日志
sudo tail -n 100 /var/opt/mssql/log/errorlog # 查看最后100行错误日志
grep命令:过滤特定关键词(如“error”“failed”):sudo grep -i "error" /var/opt/mssql/log/errorlog # 筛选错误日志中的错误信息
sudo grep -i "failed to start" /var/log/journal/$(ls /var/log/journal/)/* # 查找系统日志中SQL Server启动失败记录
cat命令:查看完整日志文件(适合小文件):sudo cat /var/opt/mssql/log/errorlog
journalctl命令:查看SQL Server系统级日志(需配合-u参数指定服务名):sudo journalctl -u mssql-server # 查看SQL Server服务所有日志
sudo journalctl -u mssql-server -b -1 # 查看上次启动的日志(-b -1表示前一次启动)
sudo journalctl -u mssql-server --since "2025-10-20 00:00:00" --until "2025-10-22 23:59:59" # 按时间范围筛选日志
sp_readerrorlog存储过程:读取SQL Server错误日志(无需直接访问文件):-- 查看当前错误日志(0表示当前,1表示第一个归档日志)
EXEC sp_readerrorlog 0;
-- 筛选包含“failed”的错误日志
EXEC sp_readerrorlog 0, 1, 'failed';
-- 使用sqlcmd命令行执行(需安装sqlcmd工具)
sudo -u mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -Q "EXEC sp_readerrorlog 0;"
用于查看事务日志的详细记录(如事务开始/结束、数据修改操作),需指定逻辑序列号(LSN)过滤:
-- 查看所有事务日志记录(谨慎使用,大数据量可能影响性能)
SELECT * FROM fn_dblog(NULL, NULL);
-- 筛选特定事务(如LSN范围)
SELECT [Current LSN], [Operation], [Transaction Name], [Begin Time], [End Time]
FROM fn_dblog(NULL, NULL)
WHERE [Current LSN] BETWEEN '00000010:00000010:0001' AND '00000010:00000020:0001';
捕获长时间阻塞、性能瓶颈等历史事件(需提前创建会话):
-- 创建扩展事件会话(监控阻塞事件)
CREATE EVENT SESSION BlockMonitor ON SERVER
ADD EVENT sqlserver.blocked_process_report(
ACTION(sqlserver.sql_text, sqlserver.session_id)
)
ADD TARGET package0.event_file(SET filename=N'/var/opt/mssql/data/BlockMonitor.xel');
-- 启动会话
ALTER EVENT SESSION BlockMonitor ON SERVER STATE = START;
-- 查看捕获的事件(需解析.xel文件,可通过SSMS或查询sys.fn_xe_file_target_read_file函数)
SELECT * FROM sys.fn_xe_file_target_read_file('/var/opt/mssql/data/BlockMonitor*.xel', NULL, NULL, NULL);
sudo apt-get install logwatch # 安装Logwatch
sudo logwatch --service mssql --output mail # 发送SQL Server日志报告到邮件
logrotate工具自动压缩、删除旧日志(避免磁盘空间耗尽),配置文件示例(/etc/logrotate.d/sqlserver):/var/opt/mssql/log/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 mssql mssql
sharedscripts
postrotate
systemctl restart mssql-server > /dev/null 2>&1 || true
endscript
}
-- 查看当前日志级别(0-16,数值越大越详细)
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'log level';
-- 设置日志级别(例如设置为3,记录错误和警告)
EXEC sp_configure 'log level', 3; RECONFIGURE;