在Ubuntu系统中,SQL Server的日志文件主要分布在以下路径,涵盖错误、事务、代理等多种类型:
/var/opt/mssql/log/errorlog。.ldf(如/var/opt/mssql/data/YourDB.ldf)。/var/opt/mssql/log/sqlagent.out。/var/opt/mssql/log/output.log。使用tail -f命令实时跟踪错误日志的最新内容,便于快速定位运行问题:
sudo tail -f /var/opt/mssql/log/errorlog
按Ctrl+C停止实时查看。
journalctl是Ubuntu系统自带的日志管理工具,可查询SQL Server服务的完整日志(包括启动、停止及错误信息):
# 查看SQL Server服务的所有日志
sudo journalctl -u mssql-server
# 查看上次启动的日志(-b -1表示上一次启动)
sudo journalctl -u mssql-server -b -1
# 按时间过滤日志(如查看2025-10-20的日志)
sudo journalctl -u mssql-server --since "2025-10-20" --until "2025-10-21"
若需分析某数据库的事务细节(如未提交的事务),可通过SQL命令查看(需在对应数据库上下文中执行):
-- 使用fn_dblog函数查看当前事务日志(需指定数据库)
USE [YourDBName];
SELECT * FROM fn_dblog(NULL, NULL);
-- 导出事务日志到文件(如导出到/home/user/log.txt)
EXEC xp_cmdshell 'bcp "SELECT * FROM YourDBName.dbo.fn_dblog(NULL, NULL)" queryout "/home/user/log.txt" -c -T';
logrotate可防止日志文件过大,自动执行轮转、压缩及删除操作。创建SQL Server专用配置文件/etc/logrotate.d/sqlserver:
sudo nano /etc/logrotate.d/sqlserver
添加以下内容(调整参数适配需求):
/var/opt/mssql/log/*.log {
daily # 每天轮转
rotate 7 # 保留最近7份
compress # 压缩旧日志(如.gz格式)
delaycompress # 延迟压缩(避免压缩当天日志)
missingok # 忽略缺失文件
notifempty # 空日志不轮转
create 640 mssql mssql # 创建新日志文件的权限及所有者
sharedscripts # 所有日志轮转完成后执行脚本
postrotate
systemctl restart mssql-server > /dev/null 2>&1 || true
endscript
}
手动触发轮转测试:
sudo logrotate -vf /etc/logrotate.d/sqlserver
rsyslog可将SQL Server日志发送到远程日志服务器或本地特定文件,实现集中化管理。编辑配置文件/etc/rsyslog.conf:
sudo nano /etc/rsyslog.conf
添加以下内容(将SQL Server日志发送到/var/log/sqlserver.log):
# 添加SQL Server日志输入规则
if $programname == 'mssql-server' then /var/log/sqlserver.log
& stop
重启rsyslog服务生效:
sudo systemctl restart rsyslog
恢复模型决定了事务日志的管理方式,需根据业务需求选择:
ALTER DATABASE [YourDBName] SET RECOVERY SIMPLE;
ALTER DATABASE [YourDBName] SET RECOVERY FULL;
BACKUP LOG [YourDBName] TO DISK = '/var/opt/mssql/backup/YourDBName_Log.bak';
-- 查看日志文件大小(需替换为实际逻辑名称)
DBCC SQLPERF(LOGSPACE);
-- 收缩日志文件(将YourDB_Log收缩至1GB)
DBCC SHRINKFILE (YourDB_Log, 1024); -- 1024表示1GB
通过SQL Server Agent定时执行日志备份、收缩等任务(需开启Agent服务):
-- 启动SQL Server Agent服务
sudo systemctl start mssql-server-agent
-- 创建维护计划(如每日23:00备份日志并收缩)
USE [msdb];
GO
EXEC msdb.dbo.sp_add_job
@job_name = 'Daily_Log_Backup_and_Shrink',
@enabled = 1,
@description = '每日备份事务日志并收缩文件';
-- 添加作业步骤(备份日志)
EXEC msdb.dbo.sp_add_jobstep
@job_name = 'Daily_Log_Backup_and_Shrink',
@step_name = 'Backup_Log',
@subsystem = 'TSQL',
@command = 'BACKUP LOG [YourDBName] TO DISK = ''/var/opt/mssql/backup/YourDBName_Log.bak'';',
@database_name = 'YourDBName';
-- 添加作业步骤(收缩日志)
EXEC msdb.dbo.sp_add_jobstep
@job_name = 'Daily_Log_Backup_and_Shrink',
@step_name = 'Shrink_Log',
@subsystem = 'TSQL',
@command = 'DBCC SHRINKFILE (YourDB_Log, 1024);',
@database_name = 'YourDBName';
-- 添加作业调度(每日23:00执行)
EXEC msdb.dbo.sp_add_schedule
@schedule_name = 'Nightly_Log_Task',
@freq_type = 4, -- 每日
@freq_interval = 1,
@active_start_time = 230000; -- 23:00:00
-- 关联作业与调度
EXEC msdb.dbo.sp_attach_schedule
@job_name = 'Daily_Log_Backup_and_Shrink',
@schedule_name = 'Nightly_Log_Task';
-- 启动作业
EXEC msdb.dbo.sp_start_job @job_name = 'Daily_Log_Backup_and_Shrink';
df -h命令查看磁盘使用情况)。640,仅所有者可写,组用户可读)。