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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM