1. 程式人生 > 資料庫 >sql server中錯誤日誌errorlog的深入講解

sql server中錯誤日誌errorlog的深入講解

一 .概述

SQL Server 將某些系統事件和使用者定義事件記錄到 SQL Server 錯誤日誌和 Microsoft Windows 應用程式日誌中。 這兩種日誌都會自動給所有記錄事件加上時間戳。 使用 SQL Server 錯誤日誌中的資訊可以解決SQL Server的相關問題。

檢視 SQL Server 錯誤日誌可以確保程序(例如,備份和還原操作、批處理命令或其他指令碼和程序)成功完成。 此功能可用於幫助檢測任何當前或潛在的問題領域,包括自動恢復訊息(尤其是在 SQL Server 例項已停止並重新啟動時)、核心訊息或其他伺服器級錯誤訊息。

使用 SQL Server 或任何文字編輯器可以檢視 SQL Server Management Studio 錯誤日誌。預設情況下,錯誤日誌位於 Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\LOG\ERRORLOG 和 ERRORLOG.n 檔案中。例如: 我電腦win7上將sql server 2008 r2資料庫安裝在D:\Program Files目錄下,錯誤日誌路徑為 D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log

每當啟動 SQL Server 例項時,將建立新的錯誤日誌資訊,sqlserver系統自動呼叫 exec sp_cycle_errorlog 系統儲存過程,該儲存過程會關閉當前的錯誤日誌檔案,並迴圈錯誤日誌擴充套件編號來迴圈使用錯誤日誌檔案,而不必重新啟動 SQL Server例項 (區別mysql下 有四種日誌檔案,檔案會一直增長,需要管理員去清除,避免影響磁碟空間) 。通常, SQL Server 保留前六個日誌的備份,按照時間順序,依次用副檔名.1 .2… .6表示。每重啟一次服務,副檔名都會加一,最早那份會被刪除。

二. Errorlog日誌內容

2.1 日誌自動記錄的資訊大概有如下:

(1) SQL SERVER 的啟動引數,以及認證模式,記憶體分配模式。

(2) 每個資料庫是否能夠被正常開啟。如果不能,原因是什麼?

(3) 資料庫損壞相關的錯誤

(4) 資料庫備份與恢復動作記錄

(5) DBCC CHECKDB記錄

(6) 記憶體相關的錯誤和警告

(7) SQL排程出現異常時的警告。一般SERVER Hang 伺服器宕機會伴隨著有這些警告

(8) SQL I/O操作遇到長時間延遲的警告

(9) SQL在執行過程中遇到的其他級別比較高的錯誤

(10) SQL內部的訪問越界錯誤(Access Violation)

(11) SQL服務關閉時間

(12) SQL SERVER版本,以及windows和processor基本資訊。

2.2 日誌開啟跟蹤能看到的資訊

(1) 所有使用者成功或失敗的登入

(2) 死鎖及其參與者的資訊。跟蹤標誌1222 或1204

2.3 日誌不能記錄的問題

(1) 阻塞問題。只要阻塞還沒有嚴重到影響執行緒排程,日誌裡是不會體現的。

(2) 普通效能問題,超時問題。

(3) windows層面異常。

所以在檢查sqlserver 相關問題的時候,總是從error log著手,如果error log裡有一些錯誤或警告,就要確認排查,如果記錄問題的時間與軟體系統出問題時間對得上,就需要著重分析。

三 .跟蹤標誌

使用DBCC TRACEON來指定要開啟的跟蹤標記的編號,跟蹤標記用於通過控制 SQL Server 的執行方式來自定義某些特徵。 啟用的跟蹤標記將在伺服器中一直保持啟用狀態,直到執行 DBCC TRACEOFF 語句將其禁用為止。在 SQL Server 中,有兩種跟蹤標誌:會話和全域性。 會話跟蹤標誌對某個連線是有效的,只對該連線可見。 全域性跟蹤標誌在伺服器級別上進行設定,對伺服器上的每一個連線都可見。 若要確定跟蹤標記的狀態,請使用 DBCC TRACESTATUS。 若要禁用跟蹤標記,請使用 DBCC TRACEOFF。

-- 下面示例是記錄死鎖,跟蹤標誌1222 或1204,指令碼如下所示:
 --指定開啟當前會話的跟蹤標誌1222 或1204
DBCC TRACEON (1222,1204)
--以全域性方式開啟跟蹤標誌1222 或1204
DBCC TRACEON (1222,1204,-1);
-- 檢視跟蹤標誌狀態,如下圖所示
DBCC TRACESTATUS

      

 -- 以全域性方式關閉跟蹤標誌狀態
 DBCC TRACEOFF(1222,-1)

其它跟蹤標誌號可參考官方文件:

https://docs.microsoft.com/zh-cn/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql?view=sql-server-2017

四. 配置errorlog

