案例描述:
今天遇到一个很有意思的sql server作业报错告警,作业出错的详细信息如下:
date 2021/6/23 12:34:00
log job history (yoursqldba_blockingsql_alert)
step id
server xxxxx
job name yoursqldba_blockingsql_alert
step name
duration 00:00:06
sql severity 0
sql message id 0
operator emailed
operator net sent
operator paged
retries attempted 0
message
the job failed. unable to determine if the owner (xxx\xx) of job yoursqldba_blockingsql_alert has server access (reason: could not obtain information about windows nt group/user 'xxx\xxxx', error code 0x251e. [sqlstate 42000] (error 15404)).
案例分析:
关于错误代码0x251e, 这个代表bad dns packet.(dns_error_bad_packet)
其实这个案例是这样的:因为一个dc服务器宕机了,sql server作业(job)的owner是一个域账号(nt账号),在作业运行时会验证权限,由于dc服务器挂了,无法访问dc获取相关信息、验证权限时报错。如果这里的作业owner为sa的话,就不会遇到这个错误。所以我一直推荐将作业的owner设置sa,避免这样的麻烦。那么这台sql server数据库成了一个特例,因为我一直用域账号(nt账号)管理数据库,sa账号默认是禁用的。所以有时候创建作业的时候不可避免忘记了修改作业的owner。
其实不光dc服务器宕机,当域账号被锁时也会有这样的错误。之前我在博客“could not obtain information about windows nt group/user ‘xxxx\xxxx’, error code 0x5”里面就介绍过这样的案例,如果作业的owner是一个域账号的话,如果域账号被锁的话,那么作业也会报错。域账号被锁时,对应的错误代码为0x5,表示访问拒绝(error_access_denied)。
解决方法比较简单,修改作业的owner为sa即可。可以使用下面脚本批量生成操作脚本。当然问题的根源还是域服务器dc宕机了。
--==================================================================================================================
-- scriptname : change_jobs_owner.sql
-- author : 潇湘隐者
-- createdate : 2015-12-18
-- description : 将数据库作业的owner改为sa或某个账号
-- note : azure sql不支持.
/******************************************************************************************************************
parameters : 参数说明
********************************************************************************************************************
@login_name : 作业的owner,例如sa
********************************************************************************************************************
modified date modified user version modified reason
********************************************************************************************************************
2015-12-18 kerry v01.00.00 新建该脚本。
*******************************************************************************************************************/
--==================================================================================================================
declare @login_name nvarchar(32);
set @login_name='sa';
select 'exec msdb.dbo.sp_update_job @job_name=n''' +j.name + ''', @owner_login_name=n''' + rtrim(ltrim(@login_name)) + ''';' as commadtext
from msdb.dbo.sysjobs j
inner join msdb.dbo.syscategories c on j.category_id = c.category_id
inner join sys.syslogins l on l.sid = j.owner_sid
where l.name !='sa'
order by j.name;