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

案例描述:

 

今天遇到一个很有意思的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;
(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