你的位置:首页 > 数据库

[数据库]SQL Server代理(5/12):理解SQL代理错误日志


SQL Server代理是所有实时数据库的核心。代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的。这系列文章会通俗介绍它的很多用法。


如我们在这个系列的前几篇文章所见,SQL Server代理是由一系列的作业步骤组成,每个步骤是不同类型将要进行的工作。如果你在第4篇所见,SQL Server代理也提供使用数据库邮件发送提醒的能力。如果出现问题,不管怎样, 你必须去查看下数据库邮件错误日志。在这篇文章里,你会学到如何理解和查看SQL Server错误日志的所有相关知识。你会查看最常见的错误日志,还有理解如何知道当一条信息需要你采取的行动,什么是对你最直接的信息。一旦你理解了错误日志,当你进行SQL Server代理相关故障排除时,你会节约大量的时间。

SQL Server代理错误日志

SQL Server代理维护它自己的错误日志,和SQL Server错误日志分开。SQL Server错误日志位置SQL Server所在目录下的\MSSQL\Log目录(C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log,这篇文章使用SQL Server 2008R2作为默认实例)。SQL Server错误日志默认名为ERRORLOG(没有文件扩展名),SQL Server代理错误日志默认名为SQLAGENTOUT。在这篇文章里,我们的大部分时间会花在SQL代理错误日志,不管怎样,你也需要看下SQL Server错误日志。

查看SQL Server代理错误日志

当你首次浏览到\MSSQL目录,并尝试查看日志目录,很可能你需要请求提升你的权限来获得访问这个目录的权限。默认情况下,SQL Server和SQL Server代理的服务账号有这个目录的读写权限,但你(使用用户账号)不能访问。如果你是本地管理员,你可以授权自己访问后,直接查看日志文件。如图1所示,默认的权限和安全设置是这样的。不要从目录里移除你服务账号的权限,否则SQL Server和SQL Server代理会不能正常工作。

插图1:SQL Server的Log目录权限

一旦你在\MSSQL\LOG目录里,对于SQL Server和SQL Server代理,你都会看到很多日志文件,原先的日志文件(只要正常启动服务,每次都会创建)也在目录里。SQLAGENT.OUT文件是SQL Server代理的当前日志文件,因此这是你要打开的文件。默认情况下,当你尝试打开这个文件时,你需要选择打开这个后缀为.OUT文件的默认程序。记事本就可以,当你有另一个喜好,你可以选择这个扩展文件名的文本查看器(如图2所示,选择记事本)。

插图2:.OUT文件用记事本打开。

一旦选择后,SQLAGENT.OUT文件会打开,如插图3所示。

插图3:SQL Server代理错误日志(SQLAGENT.OUT)

你很容易发现,应该有更好的方式查看错误日志,没错!SSMS有日志文件查看器,这在第4篇数据库邮件里就已经简单介绍了。切换到错误日志,展开SQL Server代理文件夹,错误日志文件夹,你会看到当前SQL Server代理的日志还有最近的日志。双击【当前】(或右击选择【查看代理日志】)你会看到SQL Server日志查看器,在查看器里当前SQL Server代理的错误日志已被勾选(如插图4所示)。

插图4:当前SQL Server代理日志文件的日志文件查看器

这和在插图3里显示的日志文件一样,但看起来更直观,更好管理。首先你会注意到的是现在事件分为:信息,警告和错误。使用筛选按钮(如插图5),你可以增加自己的筛选条件来限制SQL Server代理错误日志的项目(或SQL Server的任何错误日志,你已经看到,在日志文件查看器里,你可以看到所有的日志)

插图5:日志文件查看器的筛选设置

日志文件内容

在SQL Server代理日志的开始就有信息消息。我们每步都过一遍,简单介绍下消息的意思。

[393] 正在等待 SQL Server 恢复数据库...

SQL Server代理服务已经启动,但还不能配置和运行它,因为msdb数据库还不可用。SQL Server代理的大部分配置和设置都保存在msdb。部分配置细信息保存在系统注册表里。SQL Server不能启动直到msdb数据库恢复。消息前的数字(393)是SQL Sever代理的内部信息号,本人从没见过公开文档记录SQL Agent的错误编号。

[100] Microsoft SQLServerAgent 版本 10.50.1600.1 (内部版本号 x86 unicode 零售): 进程 ID 3412

这是一条非常有用的信息。SQL Server代理版本号(即版本、服务包、和修补程序)。在此例中,它是SQL Server 2008 R2,采用sp1更新包。你可以在SQLServerCentral找到版本号。
接下来的事情是,这是一个SQL Server x86版本(即32位),这是一个标准的零售版本的产品。最后,对SQL Server代理服务的Windows进程ID标识。如果你使用Windows故障排除工具(即使是简单的任务管理器),你会看到一个进程ID,这将帮助你把SQL Server代理服务关联到Windows信息。

插图6:有PID列显示的任务管理器