在物件資源管理器中,展開 SQL Server 的例項,展開“管理”,右鍵單擊“SQL Server 日誌”,再單擊“配置” 如下圖所示:

4.1 限制錯誤日誌檔案在回收之前的數目

若選中此選項,將限制在錯誤日誌回收前可以建立的錯誤日誌數。 每次啟動 SQL Server 例項時都將建立新的錯誤日誌。 SQL Server 將保留前六個日誌的備份,除非選中此選項並在下面指定一個不同的最大錯誤日誌檔案數。

4.2 最大錯誤日誌檔案數

指定錯誤日誌檔案回收前建立的最大錯誤日誌檔案數。 預設值為 6,即 SQL Server 在回收備份日誌前保留的以前備份日誌的數量。

五. SQL Server 代理錯誤日誌

SQL Server 預設情況下,代理建立錯誤日誌來記錄警告和錯誤。 SQL Server 最多可以維護九個 SQL Server 代理錯誤日誌。 每個存檔日誌都有一個副檔名,指示該日誌的相對存在時間。 例如上圖,當前表示最新的存檔錯誤日誌,而編號1 表示最舊的存檔錯誤日誌。

預設情況下,執行跟蹤訊息不寫入 SQL Server 代理日誌錯誤,因為它們會將日誌填滿。 如果錯誤日誌已滿,會降低選擇和分析更嚴重的錯誤的能力。 因為日誌會增加伺服器的處理負荷,所以請務必仔細考慮是否值得將執行跟蹤訊息捕獲到錯誤日誌中。 通常,最好僅在除錯某個特定問題時捕獲所有訊息。

六.檢視errorlog

Errorlog 檔案以文字方式記錄,用任何檔案編輯器都能開啟。下面介紹二個儲存過程來過濾檢視日誌檔案。

6.1 xp_enumerrorlogs

通過xp_enumerrorlogs可以檢視錯誤日誌檔案的存檔和佔用空間大小, 預設引數是1,表示檢視sql server日誌。 引數2 表示檢視sql server 代理錯誤日誌列表。指令碼如下所示:

-- 檢視sql server日誌列表
EXEC xp_enumerrorlogs


 -- 檢視代理錯誤日誌
 EXEC xp_enumerrorlogs 2


6.2 xp_readerrorlog

通過系統儲存過程:xp_readerrorlog,能條件過濾日誌內容檢視,它一共有7個引數,分別是:
(1). 存檔編號(0~99)

(2). 日誌型別(1為SQL Server日誌,2為SQL Server Agent日誌)

(3). 查詢包含的字串

(4). 查詢包含的字串

(5). LogDate開始時間

(6). LogDate結束時間

(7). 結果排序,按LogDate排序(Desc、Asc)

例1 :檢視當前sql server錯誤日誌檔案內容。存檔編號預設值是0,日誌型別預設是1,如果要檢視當前sql server錯誤日誌檔案內容有三種寫法,指令碼如下:

EXEC xp_readerrorlog
EXEC xp_readerrorlog 0
EXEC xp_readerrorlog 0,1

例 2:檢視SQL Server日誌歷史存檔為編號1的檔案中,發生的時間為2018-10-27 19:00點 至2018-10-27 20:00之間的錯誤,排序方式為時間的倒排序,為了滿足上面的要求,指令碼如下:

EXEC xp_readerrorlog 1,1,null,'2018-10-27 19:00','2018-10-27 20:00','DESC'

例3: 檢視當前SQL Server日誌檔案中,錯誤內容裡面包含字串:“Login failed for user 'sa'” 的錯誤,指令碼如下:

EXEC xp_readerrorlog 0,'Login failed for user ''sa'''

收縮Errorlog檔案

生產伺服器上的ErrorLog檔案有時候會碰到檔案很大的情況,尤其將登入認證情況記錄到錯誤日誌的情況之下,此時使用SQL Server Management Studio或者文字編輯器檢視錯誤日誌檢視的時候速度會是個問題,對於這種情況,可以在不重新啟動伺服器的情況下,通過儲存過程sp_cycle_errorlog來生成新的日誌檔案,並迴圈錯誤日誌擴充套件編號,就如同重新啟動服務時候一樣。除了 Execute sp_cycle_errorlog之外,也可以使用DBCC ERRORLOG來實現同樣的功能。在實際操作中,也可以通過建立一個Job定時去執行該儲存過程,這樣將日誌檔案大小控制在合理的範圍之內。

注意事項:舊的 ErrorLog 檔案中的資料將被覆蓋!如果必須儲存舊的 ErrorLog 檔案中的資料,則可將這些舊的 ErrorLog 檔案複製到某個外部儲存介質中。

Exec('DBCC ErrorLog') 或 exec sp_cycle_errorlog,或者可以通過以下命令,將sp 放在Job中定期執行。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支援。