SQL Server代理:理解SQL代理错误日志处理方法


Posted in SQL Server onJune 30, 2021

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代理会不能正常工作。

SQL Server代理:理解SQL代理错误日志处理方法

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

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

SQL Server代理:理解SQL代理错误日志处理方法

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

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

SQL Server代理:理解SQL代理错误日志处理方法

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

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

SQL Server代理:理解SQL代理错误日志处理方法

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

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

SQL Server代理:理解SQL代理错误日志处理方法

插图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信息。

SQL Server代理:理解SQL代理错误日志处理方法

插图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所示

SQL Server代理:理解SQL代理错误日志处理方法

插图7:配置空闲CPU条件

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

配置SQL Server代理错误日志

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

SQL Server代理:理解SQL代理错误日志处理方法

插图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所示

SQL Server代理:理解SQL代理错误日志处理方法

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

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

下篇预告

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

原文:http://www.sqlservercentral.com/articles/Stairway+Series/72456/

SQL Server 相关文章推荐
2021-4-3课程——SQL Server查询【2】
Apr 05 SQL Server
在 SQL 语句中处理 NULL 值的方法
Jun 07 SQL Server
sql字段解析器的实现示例
Jun 23 SQL Server
利用 SQL Server 过滤索引提高查询语句的性能分析
Jul 15 SQL Server
sql通过日期判断年龄函数的示例代码
Jul 16 SQL Server
SQLServer之常用函数总结详解
Aug 30 SQL Server
SQL SERVER实现连接与合并查询
Feb 24 SQL Server
SQL Server查询某个字段在哪些表中存在
Mar 03 SQL Server
SQL Server中使用表变量和临时表
May 20 SQL Server
SQL Server中的逻辑函数介绍
May 25 SQL Server
详解SQL报错盲注
Jul 23 SQL Server
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
SQLServer中JSON文档型数据的查询问题解决
sql字段解析器的实现示例
Jun 23 #SQL Server
解决sql server 数据库,sa用户被锁定的问题
在 SQL 语句中处理 NULL 值的方法
Jun 07 #SQL Server
You might like
PHP 动态随机生成验证码类代码
2010/04/09 PHP
php 获取全局变量的代码
2011/04/21 PHP
MySQL 日期时间函数常用总结
2012/06/12 PHP
set_exception_handler函数在ThinkPHP中的用法
2014/10/31 PHP
php实现获取文章内容第一张图片的方法
2014/11/04 PHP
php按单词截取字符串的方法
2015/04/07 PHP
微信公众号判断用户是否已关注php代码解析
2016/06/24 PHP
php实现数组纵向转横向并过滤重复值的方法分析
2017/05/29 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
js将long日期格式转换为标准日期格式实现思路
2013/04/07 Javascript
js实现遮罩层划出效果是生成div而不是显示
2014/07/29 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
原生js实现淘宝购物车功能
2020/06/23 Javascript
VUE 使用中踩过的坑
2018/02/08 Javascript
详解vue-cli下ESlint 配置说明
2018/09/03 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
vue获取form表单的值示例
2019/10/29 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
Vue3 实现双盒子定位Overlay的示例
2020/12/22 Vue.js
[01:14:41]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第一场 1月8日
2021/03/11 DOTA
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
Python编程中NotImplementedError的使用方法
2018/04/21 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
中国好声音华少广告词
2014/03/17 职场文书
人力资源管理求职信
2014/08/07 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
2015年保送生自荐信
2015/03/24 职场文书
新教师2015年度工作总结
2015/07/22 职场文书
总经理2015中秋节致辞
2015/07/29 职场文书
Python控制台输出俄罗斯方块移动和旋转功能
2021/04/18 Python
利用JavaScript写一个简单计算器
2021/11/27 Javascript