[101] SQL Server PC201510181429 版本 10.50.1600 (连接限制: 0)

这一消息标识SQL服务器的名称(PC201510181429),以及SQL Server的版本号。注意“0连接限制”--即是没有特定的配置,因此允许无限的连接(直到耗尽内存)。

[102] SQL Server ODBC 驱动程序版本 10.50.1600
[103] 驱动程序使用的 NetLib 是 DBNETLIB.DLL;本地主机服务器是

这两则消息表明使用ODBC的版本号(SQL Server代理使用ODBC连接回SQL服务器本地副本,事实上,它是用当地的DBNETLIB.DLL为连接。

[310] 检测到 2 个处理器和 3327 MB RAM
[339] 本地计算机是 PC201510181429,运行的是 Windows NT 6.1 (7601) Service Pack 1

接下来的两行显示的SQL服务器CPU和内存配置,以及Windows版本。

[432] 子系统缓存中有 12 个子系统

这是第二篇(SQL Server代理作业步骤和子系统)讨论过的SQL Server代理子系统。作业下有各种类型可以运行子系统(如CmdExec、ActiveX 脚本)以及一些支持复制,分析服务的子系统,你可以在msdb.dbo.syssubsystems表中查看子系统清单。

[364] 尚未启动 Messenger 服务 - 将不发送 NetSend 通知

虽然这个归类为一个错误,在大部分系统上你可以安全地忽略。Net send通知,已经从SQL Server的几个版本中取消,并且相关的Windows服务默认不是开启的。如果你还在使用Net send消息,看到了这样的错误,你需要更改Windows Messenger服务为自动启动。

[129] SQLSERVERAGENT 在 Windows NT 服务控制下启动

这个消息表明,SQL Server代理作为服务启动,而不是在命令提示符窗口。

[260] 无法启动邮件会话(原因: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException: 无法从数据库中读取邮件配置信息。......

[355] 邮件系统初始化失败;请检查配置设置

这些消息表明在数据库邮件配置中出错。回顾第四篇数据库邮件,查看是否有类似的问题。

[396] 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用

这条警告表明一个SQL Server代理设置没有配置,可能阻止某些作业运行。你可以设置作业在CPU“空闲”时运行(在第一篇提到过)。然而,在这个系统中空闲的定义还没有被 设置。在SSMS配置此选项,右击SQL Server代理,选择属性,然后单击高级选项卡。配置空闲CPU条件如插图7所示

插图7:配置空闲CPU条件

你可以想象,在你的SQL Server代理错误日志还会有许多其他的错误,你应该定期检查日志。请牢记,代理日志不是用来排查作业故障的,你需要查看每个失败作业步骤的历史记录。我们在后续章节会做更多的故障排除。

配置SQL Server代理错误日志

您可以在SSMS中配置一些SQL Server代理错误日志的属性,另一些属性需要使用注册表编辑器(这是不支持的,所以不建议在生产系统)。
右击SSMS中SQL Server代理->错误日志,你会看到一组选项。首先是“配置”,选择该选项,你会看到类似图5.8。你可以更改SQL Server代理错误日志文件的存放位置(不推荐),同样可以更改代理日志级别。这些设置不能凭直观分辨–如果你勾选“错误”,你会看到错误和信息性消息。如果你勾选“警告”,你会看到警告和信息性消息。如果你只勾选信息,在错误日志中你看不到任何错误或警告消息。
对话框中另一选项是,写入OEM错误日志,意味着写一个非Unicode的错误日志文件。理论上你可以通过它节省空间,但也不推荐。

插图8——配置SQL Server代理

退出插图8,右击错误日志,另一个选项是“回收”。此选项会关闭现有的SQL Server代理错误日志并开始一个新的日志文件,重命名当前SQLAGENT.OUT文件为SQLAGENT.1(所有旧的文件后缀数字递增,如 SQLAGENT.1变成SQLAGENT.2)。如果你要将当前的日志文件发送给SQL Server产品支持,这样操作将非常有用。
SQL Server代理一些其他配置需在注册表中设置(事实上,上面所做操作的设置都会更改注册表中对应的键值)。记住不建议直接修改注册表,所以更改这些设置要你自己承担风险。然而,如果你想查看可用的设置(一些SQL Server代理设置只能在注册表中修改),你可以在注册表中SQL Server实例下查看可用的注册表键设置。例如,在我的机器上,注册表键位于HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\SQLServerAgent,如插图9所示

插图9:SQL Server代理的注册表项

如果你的SQL Server代理配置真的有问题时,可能需要描述(或导出)这些设置给产品支持。

下篇预告

SQL Server代理错误日志包含很多有用信息(SQL Server代理,SQL Server和Windows服务器)。你可以使用错误日志解决SQL Server代理服务中的错误,并了解日志中常见的信息。本文还介绍了如何解决SQL Server代理中一些最常见的错误。
有了前面的SQL Server代理基础知识,第六篇将深入挖掘SQL Server代理作业步骤和工作流。