MS SQL的日誌信息/日誌記錄,可能對你來講,既熟悉又陌生,熟悉是由於你可能一直都在使用,查看、關注一些日誌信息/記錄,例如,做業歷史記錄;陌生是由於你可能從不關注日誌信息/記錄的管理,這裏我一直用日誌信息/記錄這個詞,而沒有用日誌文件這個詞來闡述,是想讓你們把它和事務日誌文件(ldf)區分開來,網上你用日誌文件作搜索關鍵詞,可能搜出來的都是事務日誌相關的信息。其實它真的也叫日誌文件,這篇文章我大概從日誌記錄分類、如何查看日誌記錄、日誌記錄的位置、日誌記錄的設置、爲何錯誤日誌會暴增、如何清除日誌記錄等方面來說述。html
日誌記錄分類sql
按日誌文件查看器,習慣將錯誤日誌歸爲SQL SERVER、 SQL SERVER 代理, Windows應用程序日誌,數據庫郵件等四類錯誤日誌記錄。若是還考慮維護計劃、遠程維護計劃、做業歷史記錄日誌信息,總共是7類日誌信息文件。數據庫
其中Windows應用程序日誌類型又分爲系統日誌(System)、安全日誌(Security)、應用程序日誌(Application), PatchLink日誌等幾種,我在服務器(Windows Server 2008 R2 Standard)上打開SSMS,竟然發現又多了HardwareEvents, Internet Explorer、Windows PowerShell等日誌文件。這些都是系統的日誌文件。你沒必要太糾結有多少種。安全
日誌記錄位置服務器
SQL SERVER日誌記錄、 SQL SERVER代理記錄的位置以下所示, SQL SERVER日誌記錄通常存儲在ERRORLOG.n(n爲數字)文件裏, SQL SERVER代理日誌記錄位於SQLAGENT.n這類的文件裏。固然這跟數據庫的版本也有關係:post
版本性能 |
路徑spa |
SQL SERVER 2005.net |
Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\LOG3d |
SQL SERVER 2008 |
Program Files\Microsoft SQL Server\MSSQL10.實例名\MSSQL\LOG |
SQL SERVER 2008 R2 |
Program Files\Microsoft SQL Server\MSSQL10_50.實例名\MSSQL\LOG |
SQL SERVER 2005,默認狀況下,錯誤日誌位於 Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\LOG\ERRORLOG 和 ERRORLOG.n 文件中。其中MSSQL.n的區分爲:
MSSQL.1:SQLSERVER
MSSQL.2:SSAS
MSSQL.3:SQLExpress
MSSQL.4:SSRS
因此,通常狀況下,你只須要關注MSSSQL.1目錄下的日誌文件
那麼,數據庫郵件日誌記錄位於哪裏呢?做業歷史記錄日誌信息、Windows應用程序日誌又位於哪裏呢?是否是從沒考慮過這些?
數據庫郵件日誌記錄信息能夠從視圖msdb.dbo.sysmail_event_log查詢獲得,實質保存在[dbo].[sysmail_log]表裏面。
做業歷史記錄日誌信息都保存在msdb.dbo.sysjobhistory的表裏面,其中run_status字段表明做業執行狀態
0 = 失敗
1 = 成功
2 = 重試
3 = 已取消
4= 正在進行
全部Windows應用程序日誌其實都位於同一位置%SystemRoot%\System32\Winevt\Log。像Application日誌文件位於%SystemRoot%\System32\Winevt\Logs\Application.evtx,以下所示,
查看日誌記錄
查看日誌記錄能夠確保進程(例如,備份和還原操做、批處理命令或其餘腳本和進程)成功完成。此功能可用於幫助檢測任何當前或潛在的問題領域,包括自動恢復消息(尤爲是在 SQL Server 實例已中止並從新啓動時)、內核消息或其餘服務器級錯誤消息。
方式1: 查看錯誤日誌文件
對SQL SERVER、SQL SERVER AGENT日誌記錄信息,你能夠直接去log目錄下找到ERRORLOG、SQLAGENT日誌文件,直接打開查看;而像Windows應用程序日誌記錄,去到%SystemRoot%\System32\Winevt\Log目錄,找到對應的日誌文件,直接打開查看。
方式2:經過SSMS來查看日誌記錄
查看與常規 SQL Server 活動相關的日誌
查看與做業相關的日誌
查看與維護計劃相關的日誌
方式3:用腳本查看
3.1 對於SQL SERVER日誌文件,能夠經過下面腳本查看:
--查看日誌文件的存檔號
EXEC master.dbo.sp_enumerrorlogs
用這個命令能夠查看日誌文件的大小,這個很是有用,你能夠把大小異常的文件給排查出來。
--根據存檔號查看該檔日誌內容
EXEC master.dbo.xp_readerrorlog 1
--根據job_id查看SQL SERVER日誌記錄
SELECT * FROM msdb.dbo.sysjobhistory WHERE job_id='36E9232B-CD5B-4646-9BED-B8242090FFF9'
3.2 對於做業歷史記錄日誌信息,你既能夠經過下面存儲過程查看,也能夠直接查詢對應的表。
例如,我要查看做業「ServerDiskCapacityCheck」的歷史記錄
3.3數據庫郵件記錄查看
SELECT * FROM msdb.dbo.sysmail_event_log;
日誌記錄管理
設置最大錯誤日誌文件數
1:在對象資源管理器中,鏈接到 SQL Server 數據庫引擎實例,再展開該實例。
2:在」管理「選項,選擇」SQL SERVER日誌」,單擊右鍵選擇配置。 順便說一下,不少網上資料說,SQL SERVER默認保留前6個日誌文件,可是我查看了SQL SERVER 2005和SQL SERVER 2008,都是默認保留30個,有時候須要本身去驗證、實驗,不要人人亦云。估計這個說法是SQL SERVER 2000時的配置了。
固然,你也能夠用命令設置:
USE [master]
GO
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'NumErrorLogs', REG_DWORD, 10
GO
設置錯誤日誌文件存放目錄
1:在對象資源管理器中,鏈接到 SQL Server 數據庫引擎實例,再展開該實例。
2:展開「SQL SERVER」代理。
3:右鍵單擊」錯誤日誌「,而後選擇配置選項,以下所示:
4:在」錯誤日誌文件「選項中,輸入新的路徑和文件名,或使用瀏覽(...)按鈕進行查找。從新啓動SQL SERVER代理服務後,SQL SERVER代理才寫入到新的日誌文件。
設置做業歷史記錄日誌
爲何錯誤日誌文件暴增?
這裏我說的不只僅指某個錯誤日誌記錄文件暴增,也指目錄Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\LOG所佔空間暴增,若是你平時都不關注這些錯誤日誌,也從不維護錯誤日誌記錄文件,那麼頗有可能它所佔的空間很是大,大到讓你吃驚的地步。幾十G的我也見過,那麼具體緣由可能有如下種(若是你們還碰到過其它狀況,歡迎補充):
1:SQL 內部錯誤的時候會產生很是多的DUMP文件,以下所示
2:高可用的數據庫服務器可能不多停機,而你又沒有按期清理、清空這些錯誤日誌信息,那麼ERRORLOG.n/SQLAGENT.n文件增加會很是大。這樣對於DBA使用錯誤日誌查找信息就會比較困難,並且日誌大了加載、寫入之後性能也會受到影響。
3:其實還有一個狀況,若是你數據庫IP地址曝露在外網時,會遭到大量嘗試登陸sa的攻擊,也會產生大量的審覈失敗日誌信息。
4:就是一些SQL SERVER PROFILE文件沒有刪除,固然,這個本質跟日誌文件暴增沒啥關係,可是跟LOG文件夾的大小有些關係。
如何清理錯誤日誌:
對於SQL SERVER日誌、SQL SERVER AGENT日誌記錄,微軟提供了一個存儲過程sp_cycle_errorlog能夠實現日誌的循環。 這個存儲過程的做用是關閉當前的錯誤日誌文件,並循環錯誤日誌擴展編號(就像從新啓動服務器)。每次啓動SQL Server 時,都會將當前錯誤日誌重命名爲errorlog.1;errorlog.1 變爲errorlog.2,errorlog.2 變爲errorlog.3,依次類推。最後一個errorlog.n將會被刪除。sp_cycle_errorlog 可以使您循環訪問錯誤日誌文件,而沒必要中止和啓動服務器。
另外:日誌過大說明你沒有截斷錯誤日誌,錯誤日誌是能夠截斷的,進入你的數據庫輸入DBCC ERRORLOG
每執行一次,當前的錯誤日誌退出,讓後創建新的錯誤日誌,你只能刪除 ERRORLOGn的錯誤日誌沒有號碼的是正在使用的日誌,刪除會報錯,若是它比較大,就DBCC ERRORLOG,然後他會變成ERRORLOG+編號,你就能夠刪除了,另外建議你把這些ERRORLOG 放到其餘盤符,比較好管理。
對於 Windows應用程序日誌,通常都有默認的大小設置,以及按須要覆蓋。這些配置通常也是最優的配置。因此這塊除非你有特殊需求,不然不用你操心。
對於郵件日誌記錄,存儲過程sysmail_delete_log_sp提供從數據庫郵件日誌中刪除事件。刪除日誌中的全部事件或刪除符合某一日期或類型條件的那些事件 sysmail_delete_log_sp [ [ @logged_before = ] 'logged_before' ] [, [ @event_type = ] 'event_type' ] |
刪除參數指定的全部 SQL Server 代理做業步驟日誌。使用此存儲過程可維護 msdb 數據庫中的 sysjobstepslogs 表。
sp_delete_jobsteplog { [ @job_id = ] 'job_id' | [ @job_name = ] 'job_name' }
[ , [ @step_id = ] step_id | [ @step_name = ] 'step_name' ]
[ , [ @older_than = ] 'date' ]
[ , [ @larger_than = ] 'size_in_bytes' ]
刪除做業的歷史記錄
刪除特定做業YourSQLDba_LogBackups的歷史記錄。
USE msdb ;
GO
EXEC dbo.sp_purge_jobhistory
@job_name = N'YourSQLDba_LogBackups' ;
GO
如下示例將不帶參數執行此過程以刪除全部的歷史記錄。
USE msdb ;
GO
EXEC dbo.sp_purge_jobhistory ;
GO
刪除參數指定的全部 SQL Server 代理做業步驟日誌。使用此存儲過程可維護 msdb 數據庫中的 sysjobstepslogs 表。若是你想好好維護日誌記錄,那麼你能夠整合上面的思想方法到一個存儲過程,而後配置一個做業來按期清理日誌記錄,接下來咱們看看YourSQLDba的方法吧
參考資料:
http://msdn.microsoft.com/zh-cn/library/ms187885(v=sql.105).aspx
http://www.jb51.net/article/26988.htm
http://groundsel.itpub.net/post/1284/494264
http://www.canway.net/Lists/CanwayOriginalArticels/DispForm.aspx?ID=291
http://technet.microsoft.com/zh-cn/library/ms191202(v=SQL.105).aspx
http://support.microsoft.com/kb/157804/zh-cn
http://support.microsoft.com/kb/115519/zh-cn
http://blog.csdn.net/smithliu328/article/details/7843724
http://blog.csdn.net/claro/article/details/5660524
http://www.cnblogs.com/lyhabc/archive/2013/02/12/2910623.html