有時候很難確定SQL SERVER的作業為什麼失敗,或者想更進一步確定作業運行到什麼地方才失敗。對於作業的每一個步驟,SQL SERVER會有相應的輸出信息,默認保存在作業歷史裡,最大1024個字符。假如輸出信息大於1024個字符,後邊的信息SQL SERVER將以“…”來表示,這就意味著無法看到完整的輸出信息。存儲更長的作業步驟輸出信息這時就很有必要。
從SQL SERVER 2005 開始,可以將作業輸出信息存儲到msdb.dbo.sysjobstepslogs系統表裡,即使超過1024字符也可以完整保存,這是因為保存輸出信息的字段數據類型為nvarchar(max)。默認情況下這種加強的作業輸出信息功能並沒有被開啟,需要為每個作業步驟手動開啟,這樣才能記錄下該作業步驟的完整輸出信息。
一 實驗演示
1.1 運行只包含一個步驟的作業,該步驟運行”dbcc checkdb”命令對一個數據庫進行檢查
作業歷史截圖:
作業歷史的輸出信息:
可以看到,作業歷史裡邊的輸出信息是不完整的。
1.2 為該步驟配置增強的記錄功能
1.3 配置完成後再運行一次該作業。
1.4 再查看作業歷史記錄,可以看到作業歷史記錄中的輸出信息仍不完整。
1.5 需要通過查看msdb.dbo.sysjobsteplogs表中的“log”字段才能看到該作業步驟的完整信息
運行TSQL腳本:
select a.name,c.log,b.step_name
from msdb.dbo.sysjobs a
join msdb.dbo.sysjobsteps b
on a.job_id=b.job_id
join msdb.dbo.sysjobstepslogs c
on b.step_uid=c.step_uid
where a.name='check1db' ----作業名
1.6 將”log”字段輸出內容復制出來,就可以看到該作業步驟的完整輸出信息
作業“check1db”: 步驟 1,“checkdb”: 開始執行 2016-06-29 11:40:41
消息 8992,嚴重性 16,狀態 1,第 1 行: 請檢查目錄消息 3851,狀態 1: 在系統表 sys.syssingleobjrefs (class=60) 中發現無效的行(class=60,depid=1,depsubid=0)。 [SQLSTATE 42000]
消息 8992,嚴重性 16,狀態 1,第 1 行: 請檢查目錄消息 3851,狀態 1: 在系統表 sys.sysmultiobjrefs (class=26) 中發現無效的行(class=26,depid=1,depsubid=0,indepid=3,indepsubid=0)。 [SQLSTATE 42000]
消息 8992,嚴重性 16,狀態 1,第 1 行: 請檢查目錄消息 3851,狀態 1: 在系統表 sys.syssingleobjrefs (class=60) 中發現無效的行(class=60,depid=2,depsubid=0)。 [SQLSTATE 42000]
消息 8992,嚴重性 16,狀態 1,第 1 行: 請檢查目錄消息 3851,狀態 1: 在系統表 sys.syssingleobjrefs (class=60) 中發現無效的行(class=60,depid=3,depsubid=0)。 [SQLSTATE 42000]
消息 8992,嚴重性 16,狀態 1,第 1 行: 請檢查目錄消息 3851,狀態 1: 在系統表 sys.syssingleobjrefs (class=60) 中發現無效的行(class=60,depid=4,depsubid=0)。 [SQLSTATE 42000]
消息 8992,嚴重性 16,狀態 1,第 1 行: 請檢查目錄消息 3851,狀態 1: 在系統表 sys.syssingleobjrefs (class=60) 中發現無效的行(class=60,depid=5,depsubid=0)。 [SQLSTATE 42000]
消息 8992,嚴重性 16,狀態 1,第 1 行: 請檢查目錄消息 3851,狀態 1: 在系統表 sys.sysmultiobjrefs (class=26) 中發現無效的行(class=26,depid=257,depsubid=0,indepid=3,indepsubid=0)。 [SQLSTATE 42000]
消息 8992,嚴重性 16,狀態 1,第 1 行: 請檢查目錄消息 3851,狀態 1: 在系統表 sys.sysmultiobjrefs (class=26) 中發現無效的行(class=26,depid=258,depsubid=0,indepid=3,indepsubid=0)。 [SQLSTATE 42000]
消息 8992,嚴重性 16,狀態 1,第 1 行: 請檢查目錄消息 3851,狀態 1: 在系統表 sys.sysmultiobjrefs (class=26) 中發現無效的行(class=26,depid=259,depsubid=0,indepid=3,indepsubid=0)。 [SQLSTATE 42000]
…
消息 2593,嚴重性 16,狀態 1,第 1 行: 對象 'sys.queue_messages_1035150733' 的 0 頁中有 0 行。 [SQLSTATE 01000]
消息 2536,嚴重性 16,狀態 1,第 1 行: sys.queue_messages_1067150847的 DBCC 結果。 [SQLSTATE 01000]
消息 2593,嚴重性 16,狀態 1,第 1 行: 對象 'sys.queue_messages_1067150847' 的 0 頁中有 0 行。 [SQLSTATE 01000]
消息 2536,嚴重性 16,狀態 1,第 1 行: spt_monitor的 DBCC 結果。 [SQLSTATE 01000]
對象 'spt_monitor' 的 1 頁中有 1 行。 [SQLSTATE 01000]
spt_values的 DBCC 結果。 [SQLSTATE 01000]
對象 'spt_values' 的 10 頁中有 2346 行。 [SQLSTATE 01000]
MSreplication_options的 DBCC 結果。 [SQLSTATE 01000]
對象 'MSreplication_options' 的 1 頁中有 3 行。 [SQLSTATE 01000]
CHECKDB 在數據庫 'a' 中發現 1 個分配錯誤和 10 個一致性錯誤。 [SQLSTATE 01000]
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。 [SQLSTATE 01000]
二 總結
在SQL SERVER 2005後,可以通過為作業的某個步驟開啟增強的日志記錄功能,然後通過TSQL腳本查詢msdb.dbo.sysjobsteplogs中的”log”字段,查看該作業步驟的完整輸出信息。