欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL Server作业报“Unable to determine if the owner (xxx\xxx) of job xxx has server access”

程序员文章站 2022-03-16 20:16:10
案例描述: 今天遇到一个很有意思的SQL Server作业报错告警,作业出错的详细信息如下: Date 2021/6/23 12:34:00Log Job History (YourSQLDba_BlockingSQL_Alert)  ......

案例描述:

 

今天遇到一个很有意思的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;