Docker容器中Linux版SQL Server Standard的Agent无法触发定时调度任务
优先排查时区不匹配问题
这是容器环境部署最常见的触发失败原因:默认SQL Server容器使用UTC时区,你配置的调度规则按照本地时间设置,和容器内部时间存在时差导致调度不会按时触发。
验证方法:进入容器执行命令date确认容器内部时间和你设置的调度时间是否一致。
修复方法:启动容器时增加时区配置参数,示例如下:docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=你的密码" -e "TZ=Asia/Shanghai" -p 1433:1433 -d mcr.microsoft.com/mssql/server:版本号也可以直接挂载宿主机时区文件:添加参数
-v /etc/localtime:/etc/localtime:ro,修改后重启容器即可生效。确认作业及调度的启用状态
手动执行正常不代表调度规则已启用,可执行以下SQL语句确认状态:- 确认作业本身启用:
SELECT name, is_enabled FROM msdb.dbo.sysjobs WHERE name = '你的作业名称',返回值is_enabled为1代表已启用,为0则执行EXEC msdb.dbo.sp_update_job @job_name = '你的作业名称', @enabled = 1开启。 - 确认关联调度启用:
SELECT name, is_enabled FROM msdb.dbo.sysschedules WHERE schedule_id IN (SELECT schedule_id FROM msdb.dbo.sysjobschedules WHERE job_id = (SELECT job_id FROM msdb.dbo.sysjobs WHERE name = '你的作业名称')),返回值is_enabled为1代表已启用,为0则执行对应调度更新语句开启。
- 确认作业本身启用:
查看SQL Server Agent日志排查错误
作业活动监视器无记录时可直接查看Agent运行日志,进入容器执行命令cat /var/opt/mssql/log/sqlagent.out即可查看完整调度运行日志,定位权限、规则解析类错误。版本Bug修复
2017及早期版本的Linux版SQL Server存在已知的Agent调度失效Bug,执行SELECT @@VERSION确认版本,若为未打累积更新的旧版本,升级到对应大版本的最新累积更新即可解决。检查调度规则有效性
执行SQLSELECT * FROM msdb.dbo.sysschedules WHERE schedule_id IN (SELECT schedule_id FROM msdb.dbo.sysjobschedules WHERE job_id = (SELECT job_id FROM msdb.dbo.sysjobs WHERE name = '你的作业名称')),确认active_end_date未设置为已过去的日期,freq、freq_interval等频率参数符合你的调度预期。
内容的提问来源于stack exchange,提问作者Boximity

