SQL Server Agent 服务未启动或作业所有者权限不足、上下文错误是作业失败主因;MySQL Event Scheduler 未启用、时间语法错误或 DEFINER 权限缺失同样导致事件不执行。

SQL Server 用 SQL Server Agent,MySQL 用 Event Scheduler——别混用,也别试图用 WAITFOR 或应用层轮询替代。
SQL Server Agent 服务没启动,作业根本不会跑
这是最常卡住人的第一步。哪怕作业建得再完美,SQL Server Agent 服务处于“已停止”状态,所有计划都只是纸面约定。
- 在 Windows 服务管理器里找到
SQL Server Agent (MSSQLSERVER)(或带实例名的对应项),右键 → 启动 - 顺手把“启动类型”设为
自动,避免服务器重启后又失效 - 检查作业所有者账户:必须有
sysadmin角色,或至少被授予SQLAgentOperatorRole(在msdb库中) - 如果用 Windows 账户运行作业,该账户还得有“作为服务登录”权限(组策略 → 计算机配置 → Windows 设置 → 安全设置 → 本地策略 → 用户权利分配)
作业步骤里 EXEC 存储过程总报“找不到”,因为上下文错了
Agent 默认在 master 数据库上下文执行作业步骤,而你的存储过程大概率在业务库,不显式指定就直接失败。
- 最稳妥做法:在 SSMS 新建作业步骤时,手动从“数据库”下拉菜单里选中目标库(比如
YourDBName),而不是依赖USE语句 - 如果写 T-SQL 命令,必须用三段式名称:
EXEC [YourDBName].[dbo].[MyProc] - 别在作业步骤里写
sp_start_job去触发本作业——可能递归调用或死锁 - 存储过程有输出参数?Agent 不捕获也不显示,结果得靠日志表(
msdb.dbo.sysjobhistory)或邮件通知来确认
MySQL Event Scheduler 开了但 event 不执行,大概率是语法或权限问题
SHOW VARIABLES LIKE '%event_scheduler%' 返回 OFF,或者 SELECT @@event_scheduler 不是 ON,说明根本没生效。
- 临时开启:
SET GLOBAL event_scheduler = ON;永久生效需在my.cnf的[mysqld]段加event_scheduler = ON并重启 MySQL - 时间语法极严格:
EVERY 30 MINUTE(不是MINUTES),AT (CURDATE() + INTERVAL 2 HOUR)必须搭配ON SCHEDULE EVERY 1 DAY才能重复 - 跨库调用存储过程必须写全名:
CALL mydb.proc_clean(),USE mydb;在 event 里完全无效 -
DEFINER用户被删、或权限不足时,event 会静默失败——查mysql.event表的last_error字段才能发现
两个平台的核心差异藏在细节里:SQL Server Agent 是服务级守护进程,依赖 Windows 权限模型;MySQL Event Scheduler 是数据库内建机制,但对 SQL SECURITY 和上下文切换极其敏感。漏掉任意一个权限、单位、分号或数据库前缀,任务就停在原地,还不会报错给你看。

















